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

Oracleストアドプロシージャの例のテーブルタイプ

    以下は、テーブルタイプコレクションを使用してデータを処理するOracleストアドプロシージャの例です。

    Oracleストアドプロシージャの例でテーブルタイプを使用してデータを処理する

    次のテーブルを作成し、テストするデータをスキーマに挿入します。

    CREATE TABLE EMP
    (
    EMPNO NUMBER(4),
    ENAME VARCHAR2(10 BYTE),
    JOB VARCHAR2(9 BYTE),
    MGR NUMBER(4),
    HIREDATE DATE,
    SAL NUMBER(7,2),
    COMM NUMBER(7,2),
    DEPTNO NUMBER(2)
    )
    /
    CREATE TABLE EMP_BONUS
    (
    EMPNO NUMBER(4),
    BONUS_AMOUNT NUMBER
    )
    /
    SET DEFINE OFF;
    Insert into EMP
    (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO)
    Values
    (7369, 'SMITH', 'CLERK', 7902, 
    TO_DATE('12/17/1980 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 800, 20);
    Insert into EMP
    (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
    Values
    (7499, 'ALLEN', 'SALESMAN', 7698, 
    TO_DATE('02/20/1981 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 1600, 300, 30);
    Insert into EMP
    (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
    Values
    (7521, 'WARD', 'SALESMAN', 7698, 
    TO_DATE('02/22/1981 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 1250, 500, 30);
    COMMIT;

    ストアドプロシージャの作成

    CREATE OR REPLACE PROCEDURE process_bonus
    IS
    CURSOR c_emp
    IS
    SELECT EMPNO,
    ENAME,
    JOB,
    MGR,
    HIREDATE,
    SAL,
    COMM,
    DEPTNO
    FROM emp;
    
    /* declare table type in the procedure declare section as below */
    TYPE t_emp_table IS TABLE OF emp%ROWTYPE
    INDEX BY BINARY_INTEGER;
    
    t_emp t_emp_table;
    BEGIN
    OPEN c_emp;
    
    /* fetch cursor data into table type using bulk collect */
    FETCH c_emp
    BULK COLLECT INTO t_emp;
    
    CLOSE c_emp;
    
    FOR i IN t_emp.FIRST .. t_emp.LAST
    LOOP
    /* insert 5% bonus of employee's salary into emp_bonus table */
    INSERT INTO emp_bonus (empno, bonus_amount)
    VALUES (t_emp (i).empno, t_emp (i).sal * 5 / 100);
    END LOOP;
    
    COMMIT;
    END;

    PL/SQLブロックを使用したテスト

    BEGIN
    process_bonus;
    END;

    処理されたデータのボーナステーブルを確認する

    SELECT * FROM EMP_BONUS;

    出力:

    EMPNO

    BONUS_AMOUNT

    7369

    40

    7499

    80

    7521

    62.5

    関連項目:

    • ストアドプロシージャを使用してOracleにCSVファイルをインポートする
    • OracleのストアドプロシージャからResultSetを返す
    1. PostgreSQL multi INSERT...RETURNINGと複数の列

    2. PostgreSQLが大文字のテーブル名を好まないのはなぜですか?

    3. SQLiteの既存のテーブルに列を追加する

    4. Django + Psycopg2:InterfaceError:プロトコル3のみがサポートされています