ページの先頭行へ戻る
Symfoware Server V10.0.0/V10.0.1 SQLリファレンス

4.16 PREPARE文

機能

動的に実行するSQL文を準備します。

記述形式

参照項番

権限

一般規則

SQL文識別子または拡張SQL文識別子
  • 被準備文の名前を指定します。

  • SQL文識別子には、36文字以内の先頭が英字で始まる英数字、または18文字以内の日本語文字列を指定します。英字の小文字は対応する英字の大文字に変換されます。英字の大文字と小文字を区別する場合は、区切り識別子で指定します。詳細は、“2.1.3 トークン”を参照してください。

  • 拡張SQL文識別子は、文字列型の埋込み変数で指定します。拡張SQL文識別子の値が被準備文の名前になります。拡張SQL文識別子の値には、36文字以内の先頭が英字で始まる英数字、または18文字以内の日本語文字列を指定します。英字の大文字と小文字は区別されます。

  • 拡張SQL文識別子の値に空白を含む場合は、前後の空白を取り除いた値が被準備文の名前になります。

  • 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文識別子に対応するカーソルは、閉じられた状態であることが必要です。

使用例

例1

準備可能文が、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;
例2

拡張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に対応する被準備文を解放します。