2008-09-01 8 views
11

Si crea una dblink Oracle no se puede acceder directamente a las columnas LOB en las tablas de destino.mejor manera de manejar LOB en las bases de datos Oracle distribuidas

Por ejemplo, se crea un dblink con:

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

Después de esto puede hacer cosas como:

select column_a, column_b 
from [email protected]_LINK 

Excepto si la columna es un LOB, a continuación, se obtiene el error:

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

Esto es a documented restriction.

La misma página sugiere hacer salir los valores en una tabla local, pero eso es ... un poco desordenado:

CREATE TABLE tmp_hello 
AS SELECT column_a 
from [email protected]_LINK 

¿Alguna otra idea?

Respuesta

4

Sí, es desordenado, no puedo pensar en una manera de evitarlo sin embargo.
Usted puede ocultar algunos de los desorden desde el cliente al poner la creación de la tabla temporal en un procedimiento almacenado (y el uso de "ejecución inmediata" para crear que la tabla)
Una cosa que hay que estar atento a que sobra tablas temporales (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 eliminar las tablas restantes.

0

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

0

En este caso específico puede la única forma en que los dos sistemas se pueden comunicar está utilizando el dblink.

Además, la solución de mesa no es tan terrible, es sólo un poco incómodo de tener que "caché" los datos de mi lado de la dblink.

1

Se podría utilizar vistas materalized para manejar toda la gestión "caché". Está no es perfecto, pero funciona en la mayoría de los casos :)

8

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

SELECT (select column_b from [email protected]_LINK) AS column_b FROM DUAL 
+3

Eso funciona como un encanto! La mejor respuesta en internet! – gabrjan

+0

@ user2015502 ¿Has probado esto en una fórmula de Hibernate? responde siempre como tabla no encontrada y tengo mi consulta trabajando en el desarrollador – eduyayo

+0

Gracias por la consulta, pero no funciona para mí. Lo que obtengo es un BLOB con tamaño 0. Este método también necesita la selección interna para filtrar: 'subquery de una sola fila devuelve más de una fila'. – detoro84

0

Para los datos de la consulta, la solución de user2015502 es el más inteligente . Si desea insertar o actualizar LOB AT la base de datos remota (insertar en xxx @ yyy ...) puede usar SQL dinámico para eso. Ver my solution here:

Cuestiones relacionadas