Pregunta

Si crea un enlace db de Oracle, no podrá acceder directamente a las columnas LOB en las tablas de destino.

Por ejemplo, creas un dblink con:

create database link TEST_LINK 
  connect to TARGETUSER IDENTIFIED BY password using 'DATABASESID';

Después de esto puedes hacer cosas como:

select column_a, column_b 
from data_user.sample_table@TEST_LINK

Excepto si la columna es un LOB, obtendrá el error:

ORA-22992: cannot use LOB locators selected from remote tables

Esto es una restricción documentada.

La misma página sugiere que busques los valores en una tabla local, pero eso es...algo desordenado:

CREATE TABLE tmp_hello 
AS SELECT column_a 
from data_user.sample_table@TEST_LINK

¿Alguna otra idea?

¿Fue útil?

Solución

Sí, es complicado, aunque no se me ocurre una forma de evitarlo.
Puede ocultar parte del desorden al cliente colocando la creación de la tabla temporal en un procedimiento almacenado (y usando "ejecutar inmediatamente" para crear la tabla)
Una cosa que deberá tener en cuenta son las tablas temporales sobrantes (si algo falla a mitad de una sesión, antes de que haya tenido tiempo de limpiarlo): puede programar un trabajo de Oracle para que se ejecute periódicamente y elimine las tablas sobrantes. .

Otros consejos

La mejor solución es utilizar una consulta como la siguiente, donde column_b es un BLOB:

SELECT (select column_b from sample_table@TEST_LINK) AS column_b FROM DUAL

Podría utilizar vistas materializadas para manejar toda la administración del "caché".No es perfecto pero funciona en la mayoría de los casos :)

Para consultas de datos, la solución de user2015502 es la más inteligente.Si desea insertar o actualizar LOB EN la base de datos remota (insertar en xxx@yyy...) puede usar SQL dinámico fácilmente para eso.Ver mi solución aquí:

¿Tiene algún escenario específico en mente?Por ejemplo, si el LOB contiene archivos y usted está en la intranet de una empresa, tal vez pueda escribir un procedimiento almacenado para extraer los archivos a un directorio conocido en la red y acceder a ellos desde allí.

En este caso específico, la única forma en que los dos sistemas pueden comunicarse es mediante dblink.

Además, la solución de la tabla no es tan terrible, simplemente es complicado tener que "almacenar en caché" los datos en mi lado del dblink.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top