コンパウンド・ステートメント

変更の開始複合ステートメントは、SQLルーチンまたは高度なトリガー内で他のステートメントをグループ化します。変更の終わり 複合文では、SQL 変数、カーソル、条件ハンドラの宣言が可能です。

構文

構文図を読むビジュアルシンタックスダイアグラムをスキップするラベル:BEGINNOT ATOMICATOMICSQL-variable-declarationSQL-condition-declarationreturn-codes-declaration;statement-declaration;DECLARE-CURSOR-文;handler-declaration;SQL-procedure-statement;END ラベル

SQL変数宣言:

構文図を読むビジュアルシンタックスダイアグラムをスキップするDECLARE,SQL-variable-nameData-typeDEFAULT NULLCONSTANT NULLDEFAULTCONSTANT定数RESULT_SET_LOCATOR VARYING

SQL条件宣言:

構文図を読むビジュアルシンタックスダイアグラムをスキップするDECLARESQL-condition-nameCONDITIONFORSQLSTATEVALUEひもていすう

return-codes-declaration:

構文図を読むビジュアルシンタックスダイアグラムをスキップするDECLARE SQLSTATECHAR(5)CHARACTER(5)DEFAULT '00000'DEFAULTひもていすうSQLCODEINTEGERINTDEFAULT 0DEFAULT整数定数

宣言文:

構文図を読むビジュアルシンタックスダイアグラムをスキップするDECLARE,statement-nameSTATEMENT1
注:
  • 1 この文は、SQL関数のSQLルーチン本体では許可されていません。

ハンドラ宣言:

構文図を読むビジュアルシンタックスダイアグラムをスキップするDECLARECONTINUEEXITHANDLERFOR specific-condition-valuegeneral-condition-valueSQL-procedure-statement

特定条件値:

構文図を読むビジュアルシンタックスダイアグラムをスキップする,SQLSTATEVALUEひもていすうcondition-name

一般状態値:

構文図を読むビジュアルシンタックスダイアグラムをスキップする,SQLEXCEPTIONSQLWARNINGNOT FOUND

説明

label
compound-statement のラベルを指定します。 開始ラベルが指定されていると、これはコンパウンド・ステートメントの中で宣言される SQL 変数を修飾するために使用でき、また LEAVE ステートメントのターゲットとしても指定できます。 終了ラベルを指定する場合、これは開始ラベルと同じでなければなりません。 変更の開始ラベル名は、ルーチン名、トリガー名、または同じスコープ内の別のラベルと同じにすることはできません。変更の終わり
変更の開始ATOMIC or NOT ATOMIC変更の終わり
変更の開始FL 500 複合ステートメント内の未処理の例外条件によって、その複合ステートメントがロールバックされるかどうかを指定します。 拡張トリガー内の最外部のコンパウンド・ステートメントの場合、デフォルトは ATOMIC です。それ以外の場合、デフォルトは NOT ATOMIC です。
ATOMIC
ATOMIC は、コンパウンド・ステートメントの未処理の例外条件によってコンパウンド・ステートメントがロールバックされることを示します。 SQL スカラー関数内のコンパウンド・ステートメント、SQL プロシージャー、または ATOMIC として定義された別のコンパウンド・ステートメント内にネストされているコンパウンド・ステートメントに、ATOMIC を指定しないでください。
NOT ATOMIC
NOT ATOMIC は、compound-statement 内の未処理の例外条件によって compound-statement がロールバックされないことを示します。 NOT ATOMICは、高度なトリガーの最外側の複合ステートメントでは指定できません。
変更の終わり
SQL変数宣言
コンパウンド・ステートメントに対してローカルな変数を宣言します。
SQL変数名
変数の名前を定義します。 Db2 区切り文字のないすべてのSBCS SQL変数名を大文字に変換します。 SQL-variable-name は、それが宣言されているコンパウンド・ステートメント内で固有でなければなりません。ただし、そのコンパウンド・ステートメント内でネストされたコンパウンド・ステートメントに含まれる宣言は除きます。 SQL-variable-name は、パラメーター名と同じであってはなりません。 SQL PLのSQLパラメータと変数に関する参照を参照し、ステートメントに関与するSQL変数と同じ名前の列がある場合、またはルーチン・ボディに同じ名前の複数のSQL変数が存在する場合に、SQL変数名がどのように解決されるかを確認してください。

