PLSQL Table Collection Cursor Variable

来源:互联网 发布:mac书名号怎么打出来 编辑:程序博客网 时间:2024/05/21 11:33


SELECT * FROM TEST02; A          B          C---------- ---------- ----------1          EMP        79342          DEPT       10

CREATE OR REPLACE PACKAGE PAC2IS/*************************************************//*  テーブルファンクションの行のレコード型       *//*************************************************/   TYPE REC_TYPE IS RECORD   (  A  VARCHAR2(20),      B  VARCHAR2(20),      C  VARCHAR2(20),      D  VARCHAR2(20));/*************************************************//*  そのレコード型のコレクション                 *//*************************************************/   TYPE REC_TAB_TYPE IS TABLE OF REC_TYPE;/**************************************************//*  そのコレクションを返すテーブルファンクション  *//**************************************************/   FUNCTION F2 (P_CURSOR IN SYS_REFCURSOR)      RETURN REC_TAB_TYPE PIPELINED;END PAC2;/ 

CREATE OR REPLACE PACKAGE BODY PAC2IS/**************************************************//*  テーブルファンクション F2の定義               *//**************************************************/   FUNCTION F2 (P_CURSOR IN SYS_REFCURSOR)      RETURN REC_TAB_TYPE PIPELINED   IS      -- テーブルファンクションの行レコード      REC  REC_TYPE;      -- カーソルの行のA列、B列、C列の変数      V_A   VARCHAR2(20);      V_B   VARCHAR2(20);      V_C   VARCHAR2(20);      -- 追加したD列の変数      V_D   VARCHAR2(20);   BEGIN      LOOP                                          -- 以下の処理を繰り返す         FETCH P_CURSOR INTO V_A, V_B, V_C;         -- カーソル変数から1行フェッチ         EXIT WHEN P_CURSOR%NOTFOUND;               -- フェッチして行がなければ繰り返しを終える         -- フェッチした各列の値をテーブル・ファンクションの行レコードにセット         REC.A := V_A;         REC.B := V_B;         REC.C := V_C;         -- D列の値は、場合によりEMP表やDEPT表から取得         IF V_B = 'EMP'  THEN            SELECT ENAME INTO V_D FROM EMP WHERE EMPNO = V_C;         ELSE            SELECT DNAME INTO V_D FROM DEPT WHERE DEPTNO = V_C;         END IF;         REC.D := V_D;         PIPE ROW(REC);                             -- 行レコードをパイプを通して返す      END LOOP;      RETURN;                                 -- 上記の繰り返し処理が終わったらファンクションを終える   END F2;END PAC2;/

SELECT * FROM TABLE(PAC2.F2(CURSOR(SELECT * FROM TEST02))); A          B          C          D---------- ---------- ---------- --------------------1          EMP        7934       MILLER2          DEPT       10         ACCOUNTING


0 0