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