すべてのプロダクト
Search
ドキュメントセンター

PolarDB:RETURNING INTO句の使用

最終更新日:May 30, 2024

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に設定されます。

説明 RETURNING INTOのバリエーションでは、BULK COLLECT句を使用します。 このバリエーションでは、コレクションに返される複数の行の結果セットが可能になります。

次の例は、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