リリース情報


38.6 「第 7 章 SQL プロシージャー」から「第 7 章 SQL 制御ステートメント」への変更

制御ステートメントとは、構造化プログラミング言語でプログラムを作成する 方法と同様に SQL を使用できるようにする SQL ステートメントです。 ルーチンの本体、トリガー、または動的複合ステートメントで SQL 制御ステートメントを 使用できます。

この章には、SQL procedure-statement とともに、サポートされている SQL 制御ステートメントの 構文および説明があります。

38.6.1 SQL プロシージャー・ステートメント

SQL プロシージャー・ステートメントの情報を以下のように変更します。

SQL プロシージャー・ステートメント

この章には、SQL ルーチン、トリガー、または動的複合ステートメントのプロシージャー本体を 構成するステートメントの構文図、意味の説明、規則、および使用例があります。

構文

>>-+---------+---+-| SQL-control-statement |-+-----------------><
   '-label:--'   '-| SQL-statement |---------'
 
SQL-control-statement
 
                                (1)
|---+-ALLOCATE CURSOR statement---------+-----------------------|
    |                      (1)          |
    +-assignment statement--------------+
    |                              (1)  |
    +-ASSOCIATE LOCATORS statement------+
    |                (1)                |
    +-CASE statement--------------------+
    |                            (2)    |
    +-dynamic-compound statement--------+
    +-FOR statement---------------------+
    +-GET DIAGNOSTICS statement---------+
    |                (1)                |
    +-GOTO statement--------------------+
    +-IF statement----------------------+
    +-ITERATE statement-----------------+
    +-LEAVE statement-------------------+
    |                (1)                |
    +-LOOP statement--------------------+
    |                              (1)  |
    +-procedure-compound statement------+
    |                  (1)              |
    +-REPEAT statement------------------+
    |                    (1)            |
    +-RESIGNAL statement----------------+
    +-RETURN statement------------------+
    +-SIGNAL ステートメント-------------+
    '-WHILE statement-------------------'
 

注:

  1. このステートメントは、SQL プロシージャーの有効範囲内でのみサポートされます。

  2. このステートメントは、トリガー、SQL 関数、または SQL メソッド内でのみサポートされます。 これは最外部のステートメントでなければなりません。

説明

label:
SQL プロシージャー・ステートメントのラベルを指定します。 ラベルは、リスト内でネストされた複合ステートメントを含め、SQL プロシージャー・ステートメントの リスト内で固有でなければなりません。 ネストされた複合ステートメントは、同じラベルを使用できることに注意してください。 SQL プロシージャー・ステートメントのリストは、おそらく SQL 制御ステートメントの中にあります。

トリガー、SQL 関数またはメソッド、動的複合ステートメントのコンテキストでは、 動的複合ステートメント、 FOR ステートメント、および WHILE ステートメントだけにラベルを付けることができます。

SQL-statement
SQL プロシージャーの本体には、以下を除き、実行可能な SQL ステートメントのすべてを入れることができます。

注:
CALL ステートメントを SQL プロシージャー本体に組み込むことが できますが、そのような CALL ステートメントが呼び出すことができるは、 別の SQL プロシージャーか C プロシージャーだけです。 SQL プロシージャー本体の中の CALL ステートメントは、その他のタイプの ストアード・プロシージャーを呼び出すことができません。

38.6.2 FOR

FOR

FOR ステートメントは、表のそれぞれの行に対してステートメントまたはステートメントのグループを実行します。

構文

>>-+---------+---FOR--for-loop-name--AS------------------------->
   '-label:--'
 
>-----+-------------------------------+--select-statement---DO-->
      |                         (1)   |
      '-cursor-name--CURSOR FOR-------'
 
      .-------------------------------.
      V                               |
>--------SQL-procedure-statement--;---+--END FOR----+--------+-><
                                                    '-label--'
 

注:

  1. このオプションは、SQL プロシージャーのコンテキスト内でのみ使用できます。

説明

label
FOR ステートメントのラベルを指定します。 開始ラベルが指定された場合、そのラベルは LEAVE および ITERATE ステートメントで使用できます。 終了ラベルを指定する場合、そのラベルは開始ラベルと同じでなければなりません。

for-loop-name
FOR ステートメントをインプリメントするために生成された暗黙的複合ステートメントのラベルを指定します。 FOR ステートメント内の ITERATE および LEAVE ステートメントで使用できないことを除いては、 複合ステートメントのラベルの規則に従います。 for-loop-name は、指定された select-statement によって返された列名を修飾するために使用します。

cursor-name
SELECT ステートメントからの結果表から行を選択するために使用されるカーソルを指定します。 指定しない場合は、DB2 が固有なカーソル名を生成します。

