EXECUTE IMMEDIATE ステートメント
EXECUTE IMMEDIATE は、PREPARE ステートメントと EXECUTE ステートメントの基本機能を兼ね備えます。 このステートメントを使用すると、ホスト変数もパラメーター・マーカーも含まない SQL ステートメントを準備して実行できます。
EXECUTE IMMEDIATE ステートメントは、次のような働きをします。
- ストリング形式のステートメントから、実行可能形式の SQL ステートメントを準備する。
- SQL ステートメントを実行する。
- 実行可能形式を破棄する。
呼びかけ EXECUTE IMMEDIATE
このステートメントは、アプリケーション・プログラムに組み込む方法のみ可能です。 これは、動的に作成できない実行可能ステートメントです。 Java™では指定できません。
承認 EXECUTE IMMEDIATE
許可規則は、EXECUTE IMMEDIATE で指定する SQL ステートメントの 動的準備に対して定義されている規則となります。 例えば、EXECUTE IMMEDIATEを使用してINSERT文が実行された際に適用される承認ルールについては、INSERT文を参照してください。
構文 EXECUTE IMMEDIATE
説明の対象: EXECUTE IMMEDIATE
可変
FL 500PL/I 以外の言語の場合、 変数を指定する必要があります。 これは、文字ストリング変数またはグラフィック・ストリング変数を宣言する際の規則に従って、アプリケーション・プログラム内で記述されている変数を示している必要があります。 ソース・ストリングの長さが 32KB を超える場合、variable は CLOB 変数または DBCLOB 変数でなければいけません。 2MB より大きい変数を宣言できますが、ソースの最大長は 2MB です。 ホスト変数に標識変数を指定してはなりません。 アセンブラー、C、COBOL、および PL/I の場合、ホスト変数は可変長ストリング変数でなければいけません。 C の場合、ホスト変数は NUL 終了ストリングであってはなりません。 SQL PL の場合、SQL 変数、SQL パラメーター、または遷移変数を使用できますが、値が NULL であってはなりません。
- 文字列式
- string-expression は、ストリングを生ずる PL/I の式です。 string-expression の前にコロンを付けることはできません。 演算子または関数を含んで いる string-expression の中の変数の前には、コロンを付けないでください。 string-expression が指定された場合、その string-expression のためのプリコンパイラー生成の構造体は EBCDIC CCSID を使用し、通知メッセージが戻されます。
注釈 EXECUTE IMMEDIATE
- ステートメント・ストリングに対する規則:
識別されたホスト変数または指定された ストリング式 の値は、 ステートメント・ストリングと呼ばれます。
このステートメント・ストリングは、以下のいずれかの SQL ステートメントでなければならず、SELECT ステートメントであってはなりません。ステートメント ステートメント - ALLOCATE CURSOR
- ALTER
- ASSOCIATE LOCATORS
- COMMENT
- COMMIT
- CREATE
- DECLARE GLOBAL TEMPORARY TABLE
- DELETE
- DROP
- EXPLAIN
- FREE LOCATOR
- GRANT
- HOLD LOCATOR
- INSERT
- ラベル
- LOCK TABLE
- MERGE
- REFRESH TABLE
- RELEASE SAVEPOINT
- RENAME
- REVOKE
- ROLLBACK
- SET代入文
- SAVEPOINT
SET CURRENT ACCELERATOR
- SET CURRENT APPLICATION COMPATIBILITY
- SET CURRENT DEGREE
- SET CURRENT DECFLOAT ROUNDING MODE
- SET CURRENT DEBUG MODE
- SET CURRENT EXPLAIN MODE
- SET CURRENT LOCALE LC_CTYPE
- SET CURRENT MAINTAINED TABLE TYPES FOR OPTIMIZATION
- SET CURRENT OPTIMIZATION HINT
- SET CURRENT PRECISION
- SET CURRENT QUERY ACCELERATION
- SET CURRENT REFRESH AGE
- SET CURRENT ROUTINE VERSION
- SET CURRENT RULES
- SET CURRENT SQLID
- SET ENCRYPTION PASSWORD
- SET PATH
- SET SCHEMA
- SET CURRENT TEMPORAL BUSINESS_TIME
- SET CURRENT TEMPORAL SYSTEM_TIME
- SET SESSION TIME ZONE
- SIGNAL
TRANSFER OWNERSHIP
- TRUNCATE
- UPDATE
ステートメント文字列には、以下の属性のいずれも含まれていてはなりません
- EXEC SQL で始める。
- END-EXEC またはセミコロンで終了する。
- グローバル変数以外の変数に対する参照を含む。
- パラメーター・マーカーを含む。
- 遷移表に対する参照を含む。
- エラーとエラー処理:
- EXECUTE IMMEDIATE ステートメントの実行時に、指定されたステートメント・ストリングは構文解析され、エラーがないか検査されます。 SQL ステートメントが無効な場合には実行されず、その実行を妨げたエラー状態が SQLCA に報告されます。 SQL ステートメントが有効で、その実行の過程でエラーが発生した場合、
エラー条件が SQLCA に報告されます。
Db2 準備されたSQL文の実行を停止することができます。その文が終了するまでにCPU時間がかかりすぎている場合。 停止した場合はエラーが発生しますが、 そのステートメントを出したアプリケーションが終了することにはなりません。このアプリケーションは、他の SQL ステートメントを出すことができます。
- CURRENT EXPLAIN MODE 特殊レジスターの影響:
- CURRENT EXPLAIN MODE 特殊レジスターを EXPLAIN に設定すると、SET ステートメント以外のステートメントは EXPLAIN 専用に準備されるので、実行可能ではありません。 準備されたステートメントを実行しようとすると、エラーが戻されます。 詳細は、 現在の説明モードの特別レジスタ特別レジスタを参照してください。
- パフォーマンスの考慮事項:
- 同じ SQL ステートメントを 2 回以上実行する場合には、 EXECUTE IMMEDIATE ステートメントより、PREPARE ステートメント と EXECUTE ステートメントを使った方が効率的です。
例 EXECUTE IMMEDIATE
- 例 1
- この PL/I の例では、EXECUTE IMMEDIATE文を使用してDELETE文を実行します。このDELETE文では、削除対象の行がPREDの値で指定される検索条件によって決定されます。
EXEC SQL EXECUTE IMMEDIATE 'DELETE FROM DSN8C10.DEPT WHERE' || PREDS; - 例 2
- Cを使用して、ホスト変数Qstring内のSQLステートメントを実行します。
EXEC SQL INCLUDE SQLCA; void main () { EXEC SQL BEGIN DECLARE SECTION; char Qstring[100] = "INSERT INTO WORK_TABLE SELECT * FROM EMPPROJACT WHERE ACTNO >= 100"; EXEC SQL END DECLARE SECTION; . . . EXEC SQL EXECUTE IMMEDIATE :Qstring; return; }
:
