Вызов хранимой функции (которая возвращает массив определенного пользователем типа) в Oracle через ссылку на базу данных - PullRequest
3 голосов
/ 30 августа 2011

Обычно я вызываю свою функцию так:

SELECT * 
FROM TABLE(
  package_name.function(parameters)
)

Я пытаюсь вызвать эту функцию через ссылку на базу данных.Моя интуиция заключается в том, что следующий синтаксис является правильным, но я не получил его на работу:

SELECT * 
FROM TABLE(
  package_name.function@DBLINK(parameters)
)

> ORA-00904: "PACKAGE_NAME"."FUNCTION": invalid identifier

Я пытался перемещаться по ссылке в базе данных безрезультатно.Я попытался поместить его после списка параметров, после последней круглой скобки, после имени пакета ... Я также попробовал все вышеупомянутые перестановки, включая имя схемы перед именем пакета.У меня заканчиваются идеи.

Это оракул 10г.Я подозреваю, что проблема может заключаться в том, что возвращаемый тип функции не определен в схеме, в которой я ее вызываю, но мне кажется, что в этом случае я должен получить другую ошибку.

Спасибо за вашу помощь!

1 Ответ

3 голосов
/ 30 августа 2011

Насколько я знаю, вы пытаетесь использовать правильный синтаксис, но в любом случае он не будет работать из-за определяемого пользователем типа возвращаемого значения, как вы подозреваете.

Вот пример свстроенная конвейерная функция.Вызов локально работает, конечно:

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;

Затем вы должны подумать о том, могут ли несколько сеансов вызывать это параллельно, и если да, то как предотвратить их включениедруг друга.

...