ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Pipelined Table Functions(1)

Pipelined Table Functions(1)

原创 Linux操作系统 作者:dragondb 时间:2019-04-23 11:33:05 0 删除 编辑

对于 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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2003-05-05

  • 博文量
    98
  • 访问量
    94097