Melhor maneira de lidar com LOBs em bancos de dados distribuídos Oracle
-
09-06-2019 - |
Pergunta
Se você criar um dblink Oracle, não poderá acessar diretamente as colunas LOB nas tabelas de destino.
Por exemplo, você cria um dblink com:
create database link TEST_LINK
connect to TARGETUSER IDENTIFIED BY password using 'DATABASESID';
Depois disso você pode fazer coisas como:
select column_a, column_b
from data_user.sample_table@TEST_LINK
Exceto se a coluna for um LOB, você receberá o erro:
ORA-22992: cannot use LOB locators selected from remote tables
Isso é uma restrição documentada.
A mesma página sugere que você busque os valores em uma tabela local, mas isso é...meio bagunçado:
CREATE TABLE tmp_hello
AS SELECT column_a
from data_user.sample_table@TEST_LINK
Alguma outra ideia?
Solução
Sim, é uma bagunça, mas não consigo pensar em uma maneira de evitá-lo.
Você poderia esconder um pouco da bagunça do cliente colocando a criação da tabela temporária em um procedimento armazenado (e usando "executar imediato" para criar a tabela)
Uma coisa que você precisa observar são as tabelas temporárias que sobraram (caso algo falhe no meio de uma sessão, antes que você tenha tempo de limpá-la) - você pode agendar um trabalho oracle para ser executado periodicamente e remover quaisquer sobras tabelas .
Outras dicas
A melhor solução usando uma consulta conforme abaixo, onde column_b é um BLOB:
SELECT (select column_b from sample_table@TEST_LINK) AS column_b FROM DUAL
Você poderia usar visualizações materializadas para lidar com todo o gerenciamento de "cache".Não é perfeito, mas funciona na maioria dos casos :)
Para consulta de dados, a solução user2015502 é a mais inteligente.Se você deseja inserir ou atualizar LOBs NO no banco de dados remoto (insira em xxx@yyy ...), você pode facilmente usar SQL dinâmico para isso.Ver minha solução aqui:
Você tem um cenário específico em mente?Por exemplo, se o LOB contém arquivos e você está na intranet de uma empresa, talvez você possa escrever um procedimento armazenado para extrair os arquivos para um diretório conhecido na rede e acessá-los a partir daí.
Neste caso específico, a única maneira de os dois sistemas se comunicarem é usando o dblink.
Além disso, a solução da tabela não é tão terrível, é apenas complicado ter que "armazenar em cache" os dados do meu lado do dblink.