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

PolarDB:FORALLステートメントを使用する

最終更新日:May 28, 2024

このトピックでは、FORALLステートメントの使用方法について説明します。

用語

コレクションを使用して、データ操作言語 (DML) ステートメントをより効率的に処理できます。 DMLステートメントを新しい値で繰り返し呼び出すのではなく、DELETE、INSERT、またはUPDATEステートメントの繰り返し実行に必要なすべての値を1回のパスでデータベースサーバーに渡すことができます。 このように処理されるDML文は、FORALL文を用いて指定される。 1つ以上のコレクションがDMLステートメントに与えられ、ステートメントが実行されるたびに異なる値が代入されます。

FORALLインデックスIN lower_bound .. upper_bound
  {insert_stmt | update_stmt | delete_stmt }; 

indexパラメーターは、insert_stmt、update_stmt、またはdelete_stmt DMLステートメントで指定されたコレクション内の位置を指定します。 このステートメントは、lower_boundとして指定された整数値からupper_boundまで反復します。

説明 FORALLステートメントの反復中に例外が発生した場合、FORALLステートメントの実行開始以降に発生したすべての更新は自動的にロールバックされます。 この動作は、Oracleデータベースと互換性がありません。 Oracleデータベースでは、COMMITステートメントまたはROLLBACKステートメントを明示的に使用して、例外の前に発生した更新をコミットするかロールバックするかを制御できます。

FORALLステートメントはループを作成します。 ループの各反復は、インデックス変数を増分する。 ループ内のインデックスを使用して、コレクションのメンバーを選択できます。 反復回数は、lower_boundによって制御されます。 upper_bound句。 ループは、lower_boundからupper_boundまでの整数ごとに1回実行され、インデックスは反復ごとに1ずつ増分されます。 次のコードスニペットに例を示します。

FORALL i IN 2 .. 5 

この例では、4回実行するループを作成します。最初の反復では、インデックス (i) は値2に設定されます。 第2の反復では、インデックスは値3に設定される。 ループは、値5に対して実行されて終了するまで続きます。

次の例では、emp_copyという名前のテーブルを作成します。 このテーブルは、empテーブルの空の複製です。 この例では、型emp_tblは、配列内の各要素が複合型であり、empテーブルを作成するために使用される列定義で構成される配列であると宣言されています。 インデックスは、emp_tbl型にも作成されます。

t_empはemp_tbl型の連想配列です。 SELECTステートメントは、BULK COLLECT INTOステートメントを使用してtemp配列を設定します。 t_emp配列が入力されると、FORALLステートメントはt_emp配列インデックスの値 (i) を反復処理し、各レコードの行をemp_copyに挿入します。

CREATE TABLE emp_copy(LIKE emp);

DECLARE

    TYPE emp_tblはBINARY_INTEGERによるemp % ROWTYPEインデックスのテーブルです。

    t_emp emp_tbl;

開始
    SELECT * FROM emp BULK COLLECT INTO t_emp;

    私はt_emp.FIRSTになります。 t_emp.LAST
     INSERT INTO emp_copy VALUES t_emp(i);

エンド; 

次の例は、FORALLステートメントを実行して3人の従業員の給与を更新する方法を示しています。

DECLARE
    タイプempno_tblはempのテーブルです。empno % TYPE INDEX BY BINARY_INTEGER;
    TYPE sal_tbl IS TABLE OF emp.ename % TYPE INDEX BY BINARY_INTEGER;
    t_empno EMPNO_TBL;
    t_sal SAL_TBL;
開始
    t_empno(1) := 9001;
    t_sal(1) := 3350.00;
    t_empno(2) := 9002;
    t_sal(2) := 2000.00;
    t_empno(3) := 9003;
    t_sal(3) := 4100.00;
    t_empno.FIRST .. t_empno.LAST
        UPDATE emp SET sal = t_sal(i) WHERE empno = t_empno(i);
エンド;

empno > 9000を選択します。

 empno | ename | job | mgr | hiredate | sal | comm | deptno
------- -------- -------------------------------------------------------------
  9001 | ジョーンズ | アナリスト | | | 3350.00 | | 40
  9002 | LARSEN | クレーク | | | 2000.00 | | 40
  9003 | ウィルソン | マネージャー | | | 4100.00 | | 40
(3行) 

次の例は、FORALLステートメントを実行して3人の従業員を削除する方法を示しています。

DECLARE
    タイプempno_tblはempのテーブルです。empno % TYPE INDEX BY BINARY_INTEGER;
    t_empno EMPNO_TBL;
開始
    t_empno(1) := 9001;
    t_empno(2) := 9002;
    t_empno(3) := 9003;
    t_empno.FIRST .. t_empno.LAST
        empから削除するempno = t_empno(i);
エンド;

empno > 9000を選択します。

 empno | ename | job | mgr | hiredate | sal | comm | deptno
------ ------- -----------------------------------------------
(0行)