SQL 解説書

複合 SQL (組み込み)

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--;--'
 

説明

ATOMIC
複合 SQL ステートメント内のいずれかのサブステートメントが失敗した場合に、 正常なサブステートメントによる変更も含め、 サブステートメントによってデータベースに対して行われた変更すべてを取り消すことを指定します。

NOT ATOMIC
サブステートメントのエラーには関係なく、 他のサブステートメントによってデータベースに対して行われた変更を 複合 SQL ステートメントが取り消さないことを指定します。

STATIC
すべてのサブステートメントに対する入力変数が、 その当初の値を保持することを指定します。 たとえば、

  SELECT ... INTO :abc ...

上記のステートメントの後に、次のステートメントが続いていると想定します。

  UPDATE T1 SET C1 = 5 WHERE C2 = :abc

この UPDATE ステートメントは、SELECT INTO の後に続く値ではなく、 複合 SQL ステートメントの実行開始時の :abc の値が使用されます。

1 つの同じ変数が複数のサブステートメントによって設定される場合、 複合 SQL ステートメントの後のその変数の値は、 最後のサブステートメントで設定された値になります。

注:非静的動作はサポートされません。 つまり、サブステートメントは、順次ではない方法で実行されているものとして見る必要があり、 サブステートメントに相互関係があってはなりません。

STOP AFTER FIRST
特定の数のサブステートメントだけを実行することを指定します。

host-variable
実行されるサブステートメントの数を指定する短精度整数。

STATEMENTS
STOP AFTER FIRST host-variable 文節を完結します。

sql-statement
組み込み静的複合 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 回まで繰り返され、 各ストリング要素は、次のように定義されます。

nnn
エラーが生じたステートメントの合計数。 65 このフィールドは左寄せされ、ブランクで埋められます。

X
トークン区切り記号 X'FF'。

sss
エラーが生じたステートメントの順序位置。 65 たとえば、最初のステートメントが失敗した場合、 このフィールドには数字の 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;


脚注:

64
これは、最終的にアプリケーションに戻される SQLCA 内の SQLCODE、SQLERRML、 SQLERRMC、および SQLERRP の各フィールドが、 'no data found' を引き起こしたサブステートメントによるものであることを意味しています。 複合 SQL ステートメントに複数の 'no data found' の警告が生じた場合、 戻されるフィールドは最後のサブステートメントのフィールドです。

65
数が 999 を超えると、カウントは 0 から再び始まります。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]