sql >> Databasteknik >  >> RDS >> Oracle

Anropa en lagrad funktion (som returnerar en array av en användardefinierad typ) i oracle över en databaslänk

Det du försöker är rätt syntax så vitt jag vet, men det skulle i alla fall inte fungera på grund av att returtypen är användardefinierad, som du misstänker.

Här är ett exempel med en inbyggd pipelined funktion. Att kalla det lokalt fungerar förstås:

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

Returnerar:

SQL_ID: a, child number: 1 cannot be found 

Anropar det via en databaslänk:

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

misslyckas med detta fel:

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

Möjligen får du ORA-904 eftersom länken går till ett specifikt schema som inte har tillgång till paketet. Men i alla fall kommer detta inte att fungera, även om du definierar en identisk typ med samma namn i ditt lokala schema, eftersom de fortfarande inte är samma typ ur Oracles synvinkel.

Du kan naturligtvis förfråga en vy på distans, så om det finns en väldefinierad uppsättning möjliga parametrar kan du skapa en vy för varje parameterkombination och sedan fråga efter det, t.ex.:

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

Om intervallet av möjliga parametervärden är för stort kan du skapa en procedur som skapar den nödvändiga vyn dynamiskt givet valfri uppsättning parametrar. Sedan har du en tvåstegsprocess varje gång du vill köra frågan:

EXECUTE  [email protected](parameters)

SELECT * FROM [email protected];

Du måste sedan tänka på om flera sessioner kan kalla detta parallellt och i så fall hur du kan förhindra att de trampar på varandra.




  1. Från lagrad procedur, returnera OUT-parameter &OUT-markör &analysresultat (Oracle)

  2. Infoga i MySQL från PHP (jQuery/AJAX)

  3. startar postgresql och pgadmin i Windows utan installation

  4. Jquery stjärnklassificering handledning med php och mysql