Вопрос:
Я хочу проверить свою конвейерную функцию без создания пакета. Следующий пример упрощен:
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