sql >> Base de Datos >  >> RDS >> Oracle

Llamar a una función almacenada (que devuelve una matriz de un tipo definido por el usuario) en Oracle a través de un enlace de base de datos

Lo que está intentando es la sintaxis correcta hasta donde yo sé, pero en cualquier caso no funcionaría debido a que el tipo de retorno está definido por el usuario, como sospecha.

Aquí hay un ejemplo con una función canalizada incorporada. Llamarlo localmente funciona, por supuesto:

SELECT * FROM TABLE(dbms_xplan.display_cursor('a',1,'ALL'));

Devoluciones:

SQL_ID: a, child number: 1 cannot be found 

Llamándolo a través de un enlace de base de datos:

SELECT * FROM TABLE([email protected]('a',1,'ALL'));

falla con este error:

ORA-30626: function/procedure parameters of remote object types are not supported

Posiblemente esté obteniendo el ORA-904 porque el enlace va a un esquema específico que no tiene acceso al paquete. Pero en cualquier caso, esto no funcionará, incluso si define un tipo idéntico con el mismo nombre en su esquema local, porque todavía no son del mismo tipo desde el punto de vista de Oracle.

Por supuesto, puede consultar una vista de forma remota, por lo que si hay un conjunto bien definido de posibles parámetros, puede crear una vista para cada combinación de parámetros y luego consultar eso, por ejemplo:

CREATE VIEW display_cursor_a_1_all AS
  SELECT * FROM TABLE(dbms_xplan.display_cursor('a',1,'ALL'))
  ;

Si el rango de valores de parámetros posibles es demasiado grande, puede crear un procedimiento que cree la vista necesaria dinámicamente dado cualquier conjunto de parámetros. Luego, tiene un proceso de dos pasos cada vez que desea ejecutar la consulta:

EXECUTE  [email protected](parameters)

SELECT * FROM [email protected];

Luego, debe pensar si varias sesiones pueden llamar esto en paralelo y, de ser así, cómo evitar que se pisen entre sí.