Това, което опитвате, е правилният синтаксис, доколкото знам, но във всеки случай няма да работи, тъй като типът на връщане е потребителски дефиниран, както подозирате.
Ето пример с вградена конвейерна функция. Извикването му локално работи, разбира се:
SELECT * FROM TABLE(dbms_xplan.display_cursor('a',1,'ALL'));
Връща:
SQL_ID: a, child number: 1 cannot be found
Извикването му през връзка към база данни:
SELECT * FROM TABLE([email protected]('a',1,'ALL'));
не успява с тази грешка:
ORA-30626: function/procedure parameters of remote object types are not supported
Вероятно получавате ORA-904, защото връзката отива към конкретна схема, която няма достъп до пакета. Но във всеки случай това няма да работи, дори ако дефинирате идентичен тип със същото име във вашата локална схема, защото те все още не са от същия тип от гледна точка на Oracle.
Разбира се, можете да направите заявка за изглед от разстояние, така че ако има добре дефиниран набор от възможни параметри, можете да създадете един изглед за всяка комбинация от параметри и след това да го заявите, напр.:
CREATE VIEW display_cursor_a_1_all AS
SELECT * FROM TABLE(dbms_xplan.display_cursor('a',1,'ALL'))
;
Ако обхватът на възможните стойности на параметрите е твърде голям, можете да създадете процедура, която създава необходимия изглед динамично при даден набор от параметри. След това имате процес в две стъпки всеки път, когато искате да изпълните заявката:
EXECUTE [email protected](parameters)
SELECT * FROM [email protected];
След това трябва да помислите дали няколко сесии могат да извикат това паралелно и ако е така, как да им попречите да стъпват една върху друга.