La mejor manera de manejar LOB en bases de datos distribuidas de Oracle
-
09-06-2019 - |
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?
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.