RETURNING INTO 節 (PL/SQL)

オプションの RETURNING INTO 節が付加された INSERT、UPDATE、および DELETE ステートメントは、 Db2® データ・サーバーでコンパイルできます。 この節を PL/SQL コンテキスト内で使用すると、INSERT、UPDATE、または DELETE ステートメントの実行によって新たに追加、変更、または削除された値がそれぞれ取り込まれます。

構文

Read syntax diagramSkip visual syntax diagraminsert-statementupdate-statementdelete-statementRETURNING *,expr INTO record,field

説明

INSERT ステートメント
有効な INSERT ステートメントを指定します。 この INSERT ステートメントにより複数の行を含む結果セットが返された場合、例外が発生します。
UPDATE ステートメント
有効な UPDATE ステートメントを指定します。 この UPDATE ステートメントにより複数の行を含む結果セットが返された場合、例外が発生します。
削除ステートメント
有効な DELETE ステートメントを指定します。 この DELETE ステートメントにより複数の行を含む結果セットが返された場合、例外が発生します。
RETURNING *
INSERT、UPDATE、または DELETE ステートメントによる影響を受ける行の値すべてを割り当てることができることを指定します。
RETURNING
INSERT、UPDATE、または DELETE ステートメントによる影響を受ける行に対して評価を行う式を指定します。 評価済みの結果は、指定のレコードまたはフィールドに割り当てられます。
INTO レコード
戻り値を、互換性のあるフィールドおよびデータ・タイプを持つレコードに格納することを指定します。 これらのフィールドは、数、順序、およびデータ・タイプについて、RETURNING 節で指定した値と一致している必要があります。 結果セットに行が含まれない場合、レコード内のフィールドは NULL 値に設定されます。
INTO フィールド
戻り値を、互換性のあるフィールドおよびデータ・タイプを持つ一連の変数に格納することを指定します。 これらのフィールドは、数、順序、およびデータ・タイプについて、RETURNING 節で指定した値と一致している必要があります。 結果セットに行が含まれない場合、フィールドは NULL 値に設定されます。

以下の例は、RETURNING INTO 節を使用するプロシージャーを示しています。
CREATE OR REPLACE PROCEDURE emp_comp_update (
    p_empno         IN emp.empno%TYPE,
    p_sal           IN emp.sal%TYPE,
    p_comm          IN emp.comm%TYPE
)
IS
    v_empno         emp.empno%TYPE;
    v_ename         emp.ename%TYPE;
    v_job           emp.job%TYPE;
    v_sal           emp.sal%TYPE;
    v_comm          emp.comm%TYPE;
    v_deptno        emp.deptno%TYPE;
BEGIN
    UPDATE emp SET sal = p_sal, comm = p_comm WHERE empno = p_empno
    RETURNING
        empno,
        ename,
        job,
        sal,
        comm,
        deptno
    INTO
        v_empno,
        v_ename,
        v_job,
        v_sal,
        v_comm,
        v_deptno;

    IF SQL%FOUND THEN
        DBMS_OUTPUT.PUT_LINE('Updated Employee # : ' || v_empno);
        DBMS_OUTPUT.PUT_LINE('Name               : ' || v_ename);
        DBMS_OUTPUT.PUT_LINE('Job                : ' || v_job);
        DBMS_OUTPUT.PUT_LINE('Department         : ' || v_deptno);
        DBMS_OUTPUT.PUT_LINE('New Salary         : ' || v_sal);
        DBMS_OUTPUT.PUT_LINE('New Commission     : ' || v_comm);
    ELSE
        DBMS_OUTPUT.PUT_LINE('Employee # ' || p_empno || ' not found');
    END IF;
END;
このプロシージャーは、次の出力例を返します。
EXEC emp_comp_update(9503, 6540, 1200);

Updated Employee # : 9503
Name               : PETERSON
Job                : ANALYST
Department         : 40
New Salary         : 6540.00
New Commission     : 1200.00
以下の例は、レコード・タイプと共に RETURNING INTO 節を使用するプロシージャーを示しています。
CREATE OR REPLACE PROCEDURE emp_delete (
    p_empno         IN emp.empno%TYPE
)
IS
    r_emp           emp%ROWTYPE;
BEGIN
    DELETE FROM emp WHERE empno = p_empno
    RETURNING
        *
    INTO
        r_emp;

    IF SQL%FOUND THEN
        DBMS_OUTPUT.PUT_LINE('Deleted Employee # : ' || r_emp.empno);
        DBMS_OUTPUT.PUT_LINE('Name               : ' || r_emp.ename);
        DBMS_OUTPUT.PUT_LINE('Job                : ' || r_emp.job);
        DBMS_OUTPUT.PUT_LINE('Manager            : ' || r_emp.mgr);
        DBMS_OUTPUT.PUT_LINE('Hire Date          : ' || r_emp.hiredate);
        DBMS_OUTPUT.PUT_LINE('Salary             : ' || r_emp.sal);
        DBMS_OUTPUT.PUT_LINE('Commission         : ' || r_emp.comm);
        DBMS_OUTPUT.PUT_LINE('Department         : ' || r_emp.deptno);
    ELSE
        DBMS_OUTPUT.PUT_LINE('Employee # ' || p_empno || ' not found');
    END IF;
END;
このプロシージャーは、次の出力例を返します。
EXEC emp_delete(9503);

Deleted Employee # : 9503
Name               : PETERSON
Job                : ANALYST
Manager            : 7902
Hire Date          : 31-MAR-05 00:00:00
Salary             : 6540.00
Commission         : 1200.00
Department         : 40