ヘッダーをスキップ

Oracle Rdb SQLリファレンス・マニュアル リリース7.2 E06178-01 |
| 目次 | 索引

戻る | 次へ |

# COMMIT文

> トランザクションを終了し、そのトランザクション中に行った変更を永続的に保持します。また、COMMIT文は次を実行します。

> - すべてのロックの解除

> - （WITH HOLDカーソルを除く）すべてのオープンなカーソルのクローズ

> - 事前起動済トランザクションが有効な場合の新規トランザクションの事前起動

## 環境

> COMMIT文は次の環境で使用できます。

> - 対話型SQL内

> - プリコンパイル対象のホスト言語プログラムに埋め込まれる場合

> - SQLモジュールのプロシージャの一部として

> - 動的SQLで動的に実行される文として

## 形式

## 引数

> ### AND CHAIN

> AND CHAINを使用している場合、新規トランザクションは以前にコミットされたトランザクションと同じ属性を使用して暗黙的に開始されます。

> ### WORK

> COMMIT文には影響のないオプション・キーワードです。

## 使用方法

> - COMMIT文は次のものに反映されます。

>   - 最後のDECLARE TRANSACTION文またはSET TRANSACTION文のON句で指定されたすべてのデータベース、および最後のDECLARE TRANSACTION文またはSET TRANSACTION文以降に宣言されたデータベース。最後のDECLARE TRANSACTION文またはSET TRANSACTION文にON句が含まれていない場合、COMMIT文は宣言されたすべてのデータベースに反映されます。COMMIT文がプログラムに組み込まれている場合、トランザクションを起動したホスト言語プログラムのモジュールで宣言されたすべてのデータベースに反映されます。

>   - DELETE文、UPDATE文、TRUNCATE TABLE文およびINSERT文を使用してデータに加えられたすべての変更。

>   - ALTER文、CREATE文、DROP文、GRANT文、REVOKE文、RENAME文およびCOMMENT ON文を使用してデータ定義に加えられたすべての変更。

> - 対話型SQLでは、EXIT文の前にCOMMIT文またはROLLBACK文を発行しない場合、次のメッセージが返されます。

>       There are uncommitted changes to this database.
>       Would you like a chance to ROLLBACK these changes (No)?

>   プロンプトにYESと入力すると、対話型SQLに戻ります。NOと入力するか、[Return]キーを押すと、最後のトランザクションで行われた変更がコミットされます。
>   対話型SQLには、QUIT文も含まれます。QUIT文は対話型SQLセッションを停止し、変更内容をロールバックしてDCLプロンプトに戻ります。QUIT文では、変更をコミットするプロンプトは表示されません。

> - プリコンパイルされたプログラムでは、COMMIT文またはROLLBACK文を発行する前にプログラムが終了する場合、終了ステータスが正常の場合はSQLによって変更がコミットされ、そうでない場合は変更がロールバックされます。ただし、トランザクションを終了する場合は、常に明示的にCOMMIT文またはROLLBACK文を使用することをお薦めします。

> - ATOMIC BEGIN ... ENDブロックでは、COMMIT文を指定できません。

> - AND CHAIN句は、複合文（BEGIN...ENDブロック）で、またはストアド・プロシージャの本体としてのみ使用できます。

> - AND CHAINを使用している場合、新規トランザクションは以前にコミットまたはロールバックされたトランザクションと同じ属性を使用して暗黙的に開始されます。READ WRITE、READ ONLY、RESERVING、EVALUATING、WAITおよびISOLATION LEVELなどの属性は、新規トランザクションについて保持されます。
>   複合トランザクションの属性を指定するのは1回のみであるため、この新規句を使用してアプリケーションを簡易化できます。

> - SET FLAGSオプションのTRANSACTION_PARAMETERSが指定されると、連鎖トランザクションを識別するために一連の出力が書き込まれます。SET TRANSACTIONはそれぞれ、各トランザクション・アクション行の後に表示される一意の順序番号を割り当てます。

>       ~T Restart_transaction (3) on db: 1, db count=1

