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.