ヘッダーをスキップ
Oracle Rdb SQLリファレンス・マニュアル
リリース7.2
E06178-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 


COMMIT文

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


環境

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


形式



引数

AND CHAIN

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

WORK

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

使用方法


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

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

例に示す最初の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文の数のみではありません。複合文では、次のことが可能です。

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


環境

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


形式












引数

ATOMIC

NOT ATOMIC

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

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

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アクションの間にオープンになるように、そのカーソルに適用できます。詳細は、「使用方法」を参照してください。

使用方法


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