1 つまたは複数の他の SQL ステートメント(サブステートメント)を結合して、 1 つの実行可能なブロックにします。 SQL プロシージャー内の複合 SQL ステートメントについては、 SQL プロシージャーを参照してください。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込む方法のみ可能です。 複合 SQL ステートメント構成全体は、動的に準備できない実行可能ステートメントです。 このステートメントは REXX ではサポートされません。
許可
複合 SQL ステートメント自体には必要ありません。 複合 SQL ステートメントの許可 ID には、 複合 SQL ステートメントに含まれる個々のステートメントすべてに対する適切な権限が必要です。
構文
>>-BEGIN COMPOUND----+-ATOMIC-----+--STATIC---------------------> '-NOT ATOMIC-' >-----+----------------------------------------------+----------> '-STOP AFTER FIRST--host-variable--STATEMENTS--' .-------------------------. V | >--------+-------------------+--+--END COMPOUND---------------->< '-sql-statement--;--'
説明
SELECT ... INTO :abc ...
上記のステートメントの後に、次のステートメントが続いていると想定します。
UPDATE T1 SET C1 = 5 WHERE C2 = :abc
この UPDATE ステートメントは、SELECT INTO の後に続く値ではなく、 複合 SQL ステートメントの実行開始時の :abc の値が使用されます。
1 つの同じ変数が複数のサブステートメントによって設定される場合、 複合 SQL ステートメントの後のその変数の値は、 最後のサブステートメントで設定された値になります。
注: | 非静的動作はサポートされません。 つまり、サブステートメントは、順次ではない方法で実行されているものとして見る必要があり、 サブステートメントに相互関係があってはなりません。 |
| CALL | OPEN |
| CLOSE | PREPARE |
| CONNECT | RELEASE (接続) |
| 複合 SQL | RELEASE SAVEPOINT |
| DESCRIBE | ROLLBACK |
| DISCONNECT | SAVEPOINT |
| EXECUTE IMMEDIATE | SET CONNECTION |
| FETCH |
|
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)。
規則
複合 SQL ステートメント全体に対して、1 つの SQLCA が戻されます。 その SQLCA の情報の多くは、 最後のサブステートメントの処理時にアプリケーション・サーバーによって設定された値を反映しています。 たとえば、
NOT ATOMIC 複合 SQL の実行の過程で 1 つまたは複数のエラーが発生し、 その中に重大なエラーが含まれていない場合には、SQLERRMC には、 それらのエラーのうち最大 7 つに関する情報が入れられます。 SQLERRMC の最初のトークンは、発生したエラーの合計数を示します。 残りのトークンには、 複合 SQL ステートメント内でエラーが生じたサブステートメントの順序位置と SQLSTATE が含まれます。 これは、次の形式の文字ストリングです。
nnnXsssccccc
X で始まるサブストリングは最大 6 回まで繰り返され、 各ストリング要素は、次のように定義されます。
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;