機能
動的に実行するSQL文を準備します。
記述形式
参照項番
日本語文字列 → “2.1.3 トークン”
区切り識別子 → “2.1.3 トークン”
権限
PREPARE文を実行できるのは、準備可能文に対する権限の保持者です。
一般規則
SQL文変数にSQL文を設定して、PREPARE文を実行することにより、そのSQL文の実行の準備が完了します。SQL文変数に指定できるSQL文を準備可能文といい、PREPARE文により実行の準備が完了した文を被準備文といいます。
すでに、PREPARE文で定義されたSQL文識別子または拡張SQL文識別子に対して、再度PREPARE文を実行する場合は、先の被準備文が解放され、新たに被準備文が準備されます。
先の被準備文が動的SELECT文の場合、拡張SQL文識別子に対応するALLOCATE CURSOR文で定義したカーソルも同時に解放されます。
先の被準備文が動的SELECT文の場合、SQL文識別子または拡張SQL文識別子に対応するカーソルを参照している準備可能動的DELETE文:位置づけおよび準備可能動的UPDATE文:位置づけの被準備文も同時に解放されます。
トランザクションが異なる場合でも、SQL文識別子または拡張SQL文識別子は有効となります。
被準備文の名前を指定します。
SQL文識別子には、36文字以内の先頭が英字で始まる英数字、または18文字以内の日本語文字列を指定します。英字の小文字は対応する英字の大文字に変換されます。英字の大文字と小文字を区別する場合は、区切り識別子で指定します。詳細は、“2.1.3 トークン”を参照してください。
拡張SQL文識別子は、文字列型の埋込み変数で指定します。拡張SQL文識別子の値が被準備文の名前になります。拡張SQL文識別子の値には、36文字以内の先頭が英字で始まる英数字、または18文字以内の日本語文字列を指定します。英字の大文字と小文字は区別されます。
拡張SQL文識別子の値に空白を含む場合は、前後の空白を取り除いた値が被準備文の名前になります。
SQL文識別子と拡張SQL文識別子の値が同じでも、異なる識別子として区別されます。
SQL文を設定した変数(埋込み変数)の名前を指定します。
SQL文変数のデータ型は、文字列型であることが必要です。
SQL文変数に設定するSQL文には、SQL先頭子(EXEC SQL)、SQL終了子(END-EXECまたは;)、注釈およびホスト変数を含むことはできません。
SQL文変数に設定するSQL文に埋込み変数を指定する場合には、動的パラメタ指定で指定します。
動的パラメタ指定は“2.3 値指定と相手指定”を参照してください。
SQL文変数の内容が準備可能動的DELETE文:位置づけまたは準備可能動的UPDATE文:位置づけの場合、指定したカーソル名は、以下のいずれかと同じであることが必要です。ただし、両方と同じである場合は、例外(あいまいなカーソル名)となります。
同一コンパイル単位に含まれる動的カーソル宣言のカーソル名
同一セションで実行されたALLOCATE CURSOR文の拡張カーソル名の値
また、指定したカーソルがオープンされていることが必要です。
SQL文変数に設定したSQL文が動的SELECT文の場合、PREPARE文で指定しているSQL文識別子または拡張SQL文識別子に対応するカーソルは、閉じられた状態であることが必要です。
使用例
準備可能文が、DELETE文:探索の場合を示します。なお、可変長文字型の展開規則は、“6.3 SQL埋込みCプログラム”を参照してください。
EXEC SQL BEGIN DECLARE SECTION; VARCHAR CMDAREA[100]; EXEC SQL END DECLARE SECTION; : strcpy(CMDAREA.sqlvar," DELETE FROM S1.TBL WHERE COL1 = 39"); (1) CMDAREA.sqllen = strlen(CMDAREA.sqlvar); EXEC SQL PREPARE CMD FROM :CMDAREA; (2) EXEC SQL EXECUTE CMD; (3)
(1) ホスト変数CMDAREAにDELETE文:探索を設定します。
(2) ホスト変数CMDAREAが示すSQL文をSQL文識別子CMDに対応づけます。
(3) SQL文識別子CMDに対応づけられた被準備文を実行します。
これは、次のSQL文と同じです。
EXEC SQL DELETE FROM S1.TBL WHERE COL1 = 39;
拡張SQL文識別子を指定した場合の例を示します。なお、可変長文字型の展開規則は、“6.3 SQL埋込みCプログラム”を参照してください。
EXEC SQL BEGIN DECLARE SECTION; CHAR CMDVAR[4]; VARCHAR CMDAREA[100]; EXEC SQL END DECLARE SECTION; : strcpy(CMDVAR,"CMD"); (1) strcpy(CMDAREA.sqlvar,"DELETE FROM S1.TBL WHERE COL1 = 39"); (2) CMDAREA.sqllen = strlen(CMDAREA.sqlvar); EXEC SQL PREPARE :CMDVAR FROM :CMDAREA; (3) EXEC SQL EXECUTE :CMDVAR; (4) EXEC SQL DEALLOCATE PREPARE :CMDVAR; (5)
(1) ホスト変数CMDVARに被準備文の名前CMDを設定します。
(2) ホスト変数CMDAREAにDELETE文:探索を設定します。
(3) ホスト変数CMDAREAが示すSQL文を拡張SQL文識別子CMDVARの値CMDに対応づけます。
(4) 被準備文を実行します。
(5) 拡張SQL文識別子CMDVARの値CMDに対応する被準備文を解放します。