ルーチンおよびトリガー内で実行できる SQL ステートメント

ルーチンで SQL ステートメントを正常に実行できるかどうかは、制約事項にって、特定の前提条件が満たされるかどうかの条件によって決まります。 ただし、ルーチンおよびトリガーで多数の SQL ステートメントを実行することは可能です。

ステートメントがルーチンを呼び出す場合、そのステートメントの有効な SQL データ・アクセス・レベルは次のうちの大きいほうになります。
  • 以下の表にあるステートメントの SQL データ・アクセス・レベル。
  • ルーチンの作成時に指定された、ルーチンの SQL データ・アクセス・レベル。
例えば、CALL ステートメントの SQL データ・アクセス・レベルは CONTAINS SQL です。 しかし、READS SQL DATA として定義されたストアード・プロシージャーが呼び出されると、CALL ステートメントの有効な SQL データ・アクセス・レベルは READS SQL DATA になります。

以下の表は、SQL PL 制御ステートメントなどの、サポートされているすべての SQL ステートメントを一覧で示し、各種のルーチン内で各 SQL ステートメントを実行できるかどうかを示しています。 最初の列に一覧で示されているどの SQL ステートメントの場合も、そのステートメントをルーチンで実行できるかどうかが、その後に続く各列に X で示しています。 最終列は、ステートメントを実行できる最小の SQL アクセス・レベルを示しています。 ルーチンが SQL ステートメントを呼び出す際、 そのステートメントの有効な SQL データ・アクセス指示は、 ルーチンに対して宣言された SQL データ・アクセス指示を超えてはなりません。 例えば、READS SQL DATA と定義された関数は、 MODIFIES SQL DATA と定義されたプロシージャーを呼び出せません。 脚注に他に指示がなければ、どの SQL ステートメントも、静的および動的の両方の方式で実行できます。

表 1. ルーチン内で実行できる 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      
注:
  1. コンパウンド SQL (コンパイル) ステートメントは、SQL プロシージャー、SQL 関数、トリガーの本体として、またはスタンドアロンのステートメントとして使用することができます。
  2. コンパウンド SQL (インライン) ステートメントは、SQL 関数、SQL メソッド、およびトリガーの本体として、またはスタンドアロンのステートメントとして使用することができます。
  3. NO SQL オプションでは SQL ステートメントを指定できないことを暗黙に示していますが、実行不能ステートメントは制限されません。
  4. 接続管理ステートメントは、どのルーチン実行コンテキストでも許可されません。
  5. この状況は、実行されるステートメントに応じて決まります。 EXECUTE ステートメントに指定されるステートメントは、有効な特定の SQL アクセス・レベルのコンテキストで許可されるステートメントでなければなりません。 例えば、SQL アクセス・レベル READS SQL DATA が有効な場合、ステートメントは INSERT、UPDATE、または DELETE にすることができません。
  6. TO SAVEPOINT 節を指定しない COMMIT ステートメントおよび ROLLBACK ステートメントをストアード・プロシージャーで使用できます。ただし、ストアード・プロシージャーがアプリケーションから直接呼び出される場合、またはアプリケーションからのネストされたストアード・プロシージャー呼び出しを介して間接的に呼び出される場合に限ります。 トリガー、関数、メソッド、またはアトミック・コンパウンド・ステートメントがストアード・プロシージャーへの呼び出しチェーンに含まれる場合、作業単位の COMMIT または ROLLBACK は許可されません。
  7. SQL アクセス・レベル READS SQL DATA が有効な場合、SQL データ変更ステートメントを SELECT INTO ステートメントに組み込んだり、OPEN ステートメントによって参照されるカーソルに組み込むことはできません。
  8. SQL ルーチンは、索引、表、およびビューの CREATE ステートメントおよび DROP ステートメントを静的に実行することのみ可能です。 他のオブジェクトの場合は、以下のステートメントを使用して CREATE ステートメントと DROP ステートメントを動的に実行できます。
    • EXECUTE IMMEDIATE
    • PREPARE、次に EXECUTE
  9. DESCRIBE SQL ステートメントの構文は、CLP DESCRIBE コマンドとは違っています。
  10. これは組み込み SQL ルーチンでのみサポートされています。
  11. SQL プロシージャー内で参照される場合、ステートメントの実行は静的にのみ行えます。
  12. 呼び出されるプロシージャーの 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 が戻されます。