SQL 解説書

複合ステートメント

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

構文

                         .-NOT ATOMIC--.
>>-+---------+--BEGIN----+-------------+------------------------>
   '-label:--'           '-ATOMIC------'
 
>-----+-----------------------------------------------+--------->
      |  .-----------------------------------------.  |
      |  V                                         |  |
      '-----+-| SQL-variable-declaration |-+---;---+--'
            +-| condition-declaration |----+
            '-| return-codes-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----------------|
 
return-codes-declaration
 
|---DECLARE----+-SQLSTATE--CHAR(5)--+---+--------------------+--|
               '-SQLCODE--INTEGER---'   '-DEFAULT--constant--'
 
handler-declaration
 
|---DECLARE----+-CONTINUE-+---HANDLER--FOR---------------------->
               +-EXIT-----+
               '-UNDO-----'
 
      .-,-----------------------------------.
      V               .-VALUE-.             |
>---------+-SQLSTATE--+-------+--string--+--+------------------->
          +-condition-name---------------+
          +-SQLEXCEPTION-----------------+
          +-SQLWARNING-------------------+
          '-NOT FOUND--------------------'
 
>----SQL-procedure-statement------------------------------------|
 

説明

label
コード・ブロックのラベルを定義します。 開始ラベルを指定した場合、そのラベルを使用して、 複合ステートメントで宣言する SQL 変数を修飾することができます。 また、開始ラベルは LEAVE ステートメントで指定することもできます。 終了ラベルを指定する場合、開始ラベルと同じにしなければなりません。

ATOMIC または NOT ATOMIC
ATOMIC は、複合ステートメントでエラーが発生したときに、 その複合ステートメント内のすべての SQL ステートメントをロールバックします。 NOT ATOMIC は、複合ステートメントでエラーが発生しても、 その複合ステートメントをロールバックしません。

SQL-variable-declaration
複合ステートメントに対してローカルな変数を宣言します。

SQL-variable-name
ローカル変数の名前を定義します。 SQL 変数は DB2 によって大文字に変換されます。 この名前は、同じ複合ステートメント内にある別の SQL 変数と同じにすることはできず、 パラメーター名と同じにすることもできません。 SQL 変数名は、列名と同じにすることはできません。 SQL ステートメントに SQL 変数および列参照と同じ名前の識別子が含まれている場合、 DB2 はその識別子を列と解釈します。

data-type
変数のデータ・タイプを指定します。 SQL データ・タイプの詳細については、データ・タイプを参照してください。 ユーザー定義データ・タイプ、漢字タイプ、および FOR BIT DATA はサポートされていません。

DEFAULT constant または NULL
SQL 変数のデフォルトを定義します。 SQL プロシージャーが呼び出された時点で、この変数は初期化されます。 デフォルト値が指定されていない場合、この変数は NULL に初期化されます。

RESULT_SET_LOCATOR VARYING
結果セット・ロケーター変数のデータ・タイプを指定します。

condition-declaration
条件名および対応する SQLSTATE 値を宣言します。

condition-name
条件の名前を指定します。 条件名はプロシージャー本体の中で固有でなければならず、 参照できるのは、その条件名が宣言されている複合ステートメントの中だけです。

FOR SQLSTATE string-constant
条件に関連付ける SQLSTATE を指定します。 string-constant は単一引用符で囲まれている 5 つの文字として指定しなければならず、 '00000' にすることはできません。

return-codes-declaration
SQLSTATE および SQLCODE という特殊変数を宣言します。 これらの変数は、SQL ステートメントの処理後に戻される値に自動的に設定されます。 SQLSTATE および SQLCODE 変数は両方とも、 SQL プロシージャー本体の最外部の複合ステートメントでしか宣言できません。 これらの変数は、SQL プロシージャーごとに 1 度しか宣言できません。

declare-cursor-statement
プロシージャー本体にカーソルを宣言します。 カーソルごとに固有の名前を使用しなければなりません。 カーソルを参照できるのは、複合ステートメントの中からだけです。 カーソルをオープンする場合は OPEN ステートメントを、 カーソルを使用して行を読み取る場合は FETCH ステートメントを使用します。 SQL プロシージャーからクライアント・アプリケーションに結果セットを戻す場合、 WITH RETURN 文節を使用してカーソルを宣言しなければなりません。 以下の例では、クライアント・アプリケーションに結果セットを 1 つ戻します。

     CREATE PROCEDURE RESULT_SET()
        LANGUAGE SQL
        RESULT SETS 1
        BEGIN
           DECLARE C1 CURSOR WITH RETURN FOR 
              SELECT id, name, dept, job 
                 FROM staff;
           OPEN C1;
          END

注: 結果セットを処理する場合、 DB2 コール・レベル・インターフェース (DB2 CLI)、オープン・データベース・コネクティビティー (ODBC)、 Java データベース・コネクティビティー (JDBC)、 Java Embedded SQL (SQLJ) のいずれかのアプリケーション・プログラミング・インターフェースを使用して、 クライアント・アプリケーションを作成しなければなりません。

カーソルの宣言について詳しくは、DECLARE CURSORを参照してください。

handler-declaration
ハンドラー (つまり、 複合ステートメントで例外または完了条件が発生した場合に実行するステートメントの集合) を指定します。 SQL-procedure-statement は、ハンドラーが制御を受け取る際に実行するステートメントです。

ハンドラーが有効なのは、それが宣言されている複合ステートメントの中だけです。

条件ハンドラーには以下の 3 つのタイプがあります。

CONTINUE
ハンドラーが正常に呼び出された後に、 例外を発生したステートメントの後の SQL ステートメントに制御が戻されます。 例外を発生したエラーが FOR、IF、CASE、WHILE、または REPEAT ステートメント (ただし、 それらのいずれかのステートメントの中の SQL-procedure-statement は除く) の場合、制御は、 END FOR、END IF、END CASE、END WHILE、または END REPEAT の後のステートメントに戻されます。

EXIT
ハンドラーが正常に呼び出された後に、 ハンドラーを宣言した複合ステートメントの最後に制御が戻されます。

UNDO
ハンドラーが呼び出される前に、 複合ステートメントで行われたあらゆる SQL の変更がロールバックされます。 ハンドラーが正常に呼び出された後に、 ハンドラーを宣言した複合ステートメントの最後に制御が戻されます。 UNDO を指定した場合、ATOMIC を指定しなければなりません。

ハンドラーが有効になる条件を以下に示します。

SQLSTATE string
ハンドラーが呼び出される SQLSTATE を指定します。 SQLSTATE は '00000' にすることはできません。

condition-name
ハンドラーが呼び出される条件名を指定します。 条件名は、条件宣言であらかじめ定義していなければなりません。

SQLEXCEPTION
SQLEXCEPTION が発生した場合に呼び出されるハンドラーを指定します。 SQLEXCEPTION は、最初の 2 文字が "00"、"01"、 または "02" ではない SQLSTATE です。

SQLWARNING
SQLWARNING が発生した場合に呼び出されるハンドラーを指定します。 SQLWARNING は、最初の 2 文字が "01" である SQLSTATE です。

NOT FOUND
NOT FOUND 条件が発生した場合に呼び出されるハンドラーを指定します。 NOT FOUND は、最初の 2 文字が "02" である SQLSTATE に対応しています。

規則

以下の処置を実行する複合ステートメントが含まれている、プロシージャー本体を作成します。

  1. SQL 変数を宣言します。
  2. IN パラメーターによって判別される部門の従業員の給与を戻すカーソルを宣言します。 SELECT ステートメントで、 salary 列のデータ・タイプをDECIMAL から DOUBLE にキャストします。
  3. 条件 NOT FOUND (ファイル終わり) に EXIT ハンドラーを宣言します。これにより、 値 '6666' が OUT パラメーター medianSalary に割り当てられます。
  4. 指定された部門の従業員の数を SQL 変数 numRecords に選択します。
  5. 50% + 1 の従業員が検索されるまで、WHILE ループのカーソルから行を取り出します。
  6. 給与の中央値を戻します。
     CREATE PROCEDURE DEPT_MEDIAN
        (IN deptNumber SMALLINT, OUT medianSalary DOUBLE)
        LANGUAGE SQL 
        BEGIN
          DECLARE v_numRecords INTEGER DEFAULT 1;
          DECLARE v_counter INTEGER DEFAULT 0;
          DECLARE c1 CURSOR FOR
            SELECT CAST(salary AS DOUBLE) FROM staff 
            WHERE DEPT = deptNumber
            ORDER BY salary;
         DECLARE EXIT HANDLER FOR NOT FOUND
            SET medianSalary = 6666;
   -- initialize OUT parameter
            SET medianSalary = 0;
            SELECT COUNT(*) INTO v_numRecords FROM staff
                 WHERE DEPT = deptNumber;
            OPEN c1;
            WHILE v_counter < (v_numRecords / 2 + 1) DO
              FETCH c1 INTO medianSalary;
              SET v_counter = v_counter + 1;
            END WHILE;
            CLOSE c1;
        END


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