U hebt een gepijplijnde functie gedefinieerd en dit is niet de manier om deze aan te roepen:
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>
U moet een TABLE()-functie gebruiken. Hoewel je dan de bug in je code zult ontdekken:
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>
Merk op dat ik die sessie van een andere sessie moest beëindigen, anders zou hij nog steeds actief zijn. Dus laten we de functie vereenvoudigen en van die zinloze tweede lus afkomen ....
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;
/
.... kijk dan!
SQL> select * from table(Cursor_pkg_func.f_trans(5))
2 /
VAR_CHAR2
------------------------------
ADAMS
JAMES
MILLER
SMITH
SQL>
U hebt een pijplijnfunctie gemaakt. Waarom deed je dat? De reden dat je dat had moeten doen, was omdat je een PL/SQL-functie wilde die in de FROM-clausule van een SELECT-instructie kon worden gebruikt. Dat is de use case voor gepijplijnde functies. Dus de aanroep in een anoniem PL/SQL-blok plaatsen heeft echt geen zin.
Maar goed.
Lees de documentatie. Het is vrij uitgebreid, het is online en gratis. De relevante sectie in de PL/SQL-referentie is het hoofdstuk over statische SQL. Het maakt duidelijk dat SELECT-statements in PL/SQL altijd . moeten records ophalen in een variabele met een bepaalde beschrijving. Anonieme PL/SQL-blokken zijn in dit opzicht precies hetzelfde als opgeslagen procedures. Meer informatie .