> - COMMIT文が複合文内で実行され、トランザクションがアクティブでない場合、結果として、ステータスは成功（SQLSTATEまたはSQLCODE）になります。
>   ただし、COMMIT文が単一文で実行される場合はエラーになります。この動作は、言語をSQL92またはSQL99に設定するか、SET QUIET COMMIT文を使用して変更できます。詳細は、「SET DIALECT文」および「SET QUIET COMMIT文」を参照してください。SQLモジュール言語またはSQLプリコンパイラ・アプリケーションについては、モジュール・ヘッダーのQUIET_COMMIT修飾子およびQUIET COMMIT句を参照してください。

## 例

> 例1: COMMIT文を使用したデータベースへの変更の書込み

> ここでは、従業員の昇給を例に示します。データベースの整合性を保つため、1つのトランザクション内で3つの操作が実行されます。プログラムでは、次を実行します。

> - 従業員の識別番号（ID）を要求します。

> - 昇給額を計算する場合に使用する昇給率（パーセント）を要求します。

> - UPDATE文を使用して給与締め日をNULLから現在日に変更し、現行給与の行を変更します。

> - INSERT文を使用してSALARY_HISTORY表に新規行を作成します。新規行のすべての列は、古い行の列から導出できます。ただし、開始日は現在日から再計算する必要があります。指定した昇給率（:PERCS）を使用して、旧レコードのSALARY_AMOUNT列から新規のSALARY_AMOUNT列の値が計算されます。

> - COMMIT文を使用してデータベースへの変更を永続化します。

> 例に示す最初の2つのSQL文は、WHENEVER SQLERROR文およびWHENEVER SQLWARNING文です。エラーまたは警告が発生すると、制御がROLLBACK文を含む別のパラグラフに渡されます。したがって、この一連の操作は部分的に完了することはありません。

>        .
>        .
>        .
>     PROCEDURE DIVISION.
>     START-UP.

>            DISPLAY "Enter employee's ID number:  "
>              WITH NO ADVANCING.
>            ACCEPT ID.
>            DISPLAY "Percentage increase:  "
>              WITH NO ADVANCING.
>            ACCEPT PERC.

>     EXEC SQL
>               WHENEVER SQLERROR GOTO ERROR-PAR   END_EXEC.

>     EXEC SQL
>               WHENEVER SQLWARNING GOTO ERROR-PAR    END_EXEC.

>     EXEC SQL SET TRANSACTION READ WRITE RESERVING
>                  SALARY_HISTORY FOR EXCLUSIVE WRITE
>     END_EXEC.

>     EXEC SQL
>               UPDATE  SALARY_HISTORY SH
>               SET     SH.SALARY_END = CURRENT_TIMESTAMP
>               WHERE   SH.EMPLOYEE_ID = :ID
>               AND     SH.SALARY_END IS NULL
>     END_EXEC.

>     EXEC SQL
>               INSERT INTO SALARY_HISTORY
>                      (EMPLOYEE_ID, SALARY_AMOUNT, SALARY_START)
>                      SELECT EMPLOYEE_ID,
>                             (SALARY_AMOUNT * (1 + (:PERC / 100))),
>                             SALARY_END
>                      FROM    SALARY_HISTORY
>                      WHERE   EMPLOYEE_ID = :ID
>                      AND     CAST(SALARY_END as DATE ANSI) = CURRENT_DATE
>     END_EXEC.

>     EXEC SQL
>               COMMIT WORK  END_EXEC.

> 例2: データ定義のあるCOMMIT文の使用

> この例では、単一データベースと表定義を示します。COMMIT文により、表定義は永続化されます。

>     SQL> CREATE DATABASE ALIAS INVENTORY;
>     SQL> --
>     SQL> CREATE TABLE INVENTORY.PART
>     cont>    (TEST CHAR(10));
>     SQL> COMMIT;
>     SQL> SHOW TABLES
>     User tables in database with alias INVENTORY
>          PART

> 例3: AND CHAIN引数の使用

> 次の単純な例では、プロシージャの開始時にSET TRANSACTIONを1回実行します。その後、COMMIT AND CHAIN構文を使用して、トランザクションを定期的にコミットし、再開します。トランザクション特性の定義は1つのみのため、これによってアプリケーションが簡略化されています。

