EXECUTE IMMEDIATE
EXECUTE IMMEDIATE ステートメントは、PREPARE ステートメントと EXECUTE ステートメントの基本機能を結合したものです。 このステートメントは、変数もパラメーター・マーカーも含まない SQL ステートメントを準備し、 実行するのに使用することができます。
EXECUTE IMMEDIATE ステートメントは、以下の処理を行います。
- 文字ストリング形式の SQL ステートメントをもとにして、そのステートメントの実行可能形式を準備する
- その SQL ステートメントを実行する
呼び出し
このステートメントは、アプリケーション・プログラム、SQL 関数、 SQL プロシージャー、またはトリガー内にのみ組み込むことができます。 これは実行可能ステートメントですが、動的に準備することはできません。Java™ では指定できません。
権限
ステートメントでグローバル変数を参照する場合は、ステートメントの権限 ID が保持する特権に、少なくとも次のいずれか 1 つが含まれなければなりません。
- ステートメント内で識別されるグローバル変数に対して、
- そのグローバル変数に対する READ 特権
- そのグローバル変数を含むライブラリーに対する *EXECUTE システム権限
- データベース管理者権限
権限の規則は、EXECUTE IMMEDIATE により指定される SQL ステートメントに対する規則が適用されます。 例えば、EXECUTE IMMEDIATE を使用して INSERT ステートメントを実行する場合に適用される権限規則については、 INSERTを参照してください。
プログラムの作成時点の CRTSQLxxx コマンドに DYNUSRPRF(*OWNER) が指定されていた場合を除き、ステートメントの権限 ID は、実行時の権限 ID です。詳しくは、権限 ID と権限名を参照してください。
説明
指定された変数または式の値は、ステートメント・ストリング と呼ばれます。
ステートメント・ストリングは、以下の SQL ステートメント のいずれかである必要があります。3
ALTER | LOCK TABLE | SET CURRENT IMPLICIT XMLPARSE OPTION |
CALL | MERGE | SET CURRENT TEMPORAL SYSTEM_TIME |
COMMENT | REFRESH TABLE | SET ENCRYPTION PASSWORD |
COMMIT | RELEASE SAVEPOINT | SET PATH |
コンパウンド (動的) | RENAME | SET SCHEMA |
CREATE | REVOKE | SET SESSION AUTHORIZATION |
DECLARE GLOBAL TEMPORARY TABLE | ROLLBACK | SET TRANSACTION |
DELETE | SAVEPOINT | SET 変数2 |
DROP | SET CURRENT DEBUG MODE | TRANSFER OWNERSHIP |
GRANT | SET CURRENT DECFLOAT ROUNDING MODE | TRUNCATE |
INSERT | SET CURRENT DEGREE | UPDATE |
LABEL |
ステートメント・ストリングは、次のようなストリングであってはなりません。
- EXEC SQL で始める。
- END-EXEC またはセミコロンで終了する。
- 変数への参照を含むストリング。グローバル変数を使用できます。
- パラメーター・マーカーを含むストリング。
EXECUTE IMMEDIATE ステートメントを実行すると、指定したステートメント・ストリングが解析され、 エラーの有無が検査されます。 SQL ステートメントとして正しくない場合は、そのステートメントは実行されず、 実行を妨げているエラー条件が独立の SQLSTATE および SQLCODE で報告されます。 SQL ステートメントとして正しくても、ステートメントの実行時にエラーが発生すると、 そのエラー条件が独立の SQLSTATE および SQLCODE に報告されます。 エラーに関する追加情報は、SQL 診断領域 (または SQLCA) から検索できます。
注記
パフォーマンスの考慮: 同じ SQL ステートメントを複数回実行する場合には、EXECUTE IMMEDIATE ステートメントより、PREPARE ステートメントと EXECUTE ステートメントを使った方が効率的です。
例
C を使用して、変数 Qstring 内の SQL ステートメントを実行します。
void main ()
{
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
char Qstring[100] = "INSERT INTO WORK_TABLE SELECT * FROM EMPPROJACT
WHERE ACTNO >= 100";
EXEC SQL END DECLARE SECTION END-EXEC.
EXEC SQL INCLUDE SQLCA;
.
.
.
EXEC SQL EXECUTE IMMEDIATE :Qstring;
return;
}