コンパウンド SQL (コンパイル済み) ステートメント

コンパウンド SQL (コンパイル済み) ステートメントには、SQL 制御ステートメントと SQL ステートメントを含めることができます。 コンパウンド SQL (コンパイル済み) ステートメントを使用すると、変数、条件、カーソル、およびハンドラーに関してローカルな有効範囲を指定して実行する一連の SQL ステートメントにより、プロシージャー・ロジックを実装できます。

呼び出し

このステートメントはトリガー、SQL 関数、または SQL プロシージャーに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 このステートメントは、動的に作成できる実行可能ステートメントです。

許可

select-statement を使用する cursor-value-constructor を指定している SQL-variable-declaration の場合、ステートメントの許可 ID が select-statement の実行に必要な特権を持つ必要があります。 『SQL 照会』の許可セクションを参照してください。

ステートメントの許可 ID によって保持される特権には、コンパウンド・ステートメントに指定されている SQL ステートメントを呼び出すために必要なすべての特権も含まれていなければなりません。

コンパウンド・ステートメントの本体内で指定された SQL オブジェクトについては、PUBLIC グループ特権のみが考慮されます。

構文

Read syntax diagramSkip visual syntax diagramlabel:BEGINNOT ATOMICATOMICtype-declaration;SQL-variable-declarationcondition-declarationreturn-codes-declaration;statement-declaration;DECLARE-CURSOR-statement;procedure-declaration;handler-declaration;SQL-procedure-statement;END label
type-declaration
Read syntax diagramSkip visual syntax diagramDECLARE TYPEtype-nametype-nameTYPE AS array-type-definitiondistinct-type-definitionrow-type-definition
array-type-definition
Read syntax diagramSkip visual syntax diagramdata-type1ARRAY[ 2147483647integer-constantdata-type2 ]
data-type1
Read syntax diagramSkip visual syntax diagrambuilt-in-typeanchored-data-typerow-type-name
built-in-type
Read syntax diagramSkip visual syntax diagramSMALLINTINTEGERINTBIGINTDECIMALDECNUMERICNUM(5,0)( integer,0, integer)FLOAT(53)( integer)REALDOUBLEPRECISIONDECFLOAT(34)(16)CHARACTERCHAR(1)( integerOCTETSCODEUNITS32)VARCHARCHARACTERCHARVARYING( integerOCTETSCODEUNITS32)FOR BIT DATA1CLOBCHARACTERCHARLARGE OBJECT(1M)( integerKMGOCTETSCODEUNITS32)GRAPHIC(1)( integerCODEUNITS16CODEUNITS32)VARGRAPHIC( integerCODEUNITS16CODEUNITS32)DBCLOB(1M)( integerKMGCODEUNITS16CODEUNITS32)BINARY(1)( integer)VARBINARYBINARY VARYING(integer)BLOBBINARY LARGE OBJECT(1M)( integerKMG)DATETIMETIMESTAMP(6)(integer)XMLBOOLEANCURSOR
anchored-data-type
Read syntax diagramSkip visual syntax diagramANCHORDATA TYPE TO variable-nametable-name.column-nameROWOFtable-nameview-namecursor-variable-name
data-type2
Read syntax diagramSkip visual syntax diagramINTEGERINTVARCHARCHARACTERCHARVARYING(integer)anchored-non-row-data-type
anchored-non-row-data-type
Read syntax diagramSkip visual syntax diagramANCHORDATA TYPE TO variable-nametable-name.column-name
distinct-type-definition
Read syntax diagramSkip visual syntax diagramsource-data-typeWITH WEAK TYPE RULES NOT NULL CHECK(check-condition)
source-data-type
Read syntax diagramSkip visual syntax diagram built-in-typeanchored-non-row-data-type
row-type-definition
Read syntax diagramSkip visual syntax diagramROW (,field-namedata-type3)anchored-row-data-type
data-type3
Read syntax diagramSkip visual syntax diagrambuilt-in-typeanchored-non-row-data-typedistinct-type-name
anchored-row-data-type
Read syntax diagramSkip visual syntax diagramANCHORDATA TYPE TO variable-nameROWOFtable-nameview-namecursor-variable-name
SQL-variable-declaration
Read syntax diagramSkip visual syntax diagramDECLARE,SQL-variable-namedata-type4DEFAULT NULLCONSTANT NULLDEFAULTCONSTANTconstant(cursor-value-constructor)2RESULT_SET_LOCATORVARYING
data-type4
Read syntax diagramSkip visual syntax diagrambuilt-in-typeanchored-data-typearray-type-name3cursor-type-namedistinct-type-namerow-type-name4
cursor-value-constructor
Read syntax diagramSkip visual syntax diagramCURSOR (,cursor-parameter-declaration) holdability FOR select-statementstatement-name5
cursor-parameter-declaration
Read syntax diagramSkip visual syntax diagramparameter-namedata-type5
data-type5
Read syntax diagramSkip visual syntax diagrambuilt-in-typeanchored-non-row-data-typedistinct-type-name
holdability
Read syntax diagramSkip visual syntax diagramWITHOUT HOLDWITH HOLD
condition-declaration
Read syntax diagramSkip visual syntax diagramDECLAREcondition-nameCONDITION FORSQLSTATEVALUEstring-constant
statement-declaration
Read syntax diagramSkip visual syntax diagramDECLARE ,statement-name STATEMENT
return-codes-declaration
Read syntax diagramSkip visual syntax diagramDECLARESQLSTATECHARACTER(5)CHAR(5)DEFAULT '00000'DEFAULTstring-constantSQLCODEINTEGERINTDEFAULT 0DEFAULTinteger-constant
procedure-declaration
Read syntax diagramSkip visual syntax diagramDECLARE PROCEDUREprocedure-nameprocedure-namePROCEDURE ( ,parameter-declaration )SQL-procedure-body
SQL-procedure-body
Read syntax diagramSkip visual syntax diagramSQL-procedure-statement
handler-declaration
Read syntax diagramSkip visual syntax diagramDECLARECONTINUEEXITUNDOHANDLERFOR specific-condition-valuegeneral-condition-value SQL-procedure-statement
specific-condition-value
Read syntax diagramSkip visual syntax diagram,SQLSTATEVALUEstring-constantcondition-name
general-condition-value
Read syntax diagramSkip visual syntax diagram,SQLEXCEPTIONSQLWARNINGNOT FOUND
SQL-procedure-statement
Read syntax diagramSkip visual syntax diagramlabel:SQL-statement
Notes:
  • 1 The FOR BIT DATA clause can be specified in any order with the other column constraints that follow. The FOR BIT DATA clause cannot be specified with string units CODEUNITS32 (SQLSTATE 42613).
  • 2 If data-type4 specifies a CURSOR built-in type or cursor-type-name, only NULL or cursor-value-constructor can be specified. Only DEFAULT NULL can be explicitly specified for array-type-name or row-type-name .
  • 3 Only DEFAULT NULL can be explicitly specified for array-type-name.
  • 4 Only DEFAULT NULL can be explicitly specified for row-type-name.
  • 5 statement-name cannot be specified if cursor-parameter-declaration is specified.

