EXECUTE ステートメントは、準備済み SQL ステートメントを実行します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込む方法のみ可能です。 これは、動的に準備できない実行可能ステートメントです。
許可
ステートメントの実行時に許可検査が行われるステートメント (DDL、GRANT、 および REVOKE ステートメント) の場合、このステートメントの許可 ID の特権には、 PREPARE ステートメントで指定されている SQL ステートメントを実行するための特権が含まれていなければなりません。 許可検査がステートメントの準備の時点で行われるステートメント (DML) の場合、 このステートメントを使用するために必要な権限はありません。
構文
>>-EXECUTE--statement-name--------------------------------------> >-----+------------------------------------+------------------->< | .-,----------------. | | V | | +-USING-----host-variable---+--------+ '-USING DESCRIPTOR--descriptor-name--'
説明
EXECUTE ステートメントが処理される前に、 ユーザーは、入力 SQLDA の以下のフィールドを設定する必要があります。
SQLDA には、すべての SQLVAR オカレンスが入るだけの十分な記憶域がなければなりません。 したがって、SQLDABC の値は 16 + SQLN*(N) 以上でなければなりません (N は 1 つの SQLVAR オカレンスの長さ)。
LOB 入力データを入れる必要がある場合には、 各パラメーター・マーカーごとに 2 つの SQLVAR 項目が必要になります。
SQLD に設定する値は、ゼロ以上で SQLN 以下でなければなりません。 詳しくは、付録 C, SQL 記述子域 (SQLDA)を参照してください。
V は、パラメーター・マーカー P に対応するホスト変数を表します。 V の値は、列への値の割り振り規則に従って、P のターゲット変数に割り当てられます。 したがって、
準備済みステートメントを実行すると、P の代わりに使用される値は P のターゲット変数になります。 たとえば、V が CHAR(6) でターゲットが CHAR(8) の場合、 P の代わりに使用される値は V の値にブランクを 2 個付加したものになります。
動的および静的 SQL ステートメントの実行に必要な情報は、 静的 SQL ステートメントが最初に参照された時点、 または動的 SQL ステートメントが最初に準備された時点で、 データベース・パッケージ・キャッシュに入れられます。 この情報は、無効になるか、キャッシュ・スペースが他のステートメントで必要になるか、 またはデータベースがシャットダウンされるまでは、パッケージ・キャッシュに存続します。
SQL ステートメントが実行または準備される場合に、 要求を出したアプリケーションに関連するパッケージ情報が、 システム・カタログからパッケージ・キャッシュにロードされます。 個々の SQL ステートメントの実際の実行可能セクションもキャッシュに入れられます。 静的 SQL セクションは、該当のステートメントが最初に参照された時点で、 システム・カタログから読み取られてパッケージ・キャッシュに入れられ、 動的 SQL セクションは作成後にキャッシュに直接入れられます。 動的 SQL セクションは、 PREPARE や EXECUTE IMMEDIATE ステートメントなどの明示的なステートメントによって作成されます。 一度作成された動的 SQL ステートメントのセクションが、 スペース管理のために削除された場合や、環境の変化によって無効になった場合に、 システムによるステートメントの暗黙的な準備によって、再作成されることがあります。
各 SQL ステートメントは、データベース・レベルでキャッシュされ、アプリケーション間で共用できます。 静的 SQL ステートメントは、同じパッケージを使用してアプリケーション間で共用されます。 動的 SQL ステートメントは、同じコンパイル環境と、 厳密に同じステートメント・テキストを使用してアプリケーション間で共用されます。 アプリケーションによって発行される各 SQL ステートメントのテキストは、 アプリケーションにローカルにキャッシュされ、暗黙的な準備が必要な場合に使用されます。 アプリケーション・プログラム中の各 PREPARE ステートメントは、1 つのステートメントをキャッシュできます。 アプリケーション・プログラム中のすべての EXECUTE IMMEDIATE ステートメントは、 同じスペースを共用し、これらの EXECUTE IMMEDIATE ステートメントに対しては、 キャッシュされるステートメントは同時に 1 つしか存在しません。 それぞれ異なる SQL ステートメントに対して、 同じ PREPARE またはいずれかの EXECUTE IMMEDIATE ステートメントが何度も発行される場合は、 最後のステートメントだけがキャッシュに入れられ、再使用の対象になります。 キャッシュの使用を最適化するには、 アプリケーションの開始時に多くの異なる PREPARE ステートメントを一度に発行し、 その後必要に応じて EXECUTE または OPEN ステートメントを発行することです。
動的 SQL ステートメントのキャッシュを使用すると、ステートメントを一度作成すれば、 ステートメントを再度準備しなくても複数の作業単位にわたってステートメントを再使用できます。 環境が変わった場合には、必要に応じてシステムはステートメントを再コンパイルします。
以下の事象は、次の PREPARE、EXECUTE、EXECUTE IMMEDIATE、または OPEN の要求時に、 キャッシュされた動的ステートメントが暗黙的に準備される原因となる環境またはデータ・オブジェクトの変更の例です。
キャッシュに入れられる動的 SQL ステートメントから予想される動作の概略は、以下のようになります。
COMMIT または ROLLBACK ステートメントの後に PREPARE ステートメントを発行する必要はありません。
暗黙の準備の過程でエラーが生じると、 その暗黙の準備の原因となった要求にエラーが戻されます (SQLSTATE 56098)。
例
例 1: この C の例では、パラメーター・マーカーを伴う INSERT ステートメントが準備され、実行されます。 h1 - h4 は、TDEPT の形式に対応するホスト変数です。
strcpy (s,"INSERT INTO TDEPT VALUES(?,?,?,?)"); EXEC SQL PREPARE DEPT_INSERT FROM :s; . . (正常実行の検査を行い、:h1, :h2, :h3, :h4 に値を入れる) . . EXEC SQL EXECUTE DEPT_INSERT USING :h1, :h2, :h3, :h4;
例 2: この EXECUTE ステートメントは SQLDA を使用します。
EXECUTE S3 USING DESCRIPTOR :sqlda3