Zdefiniowałeś funkcję potokową i to nie jest sposób na jej wywołanie:
SQL> begin
2 Cursor_pkg_func.f_trans(5);
3 end;
4 /
Cursor_pkg_func.f_trans(5);
*
ERROR at line 2:
ORA-06550: line 2, column 1:
PLS-00221: 'F_TRANS' is not a procedure or is undefined
ORA-06550: line 2, column 1:
PL/SQL: Statement ignored
SQL>
Musisz użyć funkcji TABLE(). Chociaż wtedy odkryjesz błąd w swoim kodzie:
SQL> select * from table(Cursor_pkg_func.f_trans(5))
2 /
SMITH
SMITH
SMITH
''''
SMITH
SMITH
SMITH
SMITH
ERROR:
ORA-00028: your session has been killed
273660 rows selected.
SQL>
Uwaga Musiałem zabić tę sesję z innej sesji, w przeciwnym razie nadal będzie działać. Uprośćmy więc funkcję i pozbądźmy się tej bezsensownej drugiej pętli...
CREATE OR REPLACE PACKAGE BODY Cursor_pkg_func IS
FUNCTION f_trans (p in number) RETURN outrecset PIPELINED IS
out_rec outrec_typ;
BEGIN
OPEN Cursor_pkg.C1;
LOOP
FETCH Cursor_pkg.C1 INTO Cursor_pkg.row_emp;
EXIT when Cursor_pkg.C1%NOTFOUND;
out_rec.var_char2 := Cursor_pkg.row_emp.last_name;
PIPE ROW(out_rec);
END LOOP;
CLOSE Cursor_pkg.C1;
RETURN;
END f_trans;
END Cursor_pkg_func;
/
....to lo!
SQL> select * from table(Cursor_pkg_func.f_trans(5))
2 /
VAR_CHAR2
------------------------------
ADAMS
JAMES
MILLER
SMITH
SQL>
Utworzyłeś funkcję potokową. Dlaczego to zrobiłeś? Powodem, dla którego powinieneś to zrobić, było to, że chciałeś funkcji PL/SQL, której można by użyć w klauzuli FROM instrukcji SELECT. To jest przypadek użycia funkcji potokowych. Tak więc umieszczenie wywołania w anonimowym bloku PL/SQL naprawdę nie ma sensu.
Ale i tak.
Prosimy o zapoznanie się z dokumentacją. Jest dość obszerny, jest dostępny online i bezpłatny. Stosowną częścią podręcznika PL/SQL Reference jest rozdział dotyczący statycznego języka SQL. Wyjaśnia, że instrukcje SELECT w PL/SQL muszą zawsze pobrać rekordy do zmiennej o pewnym opisie. Anonimowe bloki PL/SQL są pod tym względem takie same jak procedury składowane. Dowiedz się więcej .