您已经定义了流水线函数,这不是调用它的方法:
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 undefinedORA-06550: line 2, column 1:PL/SQL: Statement ignoredSQL>
您需要使用TABLE()函数。虽然这样您会发现代码中的错误:
SQL> select * from table(Cursor_pkg_func.f_trans(5)) 2 /SMITHSMITHSMITH''''SMITHSMITHSMITHSMITHERROR:ORA-00028: your session has been killed273660 rows selected.SQL>
请注意,我必须从另一个会话中终止该会话,否则它将仍在运行。因此,让我们简化函数并摆脱那毫无意义的第二个循环…。
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;/
....然后瞧!
SQL> select * from table(Cursor_pkg_func.f_trans(5)) 2 /VAR_CHAR2------------------------------ADAMSJAMESMILLERSMITHSQL>
“当我添加开始和结束时;选择不起作用”
您已经创建了流水线函数。你为什么这么做?之所以这样做,是因为您想要一个可以在SELECt语句的FROM子句中使用的PL /
SQL函数。这就是流水线函数的用例。因此,将调用放入匿名PL / SQL块中实际上没有任何意义。
但不管怎么说。
请阅读文档。它是非常全面的,它是在线免费的。《 PL / SQL参考》中的相关部分是“静态SQL”一章。很明显,PL / SQL中的SELECT语句必须
始终将 记录提取到具有某些描述的变量中。在这方面,匿名PL / SQL块与存储过程相同。
了解更多。



