Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Aufrufen einer gespeicherten Funktion (die ein Array eines benutzerdefinierten Typs zurückgibt) in Oracle über einen Datenbanklink

Was Sie versuchen, ist meines Wissens nach die richtige Syntax, aber auf jeden Fall würde es nicht funktionieren, da der Rückgabetyp benutzerdefiniert ist, wie Sie vermuten.

Hier ist ein Beispiel mit einer integrierten Pipeline-Funktion. Der lokale Aufruf funktioniert natürlich:

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

Rückgabe:

SQL_ID: a, child number: 1 cannot be found 

Aufruf über einen Datenbanklink:

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

schlägt mit diesem Fehler fehl:

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

Möglicherweise erhalten Sie den ORA-904, weil der Link zu einem bestimmten Schema führt, das keinen Zugriff auf das Paket hat. Aber auf jeden Fall wird das nicht funktionieren, selbst wenn Sie in Ihrem lokalen Schema einen identischen Typ mit demselben Namen definieren, da es aus Sicht von Oracle immer noch nicht derselbe Typ ist.

Sie können natürlich eine Ansicht aus der Ferne abfragen. Wenn es also einen gut definierten Satz möglicher Parameter gibt, können Sie eine Ansicht für jede Parameterkombination erstellen und diese dann abfragen, z. B.:

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

Wenn der Bereich möglicher Parameterwerte zu groß ist, könnten Sie eine Prozedur erstellen, die die benötigte Ansicht dynamisch erstellt, wenn ein beliebiger Satz von Parametern gegeben ist. Dann haben Sie jedes Mal, wenn Sie die Abfrage ausführen möchten, einen zweistufigen Prozess:

EXECUTE  [email protected](parameters)

SELECT * FROM [email protected];

Sie müssen sich dann überlegen, ob mehrere Sessions dies möglicherweise parallel aufrufen und wenn ja, wie Sie verhindern können, dass sie sich gegenseitig übertreten.