select-statement
カーソルの SELECT ステートメントを指定します。 選択リスト内の列にはすべて名前がなければならず、同じ名前の列が 2 つあってはいけません。

トリガー、関数、メソッド、または動的複合ステートメントでは、 select-statement はオプションで共通表式を持つ fullselect のみから構成されていなければなりません。

SQL-procedure-statement
表のそれぞれの行について呼び出すステートメント (1 つまたは複数) を指定します。

規則

下の例では、for-statement は employee 表全体を繰り返すために使用されています。 表のそれぞれの行について、SQL 変数 fullname は従業員のラストネーム、 コンマ、ファーストネーム、ブランク、ミドル・イニシアルに設定されます。 fullname のそれぞれの値は、表 tnames に挿入されます。

   BEGIN
      DECLARE fullname CHAR(40);
      FOR vl AS
         SELECT firstnme, midinit, lastname FROM employee
            DO
            SET fullname = lastname || ',' || firstnme ||' ' || midinit;
            INSERT INTO tnames VALUE (fullname);
      END FOR
   END

38.6.3 「複合ステートメント」から「複合ステートメント (プロシージャー)」への変更

複合ステートメントは、別のステートメントを SQL プロシージャーにグループ化します。 複合ステートメントの内部で SQL 変数、カーソル、および条件ハンドラーを宣言することができます。

新しい構文図の表題: procedure-compound-statement

                         .-NOT ATOMIC--.
>>-+---------+--BEGIN----+-------------+------------------------>
   '-label:--'           '-ATOMIC------'
 
>-----+-----------------------------------------------+--------->
      |  .-----------------------------------------.  |
      |  V                                         |  |
      '-----+-| SQL-variable-declaration |-+---;---+--'
            +-| condition-declaration |----+
            '-| return-codes-declaration |-'
 
>-----+--------------------------------------+------------------>
      |  .--------------------------------.  |
      |  V                                |  |
      '----| statement-declaration |--;---+--'
 
>-----+-------------------------------------+------------------->
      |  .-------------------------------.  |
      |  V                               |  |
      '----DECLARE-CURSOR-statement--;---+--'
 
>-----+------------------------------------+-------------------->
      |  .------------------------------.  |
      |  V                              |  |
      '----| handler-declaration |--;---+--'
 
      .-------------------------------.
      V                               |
>--------SQL-procedure-statement--;---+---END--+--------+------><
                                               '-label--'
 
SQL-variable-declaration
 
               .-,--------------------.
               V                      |
|---DECLARE-------SQL-variable-name---+------------------------->
 
                     .-DEFAULT NULL-------.
>-----+-data-type----+--------------------+-+-------------------|
      |              '-DEFAULT--constant--' |
      '-RESULT_SET_LOCATOR--VARYING---------'
 
condition-declaration
 
|---DECLARE--condition-name--CONDITION--FOR--------------------->
 
                 .-VALUE-.
     .-SQLSTATE--+-------+---.
>----+-----------------------+---string-constant----------------|
 
statement-declaration
 
             .-,-----------------.
             V                   |
|---DECLARE-----statement-name---+---STATEMENT------------------|
 
return-codes-declaration
 
|---DECLARE----+-SQLSTATE--CHAR (5)--+---+--------------------+-|
               '-SQLCODE--INTEGER----'   '-DEFAULT--constant--'
 
handler-declaration
 
|---DECLARE----+-CONTINUE-+---HANDLER--FOR---------------------->
               +-EXIT-----+
               '-UNDO-----'
 
      .-,---------------------------------------.
      V               .-VALUE-.                 |
>---------+-SQLSTATE--+-------+--ストリング--+--+--------------->
          +-condition-name-------------------+
          +-SQLEXCEPTION---------------------+
          +-SQLWARNING-----------------------+
          '-NOT FOUND------------------------'
 
>----SQL-procedure-statement------------------------------------|
 

statement-declaration
statement-declaration は、複合ステートメントの 1 つ以上のローカルの名前を 宣言します。ステートメント名は、同じ複合ステートメント内の別のステートメント名と 同じにすることはできません。

38.6.4 RETURN

RETURN

RETURN ステートメントはルーチンから戻るために使用されます。 SQL 関数またはメソッドの場合、関数またはメソッドの結果を返します。 SQL プロシージャーの場合、オプションで整数状況値を返します。

構文

>>-RETURN--+---------------------------------------------------------+->
           +-------------------------------------------------------+
           +-NULL----------------------------------------------------+
           '-+---------------------------------------+---fullselect--'
             |       .-,--------------------------.  |
             |       V                            |  |
             '-WITH-----common-table-expression---+--'
 
>--------------------------------------------------------------><
 

説明

expression
ルーチンから返される値を指定します。

NULL
関数またはメソッドが、RETURNS 文節で定義されたデータ・タイプの NULL 値を返すことを指定します。 NULL はプロシージャーからの RETURN には指定できません。

