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