>     SQL> -- process table in batches
>     SQL>
>     SQL> set compound transactions 'internal';
>     SQL> set flags 'transaction,trace';
>     SQL>
>     SQL> begin
>     cont> declare :counter integer = 0;
>     cont> declare :emp integer;
>     cont>
>     cont> set transaction
>     cont>     read write
>     cont>     reserving employees for exclusive write;
>     cont>
>     cont> for :emp in 0 to 600
>     cont> do
>     cont>     begin
>     cont>     declare :id char(5)
>     cont>           default substring (cast (:emp+100000 as varchar(6))
>     cont>                              from 2 for 5);
>     cont>     if exists (select * from employees where employee_id = :id)
>     cont>     then
>     cont>         trace 'found: ', :id;
>     cont>         if :counter > 20
>     cont>         then
>     cont>             commit and chain;
>     cont>             set :counter = 1;
>     cont>         else
>     cont>             set :counter = :counter + 1;
>     cont>         end if;
>     cont>     end if;
>     cont>     end;
>     cont> end for;
>     cont>
>     cont> commit;
>     cont> end;
>     ~T Compile transaction (1) on db: 1
>     ~T Transaction Parameter Block: (len=2)
>     0000 (00000) TPB$K_VERSION = 1
>     0001 (00001) TPB$K_WRITE (read write)
>     ~T Start_transaction (1) on db: 1, db count=1
>     ~T Rollback_transaction on db: 1
>     ~T Compile transaction (3) on db: 1
>     ~T Transaction Parameter Block: (len=14)
>     0000 (00000) TPB$K_VERSION = 1
>     0001 (00001) TPB$K_WRITE (read write)
>     0002 (00002) TPB$K_LOCK_WRITE (reserving) "EMPLOYEES" TPB$K_EXCLUSIVE
>     ~T Start_transaction (3) on db: 1, db count=1
>     ~Xt: found: 00164
>     ~Xt: found: 00165
>     .
>     .
>     .
>     ~Xt: found: 00185
>     ~T Commit_transaction on db: 1
>     ~T Prepare_transaction on db: 1
>     ~T Restart_transaction (3) on db: 1, db count=1
>     ~Xt: found: 00186
>     ~Xt: found: 00187
>     .
>     .
>     .
>     ~Xt: found: 00435
>     ~Xt: found: 00471
>     ~T Commit_transaction on db: 1
>     ~T Prepare_transaction on db: 1
>     SQL>

# 複合文

> 複数のSQL文を、1つのSQLモジュール・プロシージャまたは埋込みSQLプログラムに組み込むことができます。複数のSQL文は、複合文を定義した場合にのみプロシージャに組み込むことができます。1つ以上の複合文を含むプロシージャは、複数文プロシージャと呼ばれます。

> 一方、単一文に含めることができるSQL文は1つのみです。単一のSQL文が組み込まれたプロシージャは、単一文プロシージャと呼ばれます。単一文プロシージャの詳細およびSQLアプリケーション・プログラミングでの単一文プロシージャの使用方法は、「単一文」を参照してください。

> 複合文と単一文の相違は、組み込むことができるSQL文の数のみではありません。複合文では、次のことが可能です。

> - 単一文プロシージャで使用できるSQL文のサブセットのみを組み込むことができます。（これらの有効な文のリストは、compound-use-statement構文図を参照してください。）

> - ホスト言語プログラムで使用できるような制御フロー文を組み込むことができます。（複合文で使用できる制御フロー文のリストは、control-statement構文図を参照してください。）

> - ROLLBACKおよびCOMMITなどのトランザクション管理文を組み込むことができます。

> - ローカル変数を組み込むことができます。

> - 原子性を制御できます。

> - それぞれの複合文は単一のOracle Rdbリクエストを表すため、別名を1つのみ参照できます。

> 複合文の概念および複数文プロシージャと複合文との関係は、『Oracle Rdb7 Guide to SQL Programming』を参照してください。

## 環境

> 複合文は次の環境で使用できます。

> - プログラムで使用するための対話型SQL内での、構文およびプロトタイプの複合文のテスト手段として。

> - 埋込みSQL内での、SQLプリコンパイラで処理されるホスト言語プログラムの一部として。