説明

label
コード・ブロックのラベルを定義します。 開始ラベルを指定した場合、そのラベルを使用して、 コンパウンド・ステートメントで宣言する SQL 変数を修飾することができます。 また、開始ラベルは LEAVE ステートメントで指定することもできます。 終了ラベルを指定する場合、そのラベルは開始ラベルと同じでなければなりません。
ATOMIC または NOT ATOMIC
ATOMIC は、コンパウンド・ステートメントで未処理の例外条件が発生したときに、 そのコンパウンド・ステートメント内のすべての SQL ステートメントをロールバックします。

NOT ATOMIC は、コンパウンド・ステートメントで未処理の例外条件が発生しても、 そのコンパウンド・ステートメントをロールバックしません。

モジュール内にない動的に作成されるコンパウンド・ステートメントまたは SQL 関数で ATOMIC キーワードが指定されると、コンパウンド・ステートメントはコンパウンド SQL (インライン化) ステートメントとして処理されます。

モジュール表関数の関数本体で使用されるコンパウンド・ステートメントは、NOT ATOMIC としてのみ定義できます。

type-declaration
コンパウンド・ステートメントに対してローカルなユーザー定義データ・タイプを宣言します。
type-name
ローカルなユーザー定義データ・タイプの名前を指定します。 この名前は、現行コンパウンド・ステートメントの中で宣言されたその他のタイプと同じにすることはできません (SQLSTATE 42734)。 非修飾の type-name には、いずれかの CREATE TYPE ステートメントで記述された制限と同じ制限があります (SQLSTATE 42939)。
array-type-definition
type-name に関連付ける配列データ・タイプの属性を指定します。 構文エレメントの説明については、「CREATE TYPE (配列)」 を参照してください。 row-type-name は、既に宣言されていて、現在のコンパウンド SQL (コンパイル済み) ステートメントのスコープに含まれる宣言済み行タイプを参照できます。 anchored-data-type 節で指定される variable-name は、現在のコンパウンド SQL (コンパイル済み) ステートメントのスコープに含まれるローカル変数を参照できます。
distinct-type-definition
type-name に関連付ける、緩やかに型付けされた特殊タイプのソース・タイプとオプションのデータ・タイプ制約を指定します。 構文エレメントの詳細な説明については、『CREATE TYPE (特殊)』を参照してください。 anchored-non-row-data-type 節で指定されている variable-name は、現在のコンパウンド SQL (コンパイル済み) ステートメントの有効範囲内のローカル変数を参照できます。 アンカーである variable-name または column-name のデータ・タイプは、組み込みデータ・タイプでなければなりません。
row-type-definition
type-name に関連付ける行データ・タイプのフィールドを指定します。 構文エレメントの詳細については、「CREATE TYPE (行)」 を参照してください。 anchored-non-row-data-type 節または anchored-row-data-type 節で指定される variable-name は、現在のコンパウンド SQL (コンパイル済み) ステートメントのスコープに含まれるローカル変数を参照できます。
SQL-変数-宣言
コンパウンド・ステートメントに対してローカルな変数を宣言します。
SQL 変数名 (SQL-variable-name)
ローカル変数の名前を定義します。 すべての SQL 変数名は大文字に変換されます。 この名前は、同じコンパウンド・ステートメント内にある別の SQL 変数と同じにすることはできず、 パラメーター名と同じにすることもできません。 SQL 変数名は、列名と同じであってはなりません。 SQL 変数および列参照と同じ名前の ID が SQL ステートメントに含まれている場合、 その ID は列と解釈されます。 変数が宣言されているコンパウンド・ステートメントにラベルを付けると、変数に対する参照をラベルで修飾できます。 例えば、ラベル C を付けたコンパウンド・ステートメント中で変数 V を宣言すると、その変数を C.V として参照できます。
data-type4
変数のデータ・タイプを指定します。 構造化タイプまたは参照タイプを指定することはできません (SQLSTATE 429BB)。
組み込みタイプ (built-in-type)
組み込みデータ・タイプを指定します。 BOOLEAN および CURSOR (表には指定できない) を除く各組み込みデータ・タイプの詳細な説明は、『CREATE TABLE』を参照してください。 トリガーまたは関数内で使用される、あるいはスタンドアロン・ステートメントとして使用されるコンパウンド SQL (コンパイル済み) ステートメント内では、XML データ・タイプは指定することはできません (SQLSTATE 429BB)。 コンパウンド SQL (コンパイル済み) ステートメントが SQL プロシージャー本体で使用される場合、XML データ・タイプは指定されます。
BOOLEAN
Boolean を示します。
CURSOR
カーソルを示します。
アンカー・データ・タイプ
SQL 変数のデータ・タイプを決定するために使用される別のオブジェクトを指定します。 アンカー・オブジェクトのデータ・タイプには、データ・タイプを直接指定する際に (行の場合は行タイプを作成する際に) 適用されるのと同じ制限があります。
ANCHOR DATA TYPE TO
データ・タイプの指定にアンカー・データ・タイプを使用することを示します。
variable-name
SQL 変数、SQL パラメーター、またはグローバル変数を指定します。 参照される変数のデータ・タイプが、SQL-variable-name のデータ・タイプとして使用されます。
table-name.column-name
既存の表またはビューの列名を指定します。 列のデータ・タイプが、SQL-variable-name のデータ・タイプとして使用されます。
ROW OF table-name または view-name
table-name で識別される表、または view-name で識別されるビューの列名および列データ・タイプを基にした名前とデータ・タイプを含むフィールドの行になるように指定します。 SQL-variable-name のデータ・タイプは、名前の付いていない行タイプです。
行の終わり cursor-variable-name
cursor-variable-name で識別されるカーソル変数のフィールド名およびフィールド・データ・タイプを基にした名前とデータ・タイプを含めて、フィールドの行を指定します。 指定するカーソル変数は、以下のいずれかのエレメントでなければなりません (SQLSTATE 428HS)。
  • 厳密に型付けされたカーソル・データ・タイプの SQL 変数またはグローバル変数
  • すべての結果列が指定されている select-statement を指定した CONSTANT 節を使用して作成または宣言された、緩やかに型付けされたカーソル・データ・タイプを持つ SQL 変数またはグローバル変数。
