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 に対応しています。
規則
- ATOMIC 複合ステートメントはネストできません。
- ハンドラーの宣言には、以下の規則が適用されます。
- SQLEXCEPTION、SQLWARNING、または NOT FOUND を含んでいるハンドラーの宣言には、
追加の SQLSTATE または条件名を含めることはできません。
- 同じ複合ステートメントの中のハンドラーの宣言には、重複条件を含めることはできません。
- ハンドラーの宣言では、同一の条件コードまたは SQLSTATE 値を複数回含めることはできません。
また、SQLSTATE 値と、その同じ SQLSTATE 値を表す条件名を含めることもできません。
SQLSTATE 値のリストおよび詳細については、メッセージ解説書を参照してください。
- 例外または完了条件が発生した場合、
その条件に最も適したハンドラーが有効になります。
最も適したハンドラーとは、
複合ステートメントで定義されているハンドラー (例外または完了条件で使用される) で、
例外または完了条件が発生したステートメントの効力範囲に最も近いもののことです。
発生した例外に使用するハンドラーがない場合、複合ステートメントの実行が終了します。
例
以下の処置を実行する複合ステートメントが含まれている、プロシージャー本体を作成します。
- SQL 変数を宣言します。
- IN パラメーターによって判別される部門の従業員の給与を戻すカーソルを宣言します。
SELECT ステートメントで、
salary 列のデータ・タイプをDECIMAL から DOUBLE にキャストします。
- 条件 NOT FOUND (ファイル終わり) に EXIT ハンドラーを宣言します。これにより、
値 '6666' が OUT パラメーター medianSalary に割り当てられます。
- 指定された部門の従業員の数を SQL 変数 numRecords に選択します。
- 50% + 1 の従業員が検索されるまで、WHILE ループのカーソルから行を取り出します。
- 給与の中央値を戻します。
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
[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]