INSERT、UPDATE、およびDELETEステートメントは、オプションのRETURNING INTO句によって追加できます。 この句を使用すると、SPLプログラムは、INSERT、UPDATE、またはDELETEステートメントの結果から、新しく追加、変更、または削除された値を取得できます。
次の例は、構文を示しています。
{ insert | 更新 | 削除}
戻り {* | expr_1 [, expr_2 ] ...}
INTO { record | field_1 [, field_2 ] ...} ; insertは有効なINSERTステートメントです。 updateは有効なUPDATEステートメントです。 deleteは有効なDELETEステートメントです。 * を指定した場合、INSERT、UPDATE、またはDELETEステートメントの影響を受ける行の値は、INTOキーワードの右側にあるレコードまたはフィールドに割り当てられます。 (* の使用は の拡張であり、Oracleデータベースと互換性がないことに注意してください。) expr_1、expr_2... は、INSERT、UPDATE、またはDELETEステートメントの影響を受ける行に対して評価される式です。 評価された結果は、INTOキーワードの右側のレコードまたはフィールドに割り当てられます。 recordは、番号と順序が一致するフィールドを含む必要があるレコードの識別子であり、RETURNING句の値と互換性のあるデータ型です。 field_1、field_2、... は、番号と順序が一致する必要がある変数であり、RETURNING句の値のセットと互換性のあるデータ型です。
INSERT、UPDATE、またはDELETEステートメントが複数の行を含む結果セットを返す場合、「SQLCODE 01422、クエリが複数の行を返しました」というメッセージとともに例外がスローされます。結果セットに行がない場合、INTOキーワードに続く変数はnullに設定されます。
次の例は、UPDATEで導入されたemp_comp_updateプロシージャを修正したもので、RETURNING INTO句を追加したものです。
CREATE OR REPLACE PROCEDURE emp_comp_update ()
p_empno IN emp.empno % TYPE、
p_salでemp.sal % タイプ、
p_comm I N emp.com m % タイプ
)
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.de ptno % TYPE;
開始
UPDATE emp SET sal = p_sal, comm = p_comm WHERE empno = p_empno
返品
empno,
ename,
仕事、
sal,
comm,
deptno
INTO
v_empno,
v_ename,
v_job,
v_sal,
v_comm,
v_deptno;
IF SQL % が見つかった
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 | |' は見つかりません);
エンドIF;
エンド; 次の例は、このプロシージャの出力を示しています (emp_insertプロシージャによって作成された従業員9503がまだテーブル内に存在すると仮定しています) 。
EXEC emp_comp_update(9503、6540、1200);
更新された従業員# : 9503
名前: ピーターソン
仕事: アナリスト
部署: 40
新しい給料: 6540.00
新しい委员会: 1200.00 次の例は、emp_deleteプロシージャを変更したもので、レコードタイプを使用してRETURNING INTO句を追加したものです。
CREATE OR REPLACE PROCEDURE emp_delete (
p_empno IN emp.empno % TYPE
)
IS
r_emp emp % ROWTYPE;
開始
empno = p_empnoから削除する
返品
*
INTO
r_emp;
IF SQL % が見つかった
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 | |' は見つかりません);
エンドIF;
エンド; 次の例は、このプロシージャの出力を示しています。
EXEC emp_delete(9503);
削除された従業員# : 9503
名前: ピーターソン
仕事: アナリスト
マネージャー: 7902
レンタル日: 31-MAR-05 00:00:00
給与: 6540.00
委員会: 1200.00
部署: 40