sql >> データベース >  >> RDS >> Oracle

Oracleプロシージャでグローバル一時テーブルを使用する方法は?

    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つのオブジェクトを比較するにはどうすればよいですか?
    1. PostgreSQL列挙型とJava列挙型の間のHibernateマッピング

    2. SQLServer2012でのquery_post_execution_showplan拡張イベントの影響

    3. 複数のIPアドレスに対してpostgresqlpostgresql.conflisten_addressesを構成する方法

    4. Count(*)とCount(1)-SQL Server