Du har defineret en pipelinet funktion, og det er ikke måden at kalde det på:
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>
Du skal bruge en TABLE() funktion. Selvom du så vil opdage fejlen i din kode:
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>
Bemærk, at jeg var nødt til at dræbe den session fra en anden session, ellers ville den stadig køre. Så lad os forenkle funktionen og slippe af med den meningsløse anden løkke ....
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;
/
.... så se!
SQL> select * from table(Cursor_pkg_func.f_trans(5))
2 /
VAR_CHAR2
------------------------------
ADAMS
JAMES
MILLER
SMITH
SQL>
Du har oprettet en pipelinet funktion. Hvorfor gjorde du det? Grunden til at du skulle have gjort det, var fordi du ønskede en PL/SQL-funktion, som kunne bruges i FROM-sætningen i en SELECT-sætning. Det er use casen for pipelinede funktioner. Så at sætte opkaldet ind i en anonym PL/SQL-blok giver virkelig ikke mening.
Men alligevel.
Læs venligst dokumentationen. Det er ret omfattende, det er online og gratis. Det relevante afsnit i PL/SQL-referencen er kapitlet om statisk SQL. Det gør det klart, at SELECT-sætninger i PL/SQL skal altid hente poster til en variabel af en eller anden beskrivelse. Anonyme PL/SQL-blokke er bare det samme som lagrede procedurer i denne henseende. Få mere at vide .