Oracleでは、セッションテーブルと呼ばれるグローバル一時テーブルとグローバル一時テーブルを使用して、処理中にデータを一時的に保持します。以下は例です。
グローバル一時テーブルの作成
ここでは、EMPテーブルから部門ごとの合計給与を保持するためのグローバル一時テーブルを作成します。 EMPテーブルとデータをダウンロードできます 次のリンクSCOTTスキーマテーブルからのテスト目的のため。また、以下の例では、 ON COMMIT DELETE ROWSを使用してテーブルを作成しています。 句。プロシージャでCommitステートメントが実行されるたびに行を削除します。 ON COMMIT PRESERVE ROWSを使用することもできます セッションがアクティブになるまで行をテーブルに保持する句。
CREATE GLOBAL TEMPORARY TABLE temp_dept ( deptno NUMBER (4), dname VARCHAR2 (50), sal NUMBER ) ON COMMIT DELETE ROWS;
Oracleプロシージャでグローバル一時テーブルを使用する例
次の手順では、各部門から合計給与を受け取り、temp_deptテーブルにデータを入力します。次に、temp_deptテーブルからレコードを選択し、EMPテーブルのコミッション列を部門の総給与の2%で更新します。
CREATE OR REPLACE PROCEDURE prc_dept
IS
CURSOR c_emp
IS
SELECT e.deptno, d.dname, SUM (e.sal) tot_sal
FROM emp e, dept d
WHERE e.deptno = d.deptno
GROUP BY e.deptno, d.dname;
n_count NUMBER := 0;
BEGIN
FOR c IN c_emp
LOOP
/* Inserting records into temp table */
INSERT INTO temp_dept (deptno, dname, sal)
VALUES (c.deptno, c.dname, c.tot_sal);
END LOOP;
/* Now get the records from temp table and update the EMP table */
FOR c IN (SELECT deptno, dname, sal FROM temp_dept)
LOOP
/* Updating the EMP table commission column to set 2% of total department wise salary*/
UPDATE emp
SET comm = c.sal * 2 / 100
WHERE emp.deptno = c.deptno;
DBMS_OUTPUT.put_line( 'Commission amount '
|| (c.sal * 2 / 100)
|| ' updated for department '
|| c.dname);
END LOOP;
/* Save the EMP table changes and this will also remove the records from temp_dept table*/
COMMIT;
/* Checking temporary table records count for testing */
SELECT COUNT ( * ) INTO n_count FROM temp_dept;
DBMS_OUTPUT.put_Line ('Records in Temp table: ' || n_count);
END; テスト
SET SERVEROUTPUT ON; BEGIN prc_dept; END; /
出力
Commission amount 175 updated for department ACCOUNTING Commission amount 217.5 updated for department RESEARCH Commission amount 188 updated for department SALES Records in Temp table: 0 PL/SQL procedure successfully completed.
関連項目:
- ストアドプロシージャの例のテーブルタイプ
- Oracleで2つのオブジェクトを比較するにはどうすればよいですか?