WITH common-table-expression
後続の fullselect で使用する共通表式を定義します。

fullselect
関数に対して返される行を指定します。 fullselect 内の列数は、関数の結果の列数に一致していなければなりません (SQLSTATE 42811)。 さらに、fullselect の静的列タイプが、列に対する割り当て規則を使用して関数結果について 宣言された列タイプに割り当てられていなければなりません。

fullselect はプロシージャーからの RETURN には指定できません。

ルーチンがスカラー関数またはメソッドの場合、fullselect は 1 つの列 (SQLSTATE 42823) と、 1 つの行 (SQLSTATE 21000) を返さなければなりません。

ルーチンが行関数の場合は、1 つの行 (SQLSTATE 21505) を返さなければなりません。

ルーチンが表関数の場合は、1 つまたは複数の列を持つゼロ以上の行を返すことができます。

規則

RETURN ステートメントを使用して、成功時には状況値ゼロを、 失敗時には -200 を伴って SQL ストアード・プロシージャーから戻ります。

   BEGIN
   ...
      GOTO FAIL
   ...
      SUCCESS: RETURN 0
      FAIL: RETURN -200
   END

38.6.5 SIGNAL

SIGNAL SQLSTATE ステートメントは現在使用されていません。

SIGNAL

SIGNAL ステートメントは、エラーまたは警告条件を通知するために使用されます。 エラーまたは警告を、オプションでメッセージ・テキストを付け、指定された SQLSTATE とともに返します。

構文

                         .-VALUE-.
>>-SIGNAL----+-SQLSTATE--+-------+--sqlstate-string-constant--+->
             '-condition-name---------------------------------'
 
>-----+--------------------------------------------------------+-><
      +-SET--MESSAGE_TEXT-- = --+-variable-name--------------+-+
      |                         '-diagnostic-string-constant-' |
      |                         (1)                            |
      '-(--diagnostic-string--)--------------------------------'
 

注:

  1. このオプションは、DB2 の旧バージョンとの互換性のために、 CREATE TRIGGER ステートメントの有効範囲内でのみ提供されます。

説明

SQLSTATE VALUE sqlstate-string-constant
指定されたストリング定数が SQLSTATE を表します。 以下の SQLSTATE の規則に従う、 5 文字の文字ストリング定数でなければなりません。

動的複合ステートメント、トリガー、SQL 関数、または SQL メソッドのコンテキストでは、以下の規則も適用されます。

SQLSTATE がこれらの規則にしたがっていない場合、エラーが発生します (SQLSTATE 428B3)。

condition-name
条件の名前を指定します。条件名はプロシージャー内で固有でなければならず、 宣言された複合ステートメント内でのみ参照が可能です。

SET MESSAGE_TEXT=
エラーまたは警告を記述するストリングを指定します。ストリングは SQLCA の SQLERRMC フィールドで返されます。 実際のストリングが 70 バイトを超えている場合は、警告なしで切り捨てられます。 この文節は、SQLSTATE または条件名も指定された場合にのみ指定できます (SQLSTATE 42601)。

variable-name
複合ステートメント内で宣言される必要のある SQL 変数を識別します。 SQL 変数は CHAR または VARCHAR データ・タイプとして定義されていなければなりません。

diagnostic-string-constant
メッセージ・テキストを含む文字ストリング定数を指定します。

diagnostic-string
エラー状態を記述する最大 70 バイトの文字ストリングを返す、タイプが CHAR または VARCHAR の式。 ストリングは 70 バイトを超えると切り捨てられます。 このオプションは、DB2 の旧バージョンとの互換性のために、 CREATE TRIGGER ステートメントの有効範囲内でのみ提供されます。通常は使用しないでください。

顧客番号がアプリケーションに認識されていないときにアプリケーション・エラーを通知する、 オーダー・システムの SQL プロシージャーです。ORDERS 表には CUSTOMER 表に対する外部キーが含まれており、 オーダーを入れるためには CUSTNO が存在していることが必要になります。

   CREATE PROCEDURE SUBMIT_ORDER
      (IN ONUM INTEGER, IN CNUM INTEGER,
       IN PNUM INTEGER, IN QNUM INTEGER)
       SPECIFIC SUBMIT_ORDER
       MODIFIES SQL DATA
           LANGUAGE SQL
      BEGIN
         DECLARE EXIT HANDLER FOR SQLSTATE VALUE '23503'
            SIGNAL SQLSTATE '75002'
               SET MESSAGE_TEXT = 'Customer number is not known';
         INSERT INTO ORDERS (ORDERNO, CUSTNO, PARTNO, QUANTITY)
            VALUES (ONUM, CNUM, PNUM, QNUM);
      END


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