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

Kaldning af en lagret funktion (der returnerer et array af en brugerdefineret type) i oracle på tværs af et databaselink

Det, du prøver, er den korrekte syntaks, så vidt jeg ved, men under alle omstændigheder ville det ikke fungere, da returtypen er brugerdefineret, som du har mistanke om.

Her er et eksempel med en indbygget pipeline-funktion. At kalde det lokalt virker selvfølgelig:

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

Returnerer:

SQL_ID: a, child number: 1 cannot be found 

Kalder det over et databaselink:

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

fejler med denne fejl:

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

Muligvis får du ORA-904, fordi linket går til et specifikt skema, der ikke har adgang til pakken. Men under alle omstændigheder vil dette ikke virke, selvom du definerer en identisk type med samme navn i dit lokale skema, fordi de stadig ikke er den samme type fra Oracles synspunkt.

Du kan selvfølgelig forespørge en visning eksternt, så hvis der er et veldefineret sæt af mulige parametre, kan du oprette en visning for hver parameterkombination og derefter forespørge om det, f.eks.:

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

Hvis intervallet af mulige parameterværdier er for stort, kan du oprette en procedure, der opretter den nødvendige visning dynamisk givet ethvert sæt parametre. Så har du en to-trins proces, hver gang du vil udføre forespørgslen:

EXECUTE  [email protected](parameters)

SELECT * FROM [email protected];

Du skal så tænke over, om flere sessioner kan kalde dette parallelt, og i så fald, hvordan du forhindrer dem i at træde på hinanden.




  1. Oracle SID og tjenestenavn; forbindelsesproblemer

  2. Sådan undgår du at indsætte duplikerede poster i MySQL

  3. Sådan installeres ODP.NET 2.111 og ODP.NET 4.112 på den samme maskine side om side, mens begge peger på den samme databaseserver

  4. Spring Docker container kan ikke få adgang til Postgres Docker container