PLS-00231: функция не может использоваться в SQL

Вопрос:Я хочу проверить свою конвейерную функцию без создания пакета. Следующий пример упрощен: DECLARE FUNCTION testDC RETURN NCOL PIPELINED IS BEGIN PIPE ROW(5); END; BEGIN FOR cur IN (select * from table (testDC())) LOOP dbms_output.put_line('--> '); END LOOP; END; Но я получаю эту ошибку: ORA-06550: строка 7, столбец 7: PLS-00231: функция TESTDC не может использоваться в

Вопрос:

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

DECLARE FUNCTION testDC RETURN NCOL PIPELINED IS BEGIN PIPE ROW(5); END; BEGIN FOR cur IN (select * from table (testDC())) LOOP dbms_output.put_line(‘—> ‘); END LOOP; END;

Но я получаю эту ошибку:

ORA-06550: строка 7, столбец 7: PLS-00231: функция TESTDC не может использоваться в SQL
ORA-06550: строка 7, столбец 7: PL/SQL: ORA-00904:: неверный идентификатор
ORA-06550: строка 7, столбец 7: PL/SQL: выражение SQL игнорируется

Что лучше проверить эти функции?

Лучший ответ:

Создайте свою конвейерную функцию как отдельную процедуру или член пакета. Затем вы можете вызвать его из своего script.

Также убедитесь, что параметр NCOL, на который вы ссылаетесь, объявлен в схеме, к которой может обращаться вызывающий script.

Ответ №1

Вы не можете получить доступ к функции таблицы непосредственно в PL/SQL – см. тестовый пример ниже. Так как другие указали, вы должны определить функцию таблицы как автономную или упакованную.

DECLARE res NUMBER; FUNCTION testDC RETURN NCOL PIPELINED IS BEGIN PIPE ROW(5); END; BEGIN res := testDC(); dbms_output.put_line(‘—> ‘||res); END; / ORA-06550: line 3, column 12: PLS-00653: aggregate/table functions are not allowed in PL/SQL scope

Оцените статью
Добавить комментарий