Oracle
 sql >> Database >  >> RDS >> Oracle

Chiamare una funzione memorizzata (che restituisce una matrice di un tipo definito dall'utente) in Oracle attraverso un collegamento al database

Quello che stai provando è la sintassi corretta per quanto ne so, ma in ogni caso non funzionerebbe perché il tipo restituito è definito dall'utente, come sospetti.

Ecco un esempio con una funzione pipeline incorporata. Chiamarlo localmente funziona, ovviamente:

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

Resi:

SQL_ID: a, child number: 1 cannot be found 

Chiamandolo tramite un collegamento al database:

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

non riesce con questo errore:

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

Probabilmente stai ricevendo ORA-904 perché il collegamento va a uno schema specifico che non ha accesso al pacchetto. Ma in ogni caso, questo non funzionerà, anche se definisci un tipo identico con lo stesso nome nel tuo schema locale, perché non sono ancora lo stesso tipo dal punto di vista di Oracle.

Ovviamente puoi interrogare una vista in remoto, quindi se c'è un insieme ben definito di parametri possibili, puoi creare una vista per ogni combinazione di parametri e quindi interrogarla, ad esempio:

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

Se l'intervallo dei possibili valori dei parametri è troppo ampio, è possibile creare una procedura che crei la vista necessaria in modo dinamico in base a qualsiasi insieme di parametri. Quindi hai un processo in due passaggi ogni volta che vuoi eseguire la query:

EXECUTE  [email protected](parameters)

SELECT * FROM [email protected];

Devi quindi pensare se più sessioni potrebbero chiamarlo in parallelo e, in tal caso, come impedire che si calpestino a vicenda.