Oracle
 sql >> Base de données >  >> RDS >> Oracle

Appel d'une fonction stockée (qui renvoie un tableau d'un type défini par l'utilisateur) dans Oracle via un lien de base de données

Ce que vous essayez est la syntaxe correcte pour autant que je sache, mais dans tous les cas, cela ne fonctionnerait pas car le type de retour est défini par l'utilisateur, comme vous le soupçonnez.

Voici un exemple avec une fonction pipeline intégrée. L'appeler localement fonctionne, bien sûr :

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

Renvoie :

SQL_ID: a, child number: 1 cannot be found 

En l'appelant via un lien de base de données :

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

échoue avec cette erreur :

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

Vous obtenez peut-être l'ORA-904 parce que le lien mène à un schéma spécifique qui n'a pas accès au package. Mais dans tous les cas, cela ne fonctionnera pas, même si vous définissez un type identique avec le même nom dans votre schéma local, car ils ne sont toujours pas du même type du point de vue d'Oracle.

Vous pouvez bien sûr interroger une vue à distance, donc s'il existe un ensemble bien défini de paramètres possibles, vous pouvez créer une vue pour chaque combinaison de paramètres, puis l'interroger, par exemple :

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

Si la plage de valeurs de paramètres possibles est trop grande, vous pouvez créer une procédure qui crée dynamiquement la vue nécessaire en fonction de n'importe quel ensemble de paramètres. Ensuite, vous avez un processus en deux étapes chaque fois que vous souhaitez exécuter la requête :

EXECUTE  [email protected](parameters)

SELECT * FROM [email protected];

Vous devez ensuite vous demander si plusieurs sessions pourraient appeler cela en parallèle et, le cas échéant, comment les empêcher de se marcher dessus.