Du har definierat en pipelined funktion, och detta är inte sättet att kalla den:
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 måste använda en TABLE()-funktion. Fast då kommer du att upptäcka felet i din kod:
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>
Observera att jag var tvungen att döda den sessionen från en annan session, annars skulle den fortfarande köras. Så låt oss förenkla funktionen och bli av med den där meningslösa andra slingan ....
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;
/
.... då se!
SQL> select * from table(Cursor_pkg_func.f_trans(5))
2 /
VAR_CHAR2
------------------------------
ADAMS
JAMES
MILLER
SMITH
SQL>
Du har skapat en pipelined funktion. Varför gjorde du det? Anledningen till att du borde ha gjort det var att du ville ha en PL/SQL-funktion som kunde användas i FROM-satsen i en SELECT-sats. Det är användningsfallet för funktioner i pipeline. Så att lägga in samtalet i ett anonymt PL/SQL-block är verkligen inte vettigt.
Men ändå.
Läs dokumentationen. Det är ganska omfattande, det är online och gratis. Det relevanta avsnittet i PL/SQL-referensen är kapitlet om Statisk SQL. Det klargör att SELECT-satser i PL/SQL måste alltid hämta poster till en variabel av någon beskrivning. Anonyma PL/SQL-block är precis samma sak som lagrade procedurer i detta avseende. Läs mer .