> - SQLモジュール言語内での、SQLモジュール・プロセッサで処理されるSQLモジュール・ファイルの複数文プロシージャの一部として。

> - 動的SQLでの、複合文の準備および実行用として。

## 形式

## 引数

> ### ATOMIC

> ### NOT ATOMIC

> 複合文中の任意の文が例外によって終了する場合、複合文中のSQL文を元に戻すかどうかを制御します。複合文のデフォルトはNOT ATOMICです。

> 単一SQL文のほとんどはATOMICです。制御文のみがNOT ATOMICとして定義されています。たとえば、INSERT文がATOMICの場合、INSERT文がNOT ATOMICブロックに含まれていても、挿入操作は一単位として完了または失敗します。

> - ATOMIC
>   ATOMICとして定義される複合文では、複合文中のすべてのSQL文が成功しますが、複合文中のSQL文で例外が発生した場合は、SQL文は一単位としてすべて失敗します。失敗の時点までに行われた変更はすべて元に戻されます。複合文は、その中の文が失敗した時点で終了します。文が失敗しても変数の代入は変更されません。
>   ATOMICブロック内のすべての文は、ATOMICとして定義する必要があります。複合文をネストし、ATOMICを指定する場合、すべての内部ブロックにATOMICを指定する必要があります。指定しない場合はエラーが返されます。

> - NOT ATOMIC（デフォルト）
>   NOT ATOMICとして定義されている複合文では、失敗した文の時点までに正常に完了しているすべてのSQL文は、ATOMIC複合文に存在するため元に戻されません。ATOMIC複合文における成功か失敗のどちらかという動作とは異なり、NOT ATOMIC複合文では部分的に文が成功する場合があります。ATOMIC複合文と同様に、NOT ATOMIC複合文でもSQL文で例外が返されると終了します。一部の文の動作によって複合文が終了する場合、その文は常に元に戻されます。

> SET TRANSACTION文、START TRANSACTION文、COMMIT文およびROLLBACK文の使用は、NOT ATOMIC複合文に制限されます。これは、ATOMIC複合文はその性質上これらの文のプロパティと競合するためです。ATOMICブロックのプロパティは、すべての文が成功するか失敗するかのどちらかですが、このブロックの中でトランザクションを起動または終了する場合は、この点は保証されません。

> ### BEGIN

> 複合文を開始します。ENDキーワードは、複合文の終了をマークします。BEGINキーワードおよびENDキーワード、またそれらのキーワードでバインドされたすべての文で構成される単位は複合文ブロックまたはブロックと呼ばれます。最も単純な複合文ブロックは、BEGIN、ENDおよび終了セミコロン（BEGIN END;）で構成されます。

> ### beginning-label:

> 名前をブロックに割り当てます。LEAVE文またはITERATE文にラベルを使用して、ブロックまたはLOOP文から、制御された方法で終了します。名前付き複合文は、ラベル付き複合文と呼ばれます。ブロックに終了ラベルが存在する場合、開始ラベルにも同じ名前を指定する必要があります。ラベルは、ラベルが含まれているプロシージャ内で一意である必要があります。

> ### call-statement

> 外部プロシージャまたはストアド・プロシージャを起動します。詳細は、「複合文のCALL文」を参照してください。

> ### case-searched-statement

> 詳細は、「CASE（検索）制御文」を参照してください。

> ### commit-statement

> トランザクションを終了し、そのトランザクション中に行った変更を永続的に保持します。ATOMIC複合文中では、COMMIT文は使用できません。新規トランザクションの起動には、AND CHAIN句も使用できます。

> 詳細は、「COMMIT文」を参照してください。

> ### compound-statement

> 複合文を別の複合文にネストします。

> ### compound-use-statement

> 複合文ブロックで許可されたSQL文を識別します。

> ### CONSTANT

> 変数を、更新できない宣言定数に変更します。CONSTANTを指定する場合、変数に値が指定されるようにDEFAULT句も指定する必要があります。またCONSTANTは、変数を代入のターゲットとして使用できない、またはプロシージャのINOUTパラメータまたはOUTパラメータへ式として渡すことができないことを示します。