SQL-variable-name は、それが宣言されているコンパウンド・ステートメント (そのコンパウンド・ステートメント内でネストされたすべてのコンパウンド・ステートメントを含む) 内でのみ参照することができます。 変数が宣言されているコンパウンド・ステートメントにラベルがある場合、その変数名への参照はこのラベルで修飾することができます。 例えば、C というラベルが付けられたコンパウンド・ステートメント内で宣言されている SQL 変数 V は、C.V として参照できます。

データ・タイプ
変数のデータ・タイプと長さを指定します。 SQL 変数は、SQL ルーチン・パラメーターと同じデフォルトの長さおよび最大長の規則に従います。 SQLデータ型および長さの説明については、「CREATE FUNCTION文(コンパイルされたSQLスカラー関数 )」を参照してください。
変更の開始DEFAULT または CONSTANT変更の終わり
変更の開始FL 500 は、 SQL 変数が宣言されている複合ステートメントが入力されたときに、その SQL 変数の値を指定します。 DEFAULT と CONSTANT のいずれも指定されない場合は、SQL 変数のデフォルトは NULL 値です。 array-type-name が指定されている場合、DEFAULT NULL だけを明示的に指定できます。 XML データ・タイプの SQL 変数には、DEFAULT NULL と CONSTANT NULL のみを指定できます。
デフォルト
SQL 変数のデフォルトを定義します。 指定された定数は、「代入と比較」 で説明されている代入の規則に従って変数に代入できる値を表すものでなければなりません。
CONSTANT
SQL 変数に変更できない固定値があることを指定します。 CONSTANT を使用して定義された SQL 変数は、すべての割り当て操作のターゲットとして使用できません。 指定された定数は、「代入と比較」 で説明されている代入の規則に従って変数に代入できる値を表すものでなければなりません。

SQLCODE および SQLSTATE という名前の変数は、CONSTANT を使用して定義できません。

ヌル
SQL 変数のデフォルト値として NULL を指定します。
定数 (Constant)
SQL 変数のデフォルト値として定数を指定します。
変更の終わり
RESULT_SET_LOCATOR VARYING
結果セット・ロケーター変数のデータ・タイプを指定します。
SQL条件宣言
条件名および対応する SQLSTATE 値を宣言します。
SQL条件名
条件の名前を指定します。 条件名は、それが宣言されているコンパウンド・ステートメント内で固有でなければなりません。ただし、そのコンパウンド・ステートメント内でネストされたコンパウンド・ステートメントに含まれる宣言は除きます。 条件名は、それが宣言されたコンパウンド・ステートメント内でのみ参照が可能です。コンパウンド・ステートメント内でネストされたコンパウンド・ステートメントも同様です。
FOR SQLSTATE ひもていすう
条件に関連付ける SQLSTATE を指定します。 このストリングは単一引用符で囲んだ 5 文字で指定する必要があります。SQLSTATE クラス (最初の 2 文字) は「00」であってはなりません。
リターンコード宣言
SQLSTATE および SQLCODE という名前の特殊変数を宣言します。 これらの変数は、GET DIAGNOSTICS 以外の SQL ステートメントまたは空のコンパウンド・ステートメントの実行後に、診断領域内の最初の条件に対して SQLSTATE 値および SQLCODE 値に自動設定されます。

SQLSTATE 変数および SQLCODE SQL 変数の使用目的は、直前の SQL ステートメント (GET DIAGNOSTICS 以外) の処理の結果としての SQL 戻りコードを入手する手段として使うことに限られます。 SQLSTATE 変数および SQLCODE 変数を使用する意図がある場合は、直ちにその値を別の SQL 変数に保管して、次の SQL ステートメントの実行後に戻される SQL 戻りコードによって、その値が置き換えられるのを防ぐ必要があります。 SQLSTATE を処理するハンドラーが定義されている場合は、割り当てステートメントを使用して、その SQLSTATE (または、関連の SQLCODE) 値を別の SQL 変数に保管することができます (割り当てがそのハンドラーの最初の引数である場合)。

これらの変数への割り当ては禁止されていませんが、お勧めできません。 これらの変数への割り当ては例外ハンドラーによって無視されます。これらの特殊変数への割り当てを処理すると、割り当てに指定した値が、その割り当てを行うステートメントの実行から戻される SQL 戻りコードで上書きされてしまいます。 SQLSTATE 変数および SQLCODE SQL 変数は、NULL に設定することはできません。

