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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top