コンパウンド SQL (組み込み) ステートメント
1 つ以上の異なる SQL ステートメント (サブステートメント) を結合して、1 つの実行可能なブロックにします。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込む方法のみ可能です。 コンパウンド SQL (組み込み) ステートメント構成全体は、動的に準備できない実行可能ステートメントです。 このステートメントは REXX ではサポートされていません。
許可
コンパウンド SQL (組み込み) ステートメントを呼び出すために、特権は必要ありません。 ただし、ステートメントの許可 ID によって保持される特権には、コンパウンド・ステートメントに組み込まれている SQL ステートメントを呼び出すために必要なすべての特権が含まれていなければなりません。
構文
説明
- ATOMIC
- コンパウンド SQL (組み込み) ステートメント内のいずれかのサブステートメントが失敗した場合に、正常なサブステートメントによる変更も含め、サブステートメントによってデータベースに対して行われた変更すべてを取り消すことを指定します。
- NOT ATOMIC
- サブステートメントのエラーには関係なく、他のサブステートメントによってデータベースに対して行われた変更をコンパウンド SQL (組み込み) ステートメントが取り消さないことを指定します。
- STATIC
- すべてのサブステートメントに対する入力変数が、
その当初の値を保持することを指定します。 例えば、
上記のステートメントの後に、次のステートメントが続いていると想定します。SELECT ... INTO :abc ...
この UPDATE ステートメントは、SELECT INTO の後に続く値ではなく、コンパウンド SQL (組み込み) ステートメントの実行開始時の :abc の値が使用されます。UPDATE T1 SET C1 = 5 WHERE C2 = :abc
1 つの同じ変数が複数のサブステートメントによって設定される場合、コンパウンド SQL (組み込み) ステートメントの後のその変数の値は、最後のサブステートメントで設定された値になります。
注: 非静的動作はサポートされません。 つまり、サブステートメントは、順次ではない方法で実行されているものとして見る必要があり、 サブステートメントに相互関係があってはなりません。 - STOP AFTER FIRST
- 特定の数のサブステートメントだけを実行することを指定します。 ホスト変数 (host-variable)
- 実行されるサブステートメントの数を指定する短精度整数。
- STATEMENTS
- STOP AFTER FIRST host-variable 節を完結します。 sql-statement
- 組み込み静的コンパウンド SQL (組み込み) ステートメントには、以下のものを除くすべての実行可能ステートメントを含めることができます。
CALL FETCH CLOSE OPEN CONNECT PREPARE Compound SQL RELEASE (Connection) DESCRIBE ROLLBACK DISCONNECT SET CONNECTION EXECUTE IMMEDIATE SET variable
注: INSERT、UPDATE、および DELETE は、ニックネームで使用するコンパウンド SQL ではサポートされていません。COMMIT ステートメントを含める場合、それは最後のサブステートメントでなければなりません。 COMMIT がこの位置にある場合は、STOP AFTER FIRST host-variable STATEMENTS 節がすべてのサブステートメントが実行されるわけではないことを示している場合でも、COMMIT が発行されます。 例えば、100 個のサブステートメントのあるコンパウンド SQL ブロックで、 COMMIT が最後のサブステートメントであるとします。 STOP AFTER FIRST STATEMENTS 節で 50 個のサブステートメントしか実行できないことが指定されている場合、 COMMIT は 51 番目のサブステートメントになります。
CONNECT TYPE 2 を使用している場合や、XA 分散トランザクション処理環境で実行している場合に、 COMMIT を組み込むと、エラーが戻されます (SQLSTATE 25000)。
ルール
- Db2® Connect は、コンパウンド SQL ブロック内の LOB 列を選択する SELECT ステートメントをサポートしません。
- コンパウンド SQL (組み込み) ステートメント内にホスト言語コードを使用することはできません。すなわち、コンパウンド SQL (組み込み) ステートメントを構成するサブステートメント相互間にホスト言語コードを使用することはできません。
- Db2 Connect は、NOT ATOMIC コンパウンド SQL (組み込み) ステートメントのみを受け入れます。
- コンパウンド SQL (組み込み) ステートメントはネストできません。
- 準備済み COMMIT ステートメントは、ATOMIC コンパウンド SQL (組み込み) ステートメントでは許可されていません。
注
- コンパウンド SQL (組み込み) ステートメント全体に対して、1 つの SQLCA が戻されます。 その SQLCA の情報の多くは、
最後のサブステートメントの処理時にアプリケーション・サーバーによって設定された値を反映しています。 例えば、次のようになります。
- 通常、SQLCODE および SQLSTATE は、 最後のサブステートメントに関するものです (例外については次の点で説明します)。
- 「
no data found (データが見つからない)
」の警告 (SQLSTATE 02000) が戻されると、その警告には他の警告よりも高い優先順位が与えられ、WHENEVER NOT FOUND 例外を立ち上げることができるようになります。 (これは、最終的にアプリケーションに戻される SQLCA 内の SQLCODE、SQLERRML、SQLERRMC、および SQLERRP の各フィールドが、「no data fond
」の警告を引き起こしたサブステートメントによるものであることを意味しています。 コンパウンド SQL (組み込み) ステートメントに複数の「no data found
」の警告が生じた場合、戻されるフィールドは最後のサブステートメントに関するフィールドです。) - SQLWARN 標識は、すべてのサブステートメントに対する標識の累計になります。
- NOT ATOMIC コンパウンド SQL の実行中に 1 つ以上のエラーが生じ、どのエラーも重大なエラーではない場合、SQLERRMC には、それらのエラーのうち最大 7 つに関する情報が入れられます。 SQLERRMC の最初のトークンは、発生したエラーの合計数を示します。 残りのトークンには、コンパウンド SQL (組み込み) ステートメント内でエラーが生じたサブステートメントの順序位置と SQLSTATE が含まれます。 これは、次の形式の文字ストリングです。
X で始まるサブストリングは最大 6 回まで繰り返され、 各ストリング・エレメントは、次のように定義されます。nnnXsssccccc
- nnn
- エラーが生じたステートメントの合計数。 (数が 999 を超えると、カウントは 0 から再び始まります。) このフィールドは左揃えになり、ブランクで埋められます。
- X
- トークン区切り記号 X'FF'。
- sss
- エラーが生じたステートメントの順序位置。 (数が 999 を超えると、カウントは 0 から再び始まります。) 例えば、最初のステートメントが失敗した場合、このフィールドには左揃えで数値 1 が入ります ("
1
")。 - ccccc
- エラーの SQLSTATE。
- 2 番目の SQLERRD フィールドには、 エラーが生じたステートメント (負の SQLCODE が戻される) の数が入れられます。
- SQLCA の 3 番目の SQLERRD フィールドは、 すべてのサブステートメントによって影響を受けた行の数の累計です。
- SQLCA の 4 番目の SQLERRD は、正常に実行されたサブステートメントの数を示します。 例えば、コンパウンド SQL (組み込み) ステートメント内の 3 番目のサブステートメントが失敗した場合、4 番目の SQLERRD フィールドは 2 に設定され、2 つのサブステートメントが正常に処理された後でエラーが発生したことを示します。
- SQLCA の 5 番目の SQLERRD フィールドは、 制約活動を引き起こしたすべてのサブステートメントに対して参照整合性制約を課すことによって 更新または削除された行の数の累計です。
例
- 例 1: C プログラムで、ACCOUNTS 表と TELLERS 表の両方を更新するコンパウンド SQL (組み込み) ステートメントを発行します。 ステートメントのいずれかにエラーがある場合は、
すべてのステートメントの結果を取り消します (ATOMIC)。 エラーがない場合は、現行の作業単位をコミットします。
EXEC SQL BEGIN COMPOUND ATOMIC STATIC UPDATE ACCOUNTS SET ABALANCE = ABALANCE + :delta WHERE AID = :aid; UPDATE TELLERS SET TBALANCE = TBALANCE + :delta WHERE TID = :tid; INSERT INTO TELLERS (TID, BID, TBALANCE) VALUES (:i, :branch_id, 0); COMMIT; END COMPOUND;
- 例 2: C プログラムで、データベースに 10 行のデータを挿入します。 ホスト変数 :nbr の値は 10 であり、
また S1 は準備済みの INSERT ステートメントであると想定します。 さらに、エラーに関係なくすべての挿入を試行するものとします (NOT ATOMIC)。
EXEC SQL BEGIN COMPOUND NOT ATOMIC STATIC STOP AFTER FIRST :nbr STATEMENTS EXECUTE S1 USING DESCRIPTOR :*sqlda0; EXECUTE S1 USING DESCRIPTOR :*sqlda1; EXECUTE S1 USING DESCRIPTOR :*sqlda2; EXECUTE S1 USING DESCRIPTOR :*sqlda3; EXECUTE S1 USING DESCRIPTOR :*sqlda4; EXECUTE S1 USING DESCRIPTOR :*sqlda5; EXECUTE S1 USING DESCRIPTOR :*sqlda6; EXECUTE S1 USING DESCRIPTOR :*sqlda7; EXECUTE S1 USING DESCRIPTOR :*sqlda8; EXECUTE S1 USING DESCRIPTOR :*sqlda9; END COMPOUND;