Pregunta

Tengo dos esquemas: A y B (Oracle 9). En la A hay un enlace doble a B. En la B hay un paquete, al que llamo desde A. Los procedimientos en el paquete B pueden devolver resultados de recuento variables y creo que devolver una colección es una mejor manera por este motivo.

create type B.tr_rad as object (
  name     varchar2(64)
 ,code     number
 ,vendor   number
 ,val      varchar2(255)
 ,num      number
);

create type B.tt_rad as varray(256) of B.tr_rad;

Pero desde un esquema no puedo usar el tipo tt_rad porque no se admite el uso de tipos SQL por dblink. DBMS_SQL no es compatible con cursores. Crear tipos con el mismo OID es imposible.

Creo usar tablas temporales. Pero, en primer lugar, no es tan bueno (después de que la función remota devuelve el valor, el lado que llama debe seleccionar la colección de la tabla remota). Y se teme una ralentización del trabajo con tablas temporales.

¿Quizás quién conoce la interacción alternativa?

¿Fue útil?

Solución

He tenido problemas similares en el pasado. Luego llegué a la conclusión de que, fundamentalmente, los enlaces db de Oracle están "rotos". para cualquier cosa que no sean tipos SQL simples (especialmente UDT, CLOBS puede tener problemas, XMLType también). Si puede hacer que la solución OID funcione, buena suerte.

La solución a la que recurrí fue utilizar un procedimiento almacenado en Java, en lugar del DB Link.

Características del procedimiento almacenado de Java:

  1. Puede devolver un " conjunto rico de tipos " ;, casi todos los tipos complejos (UDT, tablas / arrays / varrays) vea Documentación en línea de Oracle para más detalles. Oracle hace un trabajo mucho mejor al ordenar tipos complejos (o ricos) desde Java que desde un DBLink.
  2. Java almacenado puede adquirir la "conexión predeterminada" (se ejecuta en la misma sesión que la conexión SQL a la base de datos, sin problemas de autenticación).
  3. Java almacenado llama al proceso PL / SQL en la base de datos remota, y la capa JDBC de Java realiza la clasificación desde la base de datos remota.
  4. Java almacena paquetes de resultados y devuelve los resultados a la capa SQL o PL / SQL.

Es un poco de trabajo, pero si tienes un poco de Java, deberías poder "cortar y pegar". una solución conjunta de la documentación y muestra de Oracle.

Espero que esto ayude.

Otros consejos

Una interacción alternativa es tener una base de datos con esquemas A y B en lugar de dos bases de datos con un enlace de base de datos.

Mi solución. En el lado B creo una tabla temporal como el registro de la colección. En el lado A tengo un contenedor DBMS_SQL que llama al procedimiento sobre dblink. Este procedimiento escribe la recopilación de resultados en la tabla temporal. Después de completar con éxito el procedimiento remoto, selecciono los resultados de la tabla temporal remota y lo transformo al tipo de colección local.

Limitaciones 1. la necesidad de sincronización permanente de objetos. 2. imposibilidad de usar el procedimiento del lado A (que se llama procedimiento remoto) en la consulta SQL. 3. la complejidad del uso.

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