宣言文
コンパウンド・ステートメントの 1 つ以上のローカルの名前を宣言します。 ステートメント名は、同じコンパウンド・ステートメント内にある別のステートメント名と同じであってはなりません。
DECLARE-CURSOR-文
プロシージャー本体内のカーソルを宣言します。 各カーソルは、そのルーチン内で固有の名前を持っていなければなりません。 カーソルは、それが宣言されているコンパウンド・ステートメント (そのコンパウンド・ステートメント内でネストされたすべてのコンパウンド・ステートメントを含む) 内からのみ参照することができます。 カーソルをオープンするには OPEN ステートメントを使用し、カーソルから行を読み取るには FETCH ステートメントを使用し、カーソルをクローズするには CLOSE ステートメントを使用します。 そのカーソルを結果セット・カーソルとして使用する予定の場合は、以下のようにします。
  • カーソルの宣言時に WITH RETURN を指定する。
  • 非ゼロ値を持つ DYNAMIC RESULT SETS 文節を使用してプロシージャーを作成する。
  • コンパウンド・ステートメント内でカーソルの CLOSE ステートメントを指定しない。
カーソルの宣言に関する追加情報については、「DECLARE CURSOR ステートメント」 を参照してください。
ハンドラ宣言
条件処理ルーチン (compound-statementで例外条件または完了条件が発生したときに実行する SQL-procedure-statement) を指定します。 条件ハンドラーが制御を受け取ると SQL-procedure-statement が実行されます。

条件ハンドラーの宣言では、同じ条件値または SQLSTATE 値を複数回参照することはできません。 また、同じ SQLSTATE 値を表している SQLSTATE 値と条件名を共に参照することはできません。

1 つのコンパウンド・ステートメント内で複数の条件ハンドラーを宣言する場合、2 つの条件ハンドラー宣言で同じ内容を指定することはできません。

  • 汎用条件カテゴリー
  • 特定条件 (同じ値を表す SQLSTATE 値または条件名のいずれかとして)

条件ハンドラーは、その条件ハンドラーを宣言したコンパウンド・ステートメント (ネストされたコンパウンド・ステートメントを含む) 内の条件ハンドラー宣言の後続の SQL-procedure-statements のセットに対してアクティブです。

CONTINUE
条件ハンドラーがアクティブ化されて正常終了した後、この条件を引き起こしたステートメント に続く SQL ステートメントに制御を戻すことを指示します。 ただし、条件がエラー条件であり、それが検索条件の評価中に検出された場合には (CASE、FOR、IF、REPEAT、または WHILE ステートメントの場合のように)、制御は対応する END CASE、END FOR、END IF、END REPEAT、または END WHILE の後続のステートメントに戻されます。
EXIT
条件ハンドラーがアクティブ化されて正常終了した後、条件ハンドラーを宣言したコンパウンド・ステートメントの末尾に制御を戻すことを指定します。

ハンドラーが制御を獲得する条件は以下の通りです。

SQLSTATE ひもていすう
特定の SQLSTATE が発生したときにハンドラーを呼び出すことを指定します。 SQLSTATE 値の先頭 2 文字は '00' にしないでください。
SQL条件名
その条件名に関連した特定の SQLSTATE が発生したときにハンドラーを呼び出すことを指定します。 SQL-condition-name は、ハンドラー宣言を含むコンパウンド・ステートメント内、またはそのコンパウンド・ステートメントがネストされているコンパウンド・ステートメント内で宣言されていることが必要です。
SQLEXCEPTION
SQLEXCEPTION が発生したときにハンドラーを呼び出すよう指定します。 SQLEXCEPTION はクラス・コードが「00」、「01」、または「02」以外の値である SQLSTATE です。 SQLSTATE値の詳細については、「SQLSTATE値と一般的なエラーコード 」を参照してください。
SQLWARNING
SQLWARNING が発生したときにハンドラーを呼び出すよう指定します。 SQLWARNING は「01」のクラス・コードをもつ SQLSTATE 値です。
NOT FOUND
NOT FOUND 条件が発生した場合に呼び出されるハンドラーを指定します。 NOT FOUND は、「02」のクラス・コードをもつ SQLSTATE 値に対応します。

ホスト変数と違い、SQL 変数が SQL ステートメントで使用される際、 前にはコロンは付きません。

コンパウンド・ステートメントのネスト: コンパウンド・ステートメントはネストすることができます。 ネストされたコンパウンド・ステートメントを使用することにより、変数定義、条件名、条件ハンドラー、およびカーソルの有効範囲を、ルーチン内のステートメントの一部まで対象にすることができます。 これによって、各 SQL ルーチン・ステートメントの処理を単純化することができます。 ネストされたコンパウンド・ステートメントにより、条件ハンドラーの宣言内でコンパウンド・ステートメントを使用することが可能になります。

カーソルの有効範囲: カーソル名の有効範囲は、それが宣言されているコンパウンド・ステートメントです。これには、そのコンパウンド・ステートメント内でネストされたすべてのコンパウンド・ステートメントが含まれます。 カーソル名は、それが宣言されたコンパウンド・ステートメント内でのみ参照が可能です。コンパウンド・ステートメント内でネストされたコンパウンド・ステートメントも同様です。

statement-name に関する考慮事項: コンパウンド・ステートメント内で宣言された statement-name の有効範囲は、そのコンパウンド・ステートメントとネストされたすべてのコンパウンド・ステートメントです (同じ statement-name がネストされたコンパウンド・ステートメント内で宣言されていない限り)。 statement-name が DECLARE CURSOR ステートメントまたは PREPARE ステートメントで使用され、かつ、それが使用されているコンパウンド・ステートメント内またはそれがネストされている 外部コンパウンド・ステートメント内で宣言されていない場合、その statement-name はルーチンに対してグローバルに宣言されたものと想定されます。

条件処理ルーチン: 変更の開始SQL ルーチンおよび拡張トリガーの条件ハンドラーは、外部 SQL アプリケーション・プログラムで使用される WHENEVER ステートメントに似ています。 条件ハンドラーは、例外条件、警告条件、または NOT FOUND 条件が発生したときに 自動的に制御を取得するように定義できます。 条件ハンドラーの本体には、その条件ハンドラーがアクティブ化されたときに実行されるコードが入っています。 条件ハンドラは、 Db2 によって返されるSQLステートメントの処理における例外、警告、または見つからない状態の結果として起動することができます。 あるいは、ハンドラを起動する条件は、SQL ルーチンまたはトリガの本体内で発行された SIGNAL または RESIGNAL 文の結果である場合もあります。変更の終わり

条件ハンドラーは、 コンパウンド・ステートメント内で宣言されます。また、その条件ハンドラーが宣言されているコンパウンド・ステートメント内のすべての条件ハンドラー宣言の後続の SQL-procedure-statements のセットに対してアクティブです。 例えば、条件ハンドラー H の有効範囲は、H が宣言されたコンパウンド・ステートメントに含まれている条件ハンドラー宣言の後に続く SQL-procedure-statements のリストです。 これは、条件ハンドラー H の本体に入っているステートメントは、H の有効範囲に含まれないことを意味しており、このことは、条件ハンドラーは自分の本体内部で発生した条件は処理できないことを示しています。 同様に、同じコンパウンド・ステートメント内で宣言された 2 つの条件ハンドラー H1 と H2 の場合、H1 は H2 の本体内で発生した条件は処理せず、H2 は H1 の本体内で発生した条件は処理しません。

条件ハンドラーの宣言では、 ハンドラーをアクティブ化する条件、条件ハンドラーのタイプ (CONTINUE または EXIT)、およびハンドラーのアクションを指定します。 条件ハンドラーのタイプは、ハンドラーのアクションが正常に完了した後に制御を戻す場所を決めます。

条件ハンドラーのアクティブ化: SQL-procedure-statement の処理時に正常終了以外の条件が発生した場合、 その条件を処理できる条件ハンドラーが有効範囲内に存在すれば、それらの条件ハンドラーの 1 つがアクティブ化されて、条件を処理します。

ネストされたコンパウンド・ステートメントを持つルーチンの場合、 特定の条件を処理できる条件ハンドラーが、いくつかのレベルのネストされたコンパウンド・ステートメント内に存在する可能性があります。 アクティブ化される条件ハンドラーは、 条件が検出された有効範囲に対して最も内側で宣言されている条件ハンドラーです。 ネスト・レベルにある複数の条件ハンドラーが条件を処理できる場合、 アクティブ化される条件ハンドラーは、そのコンパウンド・ステートメント内で宣言されている最も適切なハンドラーです。

最も適切なハンドラーとは、SQLSTATE、例外条件、 または完了条件が最も一致している条件ハンドラーです。 指定のコンパウンド・ステートメントで、同じ条件に対応する特定条件ハンドラーと汎用ハンドラーの両方が宣言されている場合、 固有のハンドラーが汎用のハンドラーより優先されます。

例えば、最も内側のコンパウンド・ステートメントが SQLSTATE「22001」用の特定ハンドラーと 汎用ハンドラー SQLEXCEPTION を宣言している場合、SQLSTATE「22001」が検出されたときには、SQLSTATE「22001」用の固有のハンドラーが最も適切なハンドラーとなります。 このケースでは、特定ハンドラーがアクティブ化されます。

条件ハンドラーがアクティブ化されると、 その条件ハンドラーのアクションが実行されます。 ハンドラーのアクションが正常終了するか、または未処理警告を出して終了した場合、 診断領域がクリアされ、条件ハンドラーのタイプ (CONTINUE または EXIT ハンドラー) によって制御を戻す場所が決まります。 さらに、ハンドラーが正常終了するか、未処理警告を出して終了すると、SQLSTATE 変数および SQLCODE SQL 変数もクリアされます。

ハンドラーのアクションが正常終了しない場合、 ハンドラーのアクション内で検出された条件用の適切なハンドラーが存在すれば、その条件ハンドラーがアクティブ化されます。 存在しない場合は、条件ハンドラー内で検出された条件は未処理となります。

未処理の条件: 条件が検出され、その条件用の適切なハンドラーが存在しない場合、その条件は未処理となります。

  • 変更の開始未処理の条件が例外条件である場合、失敗したステートメントを含んでいる SQL ルーチンまたは拡張トリガーは、未処理例外条件により終了します。変更の終わり
  • 未処理の条件が警告条件または NOT FOUND 条件の場合は、その次のステートメントの処理が続行されます。 次の SQL ステートメントを処理すると、 診断領域内の未処理条件に関する情報が上書きされ、未処理条件の形跡がなくなってしまうことに注意してください。

    変更の開始SQL ルーチンまたは拡張トリガーが未処理の警告または未検出状態の処理を完了した場合、条件が呼び出し元ステートメントに返されます。 基本トリガーが未処理の警告または未検出状態の処理を完了した場合は、条件は呼び出し元ステートメントに返されません。変更の終わり

ネストされたコンパウンド・ステートメントで SIGNAL および RESIGNAL ステートメントを使用する場合の考慮事項: 条件ハンドラーに 指定された SQL-procedure-statement が、例外 SQLSTATE を指定した SIGNAL ステートメントまたは RESIGNAL ステートメントである場合、コンパウンド・ステートメントは、指定の例外により終了します。 これは、この条件ハンドラーまたは同じコンパウンド・ステートメント内の別の条件ハンドラーが CONTINUE を指定している場合でも起こります。これらの例外ハンドラーは、この例外の有効範囲内にないからです。 コンパウンド・ステートメントが別のコンパウンド・ステートメント内にネストされている場合、上位レベルのコンパウンド・ステートメント内の条件ハンドラーはその例外を処理できます。それらの条件ハンドラーはその例外の有効範囲内にあるからです。

変更の開始SQLルーチンおよび高度なトリガにおけるSQLSTATEおよびSQLCODE変数 :SQLルーチンおよび高度なトリガのデバッグを支援するために、ステートメントを実行した後にSQLSTATEおよびSQLCODEの値を確認することが役立つ場合があります。 SQLCODE 変数または SQLSTATE 変数は、SQL ルーチンまたは拡張トリガーで宣言し、以後は SQL ルーチンまたは拡張トリガー内で参照することができます。 SQL ルーチンまたは拡張トリガー内のさまざまなポイントで SQLCODE および SQLSTATE の値を表に挿入したり、SQLCODE 値や SQLSTATE 値を診断ストリングに入れて SQL プロシージャーの OUT パラメーターとして返したりすることができます。 SQLCODE 値および SQLSTATE 値を使用するには、以下の SQL 変数を SQL ルーチンまたは拡張トリガーの本体で宣言する必要があります。 変更の終わり

変更の開始SQL ルーチンまたは高度なトリガーで SQLCODE 変数または SQLSTATE 変数を参照すると、 Db2 はその後のステートメントの SQLCODE の値を 0 に、SQLSTATE の値を '00000' に設定します。 CONTINUE 条件処理ルーチンを使用して、SQLSTATE 変数および SQLCODE 変数の値を、SQL ルーチンまたは拡張トリガーの本体内の SQL 変数に割り当てることもできます。 その後、これらの SQL 変数を使って、ルーチンまたはトリガーのロジックを制御したり、その値を出力パラメーターとして受け渡したりすることができます。 次の例では、SQL ルーチンは、RETCODE と呼ばれる SQL 変数に SQLCODE を設定して、各 SQL ステートメントの後続のステートメントに制御を戻します。 変更の終わり

DECLARE SQLCODE INTEGER DEFAULT 0;
DECLARE retcode INTEGER DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET retcode = SQLCODE;
DECLARE CONTINUE HANDLER FOR SQLWARNING SET retcode = SQLCODE;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET retcode = SQLCODE;

コンパウンド・ステートメント自体は、SQLSTATE 変数および SQLCODE SQL 変数に影響を与えません。 ただし、コンパウンド・ステートメント内にある SQL ステートメントは、SQLSTATE 変数 および SQLCODE SQL 変数に影響する可能性があります。 コンパウンド・ステートメントの終了時に、SQLSTATE 変数 および SQLCODE SQL 変数には、これらの変数に対して変更を行ったコンパウンド・ステートメント内で実行された、最後の SQL ステートメントの結果が反映されます。 コンパウンド・ステートメント内で SQLSTATE 変数 および SQLCODE SQL 変数が変更されなかった場合は、それらの変数はそのコンパウンド・ステートメントの実行が開始された時点の値と同じ値を保持します。

SQL パラメーターおよび SQL 変数内の NULL 値: SQL パラメーターまたは SQL 変数の値が NULL であり、それが標識変数を許可しない SQL ステートメント内で使用されている場合、エラーが戻されます。

オープン・カーソルに対する影響: コンパウンド・ステートメントの最後に、そのコンパウンド・ステートメントに宣言されているオープン・カーソルは、結果セットを戻すために使用されるカーソルを除いて、すべてクローズされます。

コンパウンド・ステートメントのアトミック処理: アトミック処理は、コンパウンド・ステートメントに対してはサポートされません。 コンパウンド・ステートメント内のコード・ブロックに対してアトミック動作が必要な場合は、ネストされたコンパウンド・ステートメントに入る前に、セーブポイントを設定してください。 これにより、ROLLBACK TO SAVEPOINT ステートメントを使用して変更を取り消すことが可能になります。

例 1: 以下のアクションを実行するコンパウンド・ステートメントを使ってプロシージャー本体を作成します。

  1. SQL 変数を宣言する。
  2. IN パラメーターによって判別される部門の従業員の給与を戻すカーソルを宣言します。
  3. 条件 NOT FOUND (ファイルの終わり) の EXIT ハンドラーを宣言します。 ハンドラーの SQL プロシージャー・ステートメントは、値 6666 を OUT パラメーター medianSalary に割り当てます。
  4. 指定された部門の従業員の数を SQL 変数 v_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 salary 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
変更の開始例2: エラー、警告、またはデータの終了の場合に、終了ハンドラを定義します。 このプロシージャーが正常に呼び出されると、出力パラメーターに値 45000 が戻されます。
CREATE PROCEDURE JMBLIB.PROCL(OUT MEDIANSALARY INT)
  LANGUAGE SQL
  BEGIN
   DECLARE CHAR1 CHAR;
   DECLARE C1 CURSOR FOR SELECT * 
     FROM SYSIBM.SYSDUMMY1;
   DECLARE EXIT HANDLER FOR NOT FOUND, 
        SQLEXCEPTION, 
        SQLWARNING
    RETURN;
   OPEN C1;
   FETCH C1 INTO CHAR1;
   SET MEDIANSALARY = 45000;
   FETCH C1 INTO CHAR1;
   SET MEDIANSALARY = 50000;
  END
変更の終わり