ルーチンおよびトリガー内で実行できる SQL ステートメント
ルーチンで SQL ステートメントを正常に実行できるかどうかは、制約事項にって、特定の前提条件が満たされるかどうかの条件によって決まります。 ただし、ルーチンおよびトリガーで多数の SQL ステートメントを実行することは可能です。
ステートメントがルーチンを呼び出す場合、そのステートメントの有効な SQL データ・アクセス・レベルは次のうちの大きいほうになります。
- 以下の表にあるステートメントの SQL データ・アクセス・レベル。
- ルーチンの作成時に指定された、ルーチンの SQL データ・アクセス・レベル。
以下の表は、SQL PL 制御ステートメントなどの、サポートされているすべての SQL ステートメントを一覧で示し、各種のルーチン内で各 SQL ステートメントを実行できるかどうかを示しています。 最初の列に一覧で示されているどの SQL ステートメントの場合も、そのステートメントをルーチンで実行できるかどうかが、その後に続く各列に X
で示しています。 最終列は、ステートメントを実行できる最小の SQL アクセス・レベルを示しています。 ルーチンが SQL ステートメントを呼び出す際、
そのステートメントの有効な SQL データ・アクセス指示は、
ルーチンに対して宣言された SQL データ・アクセス指示を超えてはなりません。 例えば、READS SQL DATA と定義された関数は、
MODIFIES SQL DATA と定義されたプロシージャーを呼び出せません。 脚注に他に指示がなければ、どの SQL ステートメントも、静的および動的の両方の方式で実行できます。
SQL ステートメント | コンパウンド SQL (コンパイル) ステートメント (1) で実行可能 | コンパウンド SQL (インライン) ステートメント (2) で実行可能 | 外部プロシージャー内の実行可能ファイル | 外部関数内の実行可能ファイル | 必要最低限の SQL データ・アクセス・レベル |
---|---|---|---|---|---|
ALLOCATE CURSOR | X | X | X | MODIFIES SQL DATA | |
ALTER {BUFFERPOOL, DATABASE PARTITION GROUP, FUNCTION, METHOD, NICKNAME, PROCEDURE, SEQUENCE, SERVER, TABLE, TABLESPACE, TYPE, USER MAPPING, VIEW} | X | X | MODIFIES SQL DATA | ||
ASSOCIATE LOCATORS | X | ||||
AUDIT | X | X | MODIFIES SQL DATA | ||
BEGIN DECLARE SECTION | X | X | NO SQL(3) | ||
CALL | X | X | X | X | CONTAINS SQL(12) |
CASE | X | X | CONTAINS SQL | ||
CLOSE | X | X | X | READS SQL DATA | |
COMMENT ON | X | X | X | MODIFIES SQL DATA | |
COMMIT | X(6) | X(6) | MODIFIES SQL DATA | ||
コンパウンド SQL | X | X | X | X | CONTAINS SQL |
CONNECT(2) | |||||
CREATE {ALIAS, BUFFERPOOL, DATABASE PARTITION GROUP, DISTINCT TYPE, EVENT MONITOR, FUNCTION, FUNCTION MAPPING, GLOBAL TEMPORARY TABLE(11), INDEX(11), INDEX EXTENSION, METHOD, NICKNAME, PROCEDURE, SCHEMA, SEQUENCE, SERVER, TABLE(11), TABLESPACE, TRANSFORM, TRIGGER, TYPE, TYPE MAPPING, USER MAPPING, VIEW(11), WRAPPER } | X (8) | X | MODIFIES SQL DATA | ||
DECLARE CURSOR | X | X | X | NO SQL(3) | |
DECLARE GLOBAL TEMPORARY TABLE |
X | X | X | MODIFIES SQL DATA | |
DELETE | X | X | X | X | MODIFIES SQL DATA |
DESCRIBE(9) | X | X | READS SQL DATA | ||
DISCONNECT(4) | |||||
DROP | X(8) | X | X | MODIFIES SQL DATA | |
END DECLARE SECTION | X | X | NO SQL(3) | ||
EXECUTE | X | X | X | CONTAINS SQL(5) | |
EXECUTE IMMEDIATE | X | x | X | CONTAINS SQL(5) | |
EXPLAIN | X | X | X | MODIFIES SQL DATA | |
FETCH | X | X | X | READS SQL DATA | |
FLUSH EVENT MONITOR | X | X | MODIFIES SQL DATA | ||
FLUSH PACKAGE CACHE | X | X | MODIFIES SQL DATA | ||
FOR | X | X | READS SQL DATA | ||
FREE LOCATOR | X | X | CONTAINS SQL | ||
GET DIAGNOSTICS | X | X | READS SQL DATA | ||
GOTO | X | X | CONTAINS SQL | ||
GRANT | X | X | X | MODIFIES SQL DATA | |
IF | X | X | CONTAINS SQL | ||
INCLUDE | X | X | NO SQL | ||
INSERT | X | X | X | X | MODIFIES SQL DATA |
ITERATE | X | X | CONTAINS SQL | ||
LEAVE | X | X | CONTAINS SQL | ||
LOCK TABLE | X | X | X | CONTAINS SQL | |
LOOP | X | X | CONTAINS SQL | ||
MERGE | X | X | X | X | MODIFIES SQL DATA |
OPEN | X | X | X | READS SQL DATA(7) | |
PREPARE | X | X | X | CONTAINS SQL | |
REFRESH TABLE | X | X | MODIFIES SQL DATA | ||
RELEASE(4) | |||||
RELEASE SAVEPOINT | X | X | X | MODIFIES SQL DATA | |
RENAME TABLE | X | X | MODIFIES SQL DATA | ||
RENAME TABLESPACE | X | X | MODIFIES SQL DATA | ||
REPEAT | X | X | CONTAINS SQL | ||
RESIGNAL | X | MODIFIES SQL DATA | |||
RETURN | X | CONTAINS SQL | |||
REVOKE | X | X | MODIFIES SQL DATA | ||
ROLLBACK(6) | X | X | |||
ROLLBACK TO SAVEPOINT | X | X | X | MODIFIES SQL DATA | |
SAVEPOINT | X | MODIFIES SQL DATA | |||
select-statement | X | X | X | READS SQL DATA | |
SELECT INTO | X | X(10) | X(10) | READS SQL DATA(7) | |
SET CONNECTION(4) | |||||
SET INTEGRITY | X | MODIFIES SQL DATA | |||
SET 特殊レジスター | X | X | X | X | CONTAINS SQL |
SET 変数 | X | X | CONTAINS SQL | ||
SIGNAL | X | X | MODIFIES SQL DATA | ||
TRANSFER OWNERSHIP | X | X | MODIFIES SQL DATA | ||
TRUNCATE | X | X | MODIFIES SQL DATA | ||
UPDATE | X | X | X | MODIFIES SQL DATA | |
VALUES INTO | X | X | X | READS SQL DATA | |
WHENEVER | X | X | NO SQL(3) | ||
WHILE | X | X |
注:
- コンパウンド SQL (コンパイル) ステートメントは、SQL プロシージャー、SQL 関数、トリガーの本体として、またはスタンドアロンのステートメントとして使用することができます。
- コンパウンド SQL (インライン) ステートメントは、SQL 関数、SQL メソッド、およびトリガーの本体として、またはスタンドアロンのステートメントとして使用することができます。
- NO SQL オプションでは SQL ステートメントを指定できないことを暗黙に示していますが、実行不能ステートメントは制限されません。
- 接続管理ステートメントは、どのルーチン実行コンテキストでも許可されません。
- この状況は、実行されるステートメントに応じて決まります。 EXECUTE ステートメントに指定されるステートメントは、有効な特定の SQL アクセス・レベルのコンテキストで許可されるステートメントでなければなりません。 例えば、SQL アクセス・レベル READS SQL DATA が有効な場合、ステートメントは INSERT、UPDATE、または DELETE にすることができません。
- TO SAVEPOINT 節を指定しない COMMIT ステートメントおよび ROLLBACK ステートメントをストアード・プロシージャーで使用できます。ただし、ストアード・プロシージャーがアプリケーションから直接呼び出される場合、またはアプリケーションからのネストされたストアード・プロシージャー呼び出しを介して間接的に呼び出される場合に限ります。 トリガー、関数、メソッド、またはアトミック・コンパウンド・ステートメントがストアード・プロシージャーへの呼び出しチェーンに含まれる場合、作業単位の COMMIT または ROLLBACK は許可されません。
- SQL アクセス・レベル READS SQL DATA が有効な場合、SQL データ変更ステートメントを SELECT INTO ステートメントに組み込んだり、OPEN ステートメントによって参照されるカーソルに組み込むことはできません。
- SQL ルーチンは、索引、表、およびビューの CREATE ステートメントおよび DROP ステートメントを静的に実行することのみ可能です。 他のオブジェクトの場合は、以下のステートメントを使用して CREATE ステートメントと DROP ステートメントを動的に実行できます。
- EXECUTE IMMEDIATE
- PREPARE、次に EXECUTE
- DESCRIBE SQL ステートメントの構文は、CLP DESCRIBE コマンドとは違っています。
- これは組み込み SQL ルーチンでのみサポートされています。
- SQL プロシージャー内で参照される場合、ステートメントの実行は静的にのみ行えます。
- 呼び出されるプロシージャーの SQL データ・アクセスは、 現在有効なレベルと同じか、より制限の強いレベルである必要があります。 例えば、MODIFIES SQL DATA として定義されたルーチンは、 MODIFIES SQL DATA、READS SQL DATA、CONTAINS SQL、または NO SQL として定義されたプロシージャーを呼び出す ことができます。 CONTAINS SQL として定義されたルーチンは、CONTAINS SQL または NO SQL として定義された プロシージャーを呼び出すことができます。 またプロシージャーに対して指定される引数では、別のデータ・アクセス・レベルが必要となる場合があります。 例えば、スカラー全選択を引数として使用する場合、ステートメントのデータ・アクセス・レベルは READS SQL DATA でなければなりません。
エラー
表 1 は、最初の列で指定された SQL ステートメントが、指定された SQL データ・アクセス・レベルを持つルーチン内での実行を許可されるかどうかを示しています。 ステートメントがこのデータ・アクセス・レベルを超えている場合にルーチンを実行すると、エラーが戻されます。
- NO SQL データ・アクセス・レベルで定義されたルーチン内で実行可能 SQL ステートメントが検出された場合、SQLSTATE 38001 が戻されます。
- 他の実行コンテキストの場合、特定のコンテキストでサポートされていない SQL ステートメントがあると SQLSTATE 38003 が戻されます。
- CONTAINS SQL コンテキストで許可されていない他の SQL ステートメントについては、SQLSTATE 38004 が戻されます。
- READS SQL DATA コンテキストでは、SQLSTATE 38002 が戻されます。
- SQL ルーチンの作成時に、SQL データ・アクセス・レベルに一致しないステートメントがあると、SQLSTATE 42985 が戻されます。