> ### control-statement

> 複合文中のSQL文の実行フローを制御するための条件付き実行、反復実行およびカーソルに類似した操作を行う一連の文です。

> ### default-clause

> 副問合せ、条件、文字、日/時および数式を含む、あらゆる値式をデフォルト値として使用できます。値式の詳細は、第2.6節を参照してください。

> 第2.6節で説明している値式には、DBKEYおよび集計関数が含まれています。ただしDEFAULT句は、DBKEYまたは集計関数の参照に有効な場所ではありません。いずれかを参照しようとすると、コンパイル時エラーが表示されます。

> ### delete-statement

> 表またはビューから行を削除します。

> 詳細は、「DELETE文」を参照してください。

> ### END

> 複合文ブロックを終了します。

> ### ending-label

> 名前をブロックに割り当てます。ブロックに開始ラベルが存在する場合、終了ラベルにも同じ名前を使用する必要があります。

> ### for-counted-loop-statement

> 詳細は、「FOR（カウント）制御文」を参照してください。

> ### for-statement

> 詳細は、「FOR制御文」を参照してください。

> ### get-diagnostics-statement

> 以前実行された文の診断情報を取得します。

> 詳細は、「GET DIAGNOSTICS文」を参照してください。

> ### if-statement

> 詳細は、「IF制御文」を参照してください。

> ### insert-statement

> 表またはビューに1つの行、または複数の行を追加します。複合文については、INSERT文は単一データベースのデータベース挿入操作に制限されます。

> 詳細は、「INSERT文」を参照してください。

> ### leave-statement

> 詳細は、「LEAVE制御文」を参照してください。

> ### lock-table-statement

> 詳細は、「LOCK TABLE文」を参照してください。

> ### loop-statement

> 詳細は、「LOOP制御文」を参照してください。

> ### ON ALIAS alias

> 別名を指定すると、使用しているプログラムまたは対話型SQL文から、複数データベースへの参照が可能になります。ATTACH文で指定された別名と同じ別名を使用します。

>     SQL> ATTACH 'ALIAS db1 FILENAME mf_personnel';
>     SQL> ATTACH 'ALIAS db2 FILENAME d1';
>     SQL> DECLARE :x CHAR(5);
>     SQL> BEGIN ON ALIAS db1
>     cont> SELECT EMPLOYEE_ID INTO :x FROM db1.EMPLOYEES
>     cont> WHERE EMPLOYEE_ID='00164';
>     cont> END;
>     SQL> PRINT :x;
>      X
>      00164

> ### OPTIMIZE AS request

> 名前を複合文に割り当てます。

> ### OPTIMIZE USING outline-name

> 問合せのアウトラインIDとアウトラインのIDが異なっている場合でも、複合文で使用する問合せアウトラインに名前を付けます。

> ### OPTIMIZE WITH

> 以前のOracle Rdbバージョンで使用されていたDEFAULT、行数が少ない方が選択されると仮定するAGGRESSIVE、問合せにリテラルを使用して索引で予備評価を行うSAMPLEDの3つの最適化制御のいずれかを選択します。

> ### PRAGMA pragma-options

> これらのオプションは、最外部のBEGIN文にのみ指定できます。ATOMICおよびNOT ATOMICは例外です。

> ### repeat-statement

> 詳細は、「REPEAT制御文」を参照してください。

> ### return-statement

> ストアド・ファンクションの結果を返します。詳細は、「RETURN制御文」を参照してください。

> ### rollback-statement

> トランザクションを終了し、そのトランザクションの開始以降に行ったすべての変更を元に戻します。ATOMIC複合文中では、ROLLBACK文は使用できません。新規トランザクションの起動には、AND CHAIN句も使用できます。

> 詳細は、「ROLLBACK文」を参照してください。

> ### set-assignment-statement

> 詳細は、「SET制御文」を参照してください。

> ### set-transaction-statement

> トランザクションを開始し、その特性を指定します。

> 詳細は、「SET TRANSACTION文」を参照してください。

> ### signal-statement

> 詳細は、「SIGNAL制御文」を参照してください。

> ### simple-case-statement

> 詳細は、「CASE（単一）制御文」を参照してください。

