对于 Pipelined Table Functions在调用时需要给出column_name而不是*:
SQL> CREATE OR REPLACE PACKAGE pkg_with IS
2
3 TYPE type_cursor_variable IS REF CURSOR;
4 TYPE emp_record IS RECORD(
5 empno emp.empno%TYPE
6 ,sal emp.sal%TYPE
7 ,deptno emp.deptno%TYPE);
8
9 TYPE emp_tab IS TABLE OF emp_record;
10
11 FUNCTION f_emp_info (p_deptno emp.deptno%TYPE)
12 RETURN emp_tab
13 PIPELINED;
14
15 PROCEDURE p_emp
16 (p_deptno IN emp.deptno%TYPE
17 ,p_resultset OUT type_cursor_variable);
18
19 END pkg_with;
20 /
Package created.
SQL> CREATE OR REPLACE PACKAGE BODY pkg_with IS
2
3 FUNCTION f_emp_info (p_deptno emp.deptno%TYPE)
4 RETURN emp_tab
5 PIPELINED
6 IS
7 lv_cursor emp_tab;
8 CURSOR c1 IS
9 SELECT empno
10 ,sal
11 ,deptno
12 FROM emp
13 WHERE deptno = p_deptno;
14 BEGIN
15 OPEN c1;
16 FETCH c1 BULK COLLECT INTO lv_cursor;
17 close c1;
18
19 IF lv_cursor.LAST IS NOT NULL
20 THEN
21 FOR i IN lv_cursor.FIRST..lv_cursor.LAST LOOP
22 PIPE ROW (lv_cursor(i));
23 END LOOP;
24 END IF;
25
26 RETURN;
27 END;
28
29 PROCEDURE p_emp
30 (p_deptno IN emp.deptno%TYPE
31 ,p_resultset OUT type_cursor_variable)
32 IS
33 BEGIN
34 OPEN p_resultset FOR
35 WITH ee AS (SELECT empno,sal
36 FROM TABLE(f_emp_info(p_deptno))
37 )
38 SELECT *
39 FROM ee;
40 END;
41
42 end pkg_with;
43 /
Package body created.
SQL> var v_cursor refcursor;
SQL> exec pkg_with.p_emp(10,:v_cursor);
BEGIN pkg_with.p_emp(10,:v_cursor); END;
*
ERROR at line 1:
ORA-22905: cannot access rows from a non-nested table item
ORA-06512: at "WWAP.PKG_WITH", line 34
ORA-06512: at line 1
SQL>
SQL> CREATE OR REPLACE PACKAGE BODY pkg_with IS
2
3 FUNCTION f_emp_info (p_deptno emp.deptno%TYPE)
4 RETURN emp_tab
5 PIPELINED
6 IS
7 lv_cursor emp_tab;
8 CURSOR c1 IS
9 SELECT empno
10 ,sal
11 ,deptno
12 FROM emp
13 WHERE deptno = p_deptno;
14 BEGIN
15 OPEN c1;
16 FETCH c1 BULK COLLECT INTO lv_cursor;
17 close c1;
18
19 IF lv_cursor.LAST IS NOT NULL
20 THEN
21 FOR i IN lv_cursor.FIRST..lv_cursor.LAST LOOP
22 PIPE ROW (lv_cursor(i));
23 END LOOP;
24 END IF;
25
26 RETURN;
27 END;
28
29 PROCEDURE p_emp
30 (p_deptno IN emp.deptno%TYPE
31 ,p_resultset OUT type_cursor_variable)
32 IS
33 BEGIN
34 OPEN p_resultset FOR
35 WITH ee AS (SELECT empno,sal
36 FROM TABLE(f_emp_info(p_deptno))
37 )
38 SELECT empno,sal
39 FROM ee;
40 END;
41
42 end pkg_with;
43 /
Package body created.
SQL> exec pkg_with.p_emp(10,:v_cursor);
PL/SQL procedure successfully completed.
SQL> print v_cursor;
EMPNO SAL
---------- ----------
7782 2450
7839 5000
7934 1300
3 rows selected.
SQL>
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/45259/viewspace-166532/ ,如需转载,请注明出处,否则将追究法律责任。