Насколько я знаю, вы пытаетесь использовать правильный синтаксис, но в любом случае он не будет работать из-за определяемого пользователем типа возвращаемого значения, как вы подозреваете.
Вот пример свстроенная конвейерная функция.Вызов локально работает, конечно:
SELECT * FROM TABLE(dbms_xplan.display_cursor('a',1,'ALL'));
Возвращает:
SQL_ID: a, child number: 1 cannot be found
Вызов по ссылке базы данных:
SELECT * FROM TABLE(dbms_xplan.display_cursor@core('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 package.create_view@remote(parameters)
SELECT * FROM created_view@remote;
Затем вы должны подумать о том, могут ли несколько сеансов вызывать это параллельно, и если да, то как предотвратить их включениедруг друга.