> ### singleton-select-statement

> 1行の結果表を指定します。

> 詳細は、「SELECT文: シングルトン選択」を参照してください。

> ### start-transaction-statement

> 詳細は、「START TRANSACTION文」を参照してください。

> ### trace-statement

> 値をトレース・ログ・ファイルに書き込みます。詳細は、「TRACE制御文」を参照してください。

> ### UPDATABLE

> UPDATABLEは（CONSTANTとは逆に）デフォルトであり、変数を変更できます。変数の更新は、（INSERT文、UPDATE文またはSELECT文の一部として）SET代入、INTO代入により、またはプロシージャのOUTパラメータまたはINOUTパラメータとして使用できます。

> ### update-statement

> 表またはビューの行を変更します。

> 詳細は、「UPDATE文」を参照してください。

> ### variable-declaration

> 複合文のローカル変数を宣言します。変数は複合文の実行時に作成され、複合文の実行が終了すると削除されます。

> ### while-statement

> 詳細は、「WHILE制御文」を参照してください。

> ### WITH HOLD

> 表カーソルがCOMMITアクションおよびROLLBACKアクションの間にオープンになるように、そのカーソルに適用できます。詳細は、「使用方法」を参照してください。

## 使用方法

> - 複合文では、変数宣言は実行SQL文の前に記述される必要があります。たとえば、DECLARE文の前にSET文を置くとエラーが返されます。

>       SQL> BEGIN
>       cont> DECLARE :mgrid CHAR(5);
>       cont> DECLARE :cur_mgrid CHAR(5);
>       cont> SET :mgrid = '00167';
>       cont> DECLARE :state_code CHAR(2);
>       %SQL-I-DEPR_FEATURE, Deprecated Feature: Keyword DECLARE used as an
>       identifier
>       DECLARE :state_code CHAR(2);
>                ^
>       %SQL-W-LOOK_FOR_STT, Syntax error, looking for:
>       %SQL-W-LOOK_FOR_CON,            FOR, LOOP, BEGIN, WHILE,
>       %SQL-F-LOOK_FOR_FIN,    found STATE_CODE instead

> - 対話型SQLおよびプリコンパイルされたSQLでは、最外部にある複合文にラベルは使用できません。ラベルは、別の複合文にネストされた複合文で使用できます。
>   SQLモジュール言語では、最外部にある複合文にラベルを置くことができます。

> - BEGIN ON ALIAS構文を使用して、複合文が参照するデータベースを指定します。BEGIN ON ALIASを使用しない場合、次のエラーが返されます。

>       SQL> ATTACH 'ALIAS db1 FILENAME mf_personnel';
>       SQL> ATTACH 'ALIAS db2 FILENAME d1';
>       SQL> DECLARE :x CHAR(5);
>       SQL> BEGIN
>       cont> SELECT EMPLOYEE_ID INTO :x FROM db1.EMPLOYEES
>       cont> WHERE EMPLOYEE_ID='00164';
>       cont> END;
>       %SQL-F-ONEDBINMOD, Only one alias is legal in this module

> - それぞれの複合文は単一のOracle Rdbリクエストを表しているため、別名を1つのみ参照できます。

> - 複数文プロシージャでは、複数のデータベースを参照できません。

> - compound-use statementsは順次実行されます。
>   文で例外が発生すると、すべてのデータベース作業は元に戻されます。失敗した文がATOMICブロック内にある場合、このブロックのすべての作業は元に戻されます。その文を含むプロシージャは例外を発行して終了し、例外はSQLCODEパラメータ、SQLSTATEパラメータまたはSQLCAパラメータを通してレポートされます。

> - NOT ATOMIC複合文中のすべての文について、新規タイムスタンプが計算されます。また、ATOMIC複合文の場合は新規タイムスタンプが1回のみ計算されます。CPUの負荷を軽減するため、複合した複数文プロシージャにはATOMIC文を使用してください。

> - LIST OF BYTE VARYINGデータ型は、変数または変数に使用されているドメインの明示データ型としては指定できません。

> - デフォルト値は、複合ブロックの他の実行可能文の前に割り当てられます。デフォルト値は、現在のDECLARE句で宣言されている変数を参照できません。デフォルト値は、外部ブロックまたは他の複合値式にある変数を参照できます。

> - DEFAULT句が存在しない場合、宣言変数の初期値は未定義です。

> - 変数のリストがまとめて宣言されている場合、DEFAULTはそれぞれの変数に適用されます。これについては、TRACE文を使用してデフォルト値を表示する次の例に示します。

>       SQL> SET FLAGS 'TRACE';
>       SQL> BEGIN
>       cont>    DECLARE :x, :y INTEGER DEFAULT -1;
>       cont>    TRACE :x, :y;
>       cont> END;
>       ~Xt: -1          -1

> - デフォルト句は、変数宣言が有効範囲に戻ると必ず再度代入されます。たとえば、ループにDECLARE句がある場合、ループが反復するたびに変数が再初期化されます。

> - FORカーソル・ループは、行セットからフェッチされた行ごとにループのDO ... END FOR本体を実行します。行を処理せずにFORループが行セットの終端に到達したかどうかを判断する場合は、RETURNED_SQLCODEまたはRETURNED_SQLSTATEは使用できません。処理された行がゼロかそれ以上かをテストするには、END FOR句の後にGET DIAGNOSTICS ROW_COUNT文を使用する必要があります。

> - アウトラインが存在する場合は、OPTIMIZE USING句で指定されているアウトラインが使用されます。ただし、アウトラインのディレクティブを1つ以上順守できない場合は除きます。既存のアウトラインを使用できない場合は、エラー・メッセージが発行されます。

> - 存在しないアウトラインの名前を指定すると、問合せがコンパイルされ、そのアウトライン名は無視され、問合せと同じアウトラインIDを持つ既存のアウトラインが検索されます。同じアウトラインIDのアウトラインが検出されると、そのアウトラインのディレクティブを使用して問合せを実行しようとします。同じアウトラインIDを持つアウトラインが検出されない場合、問合せ実行のための計画がオプティマイザで選択されます。

> - 問合せアウトラインの詳細は、『Oracle Rdb7 Guide to Database Performance and Tuning』を参照してください。

> - 複合文（BEGIN...END）内で宣言された変数にはCHECK制約を組み込み、変数に範囲外の代入が行われないようにできます。

> - constraint-clauseは、DECLAREでリストされたすべての変数に適用されます。SQLで制約がすべての変数に正しく適用されている場合は、キーワードVALUEを変数名のプレースホルダとして使用できます。

> - 可変制約には、NOT DEFERRABLE構文およびINITIALLY IMMEDIATE構文のみサポートされています。constraint-attributesが指定されていない場合でも、これがデフォルトになります。

> - 制約に違反があると、ランタイム・エラーが表示されます。このエラーには変数の名前が含まれます。

> - DEFAULTが宣言文で使用されていない場合、変数の内容は未定義です。このため、変数の値の一貫性を保つには、CHECK制約を使用する変数にもDEFAULT句が必要です。

> - WITH HOLD句が複合文の外部BEGINに適用されると、この複合文内のすべてのFORカーソル・ループのWITH HOLDカーソル・セマンティクスが強制されます。

> - たとえば、WITH HOLDセマンティクスにより、多数の行を処理するアプリケーションでコミットの頻度が上がり、ロックの競合とリカバリ・ジャーナルのサイズを削減できます。

>   注意 これらのセマンティクスは、CALL文でコールされるプロシージャや複合文中の文で実行されたSQLファンクションのいずれにも継承されません。

> - WITH HOLD PRESERVE NONE句を使用して、コミット時に必ずカーソルをクローズするようデフォルトを指定します。

> - デフォルト・アクション、つまりWITH HOLD PRESERVE NONEが指定されている場合は、FORカーソル・ループ内のCOMMIT文、ROLLBACK文、SET TRANSACTION文およびSTART TRANSACTION文は使用できません。
>   WITH HOLD PRESERVE ON COMMIT、WITH HOLD PRESERVE ON ROLLBACKまたはWITH HOLD PRESERVE ALLが使用されている場合、これらの文はFORカーソル・ループ内で使用できます。

## 例

> 例1: 複合文を使用した行の更新