カーソル変数のカーソル・タイプが、名前指定された行タイプを使用して厳密に型付けされていない場合、SQL-variable-name のデータ・タイプは、名前なしの行タイプになります。
配列タイプ名 (array-type-name)
ユーザー定義の配列タイプの名前を指定します。 配列データ・タイプは、ローカルに宣言されたデータ・タイプ、スキーマ・データ・タイプ、またはモジュール・データ・タイプにすることができます。
カーソル・タイプ名
カーソル・タイプの名前を指定します。 カーソル・データ・タイプは、スキーマ・データ・タイプまたはモジュール・データ・タイプにすることができます。
特殊タイプ名 (distinct-type-name)
特殊タイプの名前を指定します。 特殊データ・タイプは、スキーマ・データ・タイプまたはモジュール・データ・タイプにすることができます。 宣言された変数の長さ、精度、および位取りは、それぞれ特殊タイプのソース・タイプの長さ、精度、および位取りになります。
行 (ROW) 型名
ユーザー定義の行タイプの名前を指定します。 行データ・タイプは、ローカルに宣言されたデータ・タイプ、スキーマ・データ・タイプ、またはモジュール・データ・タイプにすることができます。 変数のフィールドは、行タイプのフィールドです。
DEFAULT または CONSTANT
コンパウンド SQL (コンパイル済み) ステートメントが参照される際の SQL 変数の値を指定します。 いずれも指定されない場合は、SQL 変数のデフォルトは NULL 値です。 array-type-name または row-type-name の指定時には、DEFAULT NULL のみ明示的に指定できます。
DEFAULT
SQL 変数のデフォルトを定義します。 コンパウンド SQL (コンパイル済み) ステートメントが参照されると、この変数は初期化されます。 デフォルト値は、その変数のデータ・タイプと割り当てに互換性があるものでなければなりません。
CONSTANT
SQL 変数に変更できない固定値があることを指定します。 CONSTANT を使用して定義された SQL 変数は、すべての割り当て操作のターゲットとして使用できません。 固定値は、その変数のデータ・タイプと割り当てに互換性があるものでなければなりません。
ヌル
SQL 変数のデフォルト値として NULL を指定します。
constant
SQL 変数のデフォルト値として定数を指定します。 data-type4 が CURSOR 組み込みタイプまたは cursor-type-name を指定している場合は、constant を指定できません (SQLSTATE 42601)。
cursor-value-constructor
cursor-value-constructor には、SQL 変数に関連付けられている select-statement を指定します。 cursor-value-constructor をカーソル変数に割り当てると、そのカーソル変数の基礎カーソルが定義されます。
カーソル・パラメーター宣言
各パラメーターの名前およびデータ・タイプを含む、カーソルの入力パラメーターを指定します。 名前付き入力パラメーターは、select-statementcursor-value-constructor に指定する場合にだけ指定できます (SQLSTATE 428HU)。
parameter-name
select-statement内で SQL 変数として使用する cursor パラメーターを指定します。 この名前は、カーソルの他のすべてのパラメーター名と同じにすることはできません。 また、この名前は、列名がパラメーター名の前に解決されるため、select-statement で使用できるすべての列名と同じにならないように選択しなければなりません。
data-type5
select-statement内で使用される カーソル・パラメーター のデータ・タイプを指定します。 構造化タイプおよび参照タイプを指定することはできません (SQLSTATE 429BB)。
組み込みタイプ (built-in-type)
組み込みデータ・タイプを指定します。 各組み込みデータ・タイプの詳細な説明は、『CREATE TABLE』を参照してください。 BOOLEAN および CURSOR 組み込みタイプを指定することはできません (SQLSTATE 429BB)。
アンカー非行データ・タイプ (anchored-non-row-data-type)
カーソル・パラメーターのデータ・タイプを決定するために使用される別のオブジェクトを指定します。 アンカー・オブジェクトのデータ・タイプには、データ・タイプを直接的に指定する際に適用されるのと同じ制限があります。
ANCHOR DATA TYPE TO
データ・タイプの指定にアンカー・データ・タイプを使用することを示します。
variable-name
ローカルの SQL 変数、SQL パラメーター、またはグローバル変数を指定します。 参照される変数のデータ・タイプが、カーソル・パラメーターのデータ・タイプとして使用されます。
table-name.column-name
既存の表またはビューの列名を指定します。 列のデータ・タイプが、カーソル・パラメーターのデータ・タイプとして使用されます。
特殊タイプ名 (distinct-type-name)
特殊タイプの名前を指定します。 distinct-type-name がスキーマ名なしで指定される場合、SQL パスでスキーマを検索することにより、特殊タイプは解決されます。
保持可能性
コミット操作の結果としてカーソルをクローズすることを回避するかどうかを指定します。 詳しくは、『DECLARE CURSOR』を参照してください。 デフォルトは WITHOUT HOLD です。
WITHOUT HOLD
コミット操作の結果としてカーソルをクローズすることを回避しません。
WITH HOLD
複数の作業単位を通してリソースを維持します。 コミット操作の結果としてカーソルをクローズすることを回避します。
選択ステートメント
カーソルの SELECT ステートメントを指定します。 詳しくは、『select-statement』を参照してください。 cursor-parameter-declarationcursor-value-constructor に含まれている場合は、select-statement にはローカルの SQL 変数またはルーチンの SQL パラメーターを含めてはなりません (SQLSTATE 42704)。
ステートメント名
カーソルの準備済み select-statement を指定します。 準備済みステートメントの説明については『PREPARE』を参照してください。 ターゲットのカーソル変数には、厳密に型付けされたユーザー定義のカーソル・タイプのデータ・タイプがあってはなりません (SQLSTATE 428HU)。 statement-name を指定する場合は、名前付き入力パラメーターを cursor-value-constructor に指定してはなりません (SQLSTATE 428HU)。
RESULT_SET_LOCATOR VARYING
結果セット・ロケーター変数のデータ・タイプを指定します。
条件宣言
条件名を宣言します。オプションで、関連付ける SQLSTATE 値を指定できます。
条件名
条件の名前を指定します。 条件名は、それが宣言されるコンパウンド・ステートメント内で固有でなければなりません。ただし、そのようなコンパウンド・ステートメント内でネストされたコンパウンド・ステートメント内での宣言は除きます (SQLSTATE 42734)。 条件名は、それが宣言されたコンパウンド・ステートメント内でのみ参照が可能です。コンパウンド・ステートメント内でネストされたコンパウンド・ステートメントも同様です (SQLSTATE 42737)。
SQLSTATE VALUE の条件string-constant
条件に関連付ける SQLSTATE を指定します。 ストリング定数は単一引用符で囲まれている 5 つの文字として指定しなければならず、SQLSTATE クラス (最初の 2 文字) は '00' にすることはできませんこの節の指定がない場合、条件に関連付けられた SQLSTATE 値はありません。
ステートメント宣言
コンパウンド・ステートメントの 1 つ以上のローカルの名前を宣言します。 statement-name 内の各名前は、同じコンパウンド・ステートメント内で宣言されている他のステートメント名と同じであってはなりません。
戻りコード-宣言
SQLSTATE および SQLCODE という特殊変数を宣言します。 これらの変数は、SQL ステートメントの処理後に戻される値に自動的に設定されます。 SQLSTATE 変数と SQLCODE 変数は両方とも、最外部のコンパウンド・ステートメント ネストされたコンパウンド SQL (コンパイル済み) ステートメントがある場合 (例えば、 SQL プロシージャー本体でのみ宣言できます。 これらの変数は、SQL プロシージャーごとに一度しか宣言できません。
宣言カーソル・ステートメント
プロシージャー本体で組み込みカーソルを宣言します。 ユーザー定義カーソル・データ・タイプの変数は、SQL-variable-declaration ステートメントを使用して宣言されます

宣言されたカーソルは、それが宣言されたコンパウンド・ステートメント内で固有の名前を持たなければなりません。ただし、そのようなコンパウンド・ステートメント内でネストされたコンパウンド・ステートメント内での宣言は除きます (SQLSTATE 42734)。 カーソルは、それが宣言されたコンパウンド・ステートメント内でのみ参照が可能です。コンパウンド・ステートメント内でネストされたコンパウンド・ステートメントも同様です (SQLSTATE 34000)。

カーソルをオープンする場合は 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 コール・レベル・インターフェース)、Open Database Connectivity (ODBC)、Java™ Database Connectivity (JDBC)、または組み込み SQL for Java (SQLJ) アプリケーション・プログラミング・インターフェースのいずれかを使用してクライアント・アプリケーションを作成する必要があります。

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

procedure-declaration
コンパウンド・ステートメントに対してローカルなプロシージャーを宣言します。 ローカル・プロシージャーの定義には、CREATE PROCEDURE (SQL)ステートメントで指定可能なオプションの指定は含まれません。 オプションのデフォルトは、MODIFIES SQL DATA を除き、CREATE PROCEDURE (SQL)ステートメントの場合と同じです。 このプロシージャーのデータ・アクセス・レベルは、SQL プロシージャー本体を処理するために必要な最小レベルとなるように自動的に決定されます。
procedure-name
ローカル・プロシージャーの名前を定義します。 名前は修飾なしで指定しなければなりません (SQLSTATE 42601)。 procedure-name と宣言済みパラメーターの数で構成されるプロシージャー・シグニチャーは、現在のコンパウンド・ステートメント内で固有のものでなければなりません。 現在のコンパウンド・ステートメントが内部でネストされている外部のコンパウンド・ステートメントには、同じ名前のプロシージャーを含めることはできません。
パラメーター宣言
ローカル・プロシージャーのパラメーターを指定します。 構文エレメントの説明については、CREATE PROCEDURE (SQL) を参照してください。 パラメーター・データ・タイプは、現在のコンパウンド・ステートメントのスコープに含まれる、ローカルに宣言されたデータ・タイプにすることができます。
SQL-プロシージャー本体
SQL プロシージャーの本体である SQL ステートメントを指定します。 SQL-procedure-body で参照される名前は、既に宣言されていて、ローカル・プロシージャーが宣言されているコンパウンド・ステートメントのスコープに含まれる、宣言済みオブジェクト (宣言済みの変数、データ・タイプ、プロシージャーなど) を参照できます。
ハンドラー宣言
コンパウンド・ステートメントで例外または完了条件が発生した場合に実行するハンドラー、および 1 つ以上の SQL-procedure-statements の集合を指定します。SQL-procedure-statement は、ハンドラーが制御を受け取った際に実行するステートメントです。

ハンドラーは、そのハンドラーが宣言されているコンパウンド・ステートメント (ネストされたコンパウンド・ステートメントを含む) 内の handler-宣言 のセットに続く 実行の所要時間 SQL プロシージャー・ステートメント のセットに対してアクティブであると見なされます。

条件処理ルーチンには以下の 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 にしなければなりません。

以下のようなハンドラーをアクティブ化する条件を handler-declaration 中に定義します。

特定条件値 (specific-condition-value)
ハンドラーが、特定条件処理ルーチン であることを指定します。
SQLSTATE VALUEstring-定数
ハンドラーが呼び出される SQLSTATE を指定します。 SQLSTATE 値の先頭 2 文字は '00' にしないでください。
条件名
ハンドラーが呼び出される条件名を指定します。 条件名は、条件宣言であらかじめ定義していなければなりません。あるいは、現行のサーバーに存在する条件を識別するものでなければなりません。
一般条件値 (general-condition-value)
ハンドラーが、一般条件処理ルーチン であることを指定します。
SQLEXCEPTION
例外条件が発生した場合に呼び出されるハンドラーを指定します。 例外条件は、最初の 2 文字が '00'、'01'、または '02' ではない SQLSTATE 値で表されます。
SQLWARNING
警告条件が発生した場合に呼び出されるハンドラーを指定します。 警告条件は、最初の 2 文字が '01' の SQLSTATE 値で表されます。
NOT FOUND
NOT FOUND 条件が発生した場合に呼び出されるハンドラーを指定します。 NOT FOUND 条件は、最初の 2 文字が '02' の SQLSTATE 値で表されます。
SQL プロシージャー・ステートメント
SQL プロシージャー・ステートメントを指定します。
label
SQL プロシージャー・ステートメントのラベルを指定します。 ラベルは、リスト内でネストされたコンパウンド・ステートメントを含め、SQL プロシージャー・ステートメントの リスト内でユニークでなければなりません。 ネストされていないコンパウンド・ステートメントは、同じラベルを使用できることに注意してください。 SQL プロシージャー・ステートメントのリストは、おそらく SQL 制御ステートメントの中にあります。
SQL-statement
以下の例外を除く、すべての実行可能 SQL ステートメント
  • ALTER
  • CONNECT
  • CREATE
  • DESCRIBE
  • DISCONNECT
  • DROP
  • FLUSH EVENT MONITOR
  • FREE LOCATOR
  • GRANT
  • REFRESH TABLE
  • RELEASE (接続のみ)
  • RENAME TABLE
  • RENAME TABLESPACE
  • REVOKE
  • SET CONNECTION
  • SET INTEGRITY
  • SET PASSTHRU
  • SET SERVER OPTION
  • TRANSFER OWNERSHIP
以下の実行可能ステートメントは、スタンドアロンのコンパウンド SQL (コンパイル済み) ステートメントではサポートされませんが、SQL 関数、SQL プロシージャー、またはトリガー内で使用されるコンパウンド SQL (コンパイル済み) ステートメントではサポートされます。
  • 索引、表、またはビューの CREATE
  • DECLARE GLOBAL TEMPORARY TABLE
  • 索引、表、またはビューの DROP
  • GRANT
  • ROLLBACK
ROLLBACK ステートメントは、スタンドアロンのコンパウンド SQL (コンパイル済み) ステートメント内で呼び出されるネストされたステートメントでもサポートされません。
以下の実行可能ステートメントでないステートメントは、コンパウンド SQL (コンパイル済み) ステートメントでサポートされます。
  • ALLOCATE CURSOR
  • ASSOCIATE LOCATORS

ルール

  • ATOMIC コンパウンド・ステートメントはネストできません。
  • ハンドラーの宣言には、以下の規則が適用されます。
    • ハンドラーの宣言では、同一の condition-name または SQLSTATE 値を複数回含めることはできません。 また、SQLSTATE 値と、その同じ SQLSTATE 値を表す condition-name を含めることもできません。
    • コンパウンド・ステートメント中で複数の条件処理ルーチンが宣言されている場合、以下の規則が適用されます。
      • 2 つのハンドラー宣言に、同一の一般条件カテゴリー (SQLEXCEPTION、 SQLWARNING、 NOT FOUND) を指定することはできません。
      • 2 つのハンドラー宣言に、同一の値を表す SQLSTATE 値または condition-name として、 同一の特定条件カテゴリーを指定することはできません。
    • 例外または完了条件が発生した場合、その条件に最も適したハンドラーが有効になります。 以下の考慮事項に基づいて、最も適したハンドラーが判別されます。
      • ハンドラー宣言 H の有効範囲は、H のあるコンパウンド・ステートメント中に含まれるハンドラー宣言の後の SQL-procedure-statement のリストです。 したがって、H の有効範囲には、 条件処理ルーチン H の本体中に含まれるステートメントは入りません。 つまり、条件処理ルーチンは条件処理ルーチン自体の本体中で生じる条件を処理できないことになります。 同様に、同一のコンパウンド・ステートメント中で H1 H2 という 2 つのハンドラーが宣言されている場合、 H1H2 の本体中で生じる条件を処理できず、 H2H1 の本体中で生じる条件を処理できません。
      • 内側の有効範囲で宣言された specific-condition-value または general-condition-value C のハンドラーは、 外側の有効範囲で宣言された C の別のハンドラーより優先します。
      • 条件 C に関する特定ハンドラーと、 同じく C を処理する一般ハンドラーが、 同一の有効範囲内で宣言されている場合は、特定ハンドラーの方が一般ハンドラーより優先します。
      • 関連付けられている SQLSTATE 値のないモジュール条件のハンドラーと SQLSTATE 45000 のハンドラーが同じ有効範囲で宣言されている場合、モジュール条件のハンドラーが SQLSTATE 45000 のハンドラーより優先されます。
      適したハンドラーのない例外条件が生じた場合は、 失敗したステートメントに含まれる SQL プロシージャーは、未処理の例外条件で終了します。 該当するハンドラーのない完了条件が生じた場合は、引き続き次の SQL ステートメントが実行されます。
  • コミットまたはロールバック操作が生じた後に、SQL プロシージャー内でデータ・タイプ XML の変数またはパラメーターを参照することは、まずこれらの変数に新しい値を割り当ててからでなければサポートされません (SQLSTATE 560CE)。
  • アンカー・データ・タイプの使用: アンカー・データ・タイプは次のオブジェクトを参照できません (SQLSTATE 428HS): ニックネーム、型付き表、型付きビュー、式ベースの索引に関連付けられた統計ビュー、宣言済み一時表、緩やかに型付けされたカーソルに関連付けられた行定義、データベース・コード・ページまたはデータベース照合とは異なるコード・ページまたは照合を使用するオブジェクト。
  • 動的に準備または実行されるコンパウンド SQL (コンパイル済み) ステートメントで名前付きパラメーター・マーカーを使用する場合は、各パラメーター・マーカー名が固有でなければなりません (SQLSTATE 42997)。

  • XML 割り当て: データ・タイプ XML のパラメーターおよび変数に対する割り当ては、参照によって行われます。

    CALL ステートメント内でデータ・タイプ XML のパラメーターを SQL プロシージャーに渡すことは、参照によって行われます。 参照によって XML 値を渡すときには、入力ノード・ツリーが XML 引数から直接使用されます。 この直接的な使用により、文書の順序、元のノード ID、およびすべての親プロパティーを含むすべてのプロパティーが保持されます。

  • 例 1:「Hello」という語を出力する単純なスタンドアロン・コンパウンド・ステートメント
       SET SERVEROUTPUT ON;
       BEGIN
           CALL DBMS_OUTPUT.PUT_LINE ( 'Hello' );
       END
  • 例 2: staff 内のレコード数をカウントし、結果を出力する、単純なスタンドアロン複合ステートメント。
       SET SERVEROUTPUT ON;
       BEGIN
           DECLARE v_numRecords INTEGER DEFAULT 1;
        SELECT COUNT(*) INTO v_numRecords FROM staff;
    
        CALL DBMS_OUTPUT.PUT_LINE (v_numRecords);
       END
  • 例 3: 以下の処置を実行するコンパウンド SQL (コンパイル済み) ステートメントが含まれている、プロシージャーを作成します。
    1. SQL 変数を宣言します。
    2. IN パラメーターによって判別される部門の従業員の給与を戻すカーソルを宣言します。 SELECT ステートメントで、 salary 列のデータ・タイプを DECIMAL から DOUBLE にキャストします。
    3. OUT パラメーター medianSalary に値 '6666' を割り当てる条件 NOT FOUND (ファイルの終わり) の EXIT ハンドラーを宣言します。
    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
  • 例 4: 以下の例は、RESIGNAL の結果として別の条件から UNDO ハンドラーがアクティブ化される場合を仮定して、 実行の流れを図示しています。
       CREATE PROCEDURE A()
       LANGUAGE SQL
       CS1: BEGIN ATOMIC
         DECLARE C CONDITION FOR SQLSTATE '12345';
         DECLARE D CONDITION FOR SQLSTATE '23456';
    
         DECLARE UNDO HANDLER FOR C    
         H1: BEGIN
           -- Perform rollback after error, perform final cleanup, and exit        
           -- procedure A.                
    
           -- ...                
    
           -- When this handler completes, execution continues after        
           -- compound statement CS1; procedure A will terminate.    
         END;
    
         -- Perform some work here ...    
         CS2: BEGIN
           DECLARE CONTINUE HANDLER FOR D
           H2: BEGIN
             -- Perform local recovery, then forward the error            
             -- condition to the outer handler for additional
             -- processing.
    
             -- ...
    
             RESIGNAL C; -- will activate UNDO handler H1; execution
                         -- WILL NOT return here.  Any local cursors
                         -- declared in H2 and CS2 will be closed.
           END;
    
           -- Perform some more work here ...
    
           -- Simulate raising of condition D by some SQL statement
           -- in compound statement CS2:
           SIGNAL D; -- will activate H2
         END;
       END