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

4.11 EXECUTE文

機能

入力変数と出力変数を被準備文に関連づけてからその文を実行します。

記述形式

構文の構成

参照項番

権限

一般規則

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

  • 実行する被準備文を準備したPREPARE文がSQL文識別子を指定している場合は、SQL文識別子を指定します。

  • 実行する被準備文を準備したPREPARE文が拡張SQL文識別子を指定している場合は、拡張SQL文識別子を指定し、拡張SQL文識別子の値に被準備文の名前を指定します。

  • 拡張SQL文識別子は、文字列型の埋込み変数で指定します。拡張SQL文識別子の値に空白を含む場合は、前後の空白を取り除いた値が被準備文の名前になります。

  • SQL文識別子を指定した場合、SQL文識別子は、同一コンパイル単位に含まれるPREPARE文で定義されていることが必要です。

  • SQL文識別子と拡張SQL文識別子の値が同じでも、異なる被準備文として区別されます。

  • PREPARE文により準備された被準備文は以下のものであることが必要です。

    • 動的単一行SELECT文

    • UPDATE文:探索

    • INSERT文

    • DELETE文:探索

    • 準備可能動的UPDATE文:位置づけ

    • 準備可能動的DELETE文:位置づけ

    • スキーマ定義文

    • スキーマ操作文

    • 格納構造定義文

    • 格納構造操作文

    • 利用者制御文

    • アクセス制御文

    • システム制御文

    • CALL文

パラメタUSING
  • PREPARE文により準備された被準備文に動的パラメタ指定がある場合、パラメタUSING句を指定します。

  • パラメタUSING句にUSING引数を指定した場合、引数には被準備文の動的パラメタ指定の値を設定します。設定する内容については、“表4.1 取得(設定)識別子に設定される値”を参照してください。

    • 引数の順序は動的パラメタの順序に対応していることが必要です。

    • 引数の個数は動的パラメタ指定の個数と同じであることが必要です。

    • 引数のデータ型は動的パラメタ指定のデータ型と比較可能であることが必要です。

  • パラメタUSING句にUSING記述子を指定した場合、記述子域には被準備文の動的パラメタ指定の値の情報を指定します。

    • 項目記述子域の順序は動的パラメタ指定の順序に対応していることが必要です。

    • SQLDA構造体のメンバSQLTYPE、SQLLEN、SQLPRECISION.PRECISION、SQLSCALE、SQLNAME、SQLPRECISION.INTERVALまでの情報は、入力DESCRIBE文を実行することにより設定されているので、記述子域の内容を変更しない限り設定する必要はありません。ただし、日時型、時間隔型は文字列型に変更する必要があります。

    • SQL記述子域の識別子TYPE、LENGTH、OCTET_LENGTH、PRECISION、SCALE、CHARACTER_SET_NAME、NAME、DATETIME_INTERVAL_CODE、DATETIME_INTERVAL_PRECISIONまでの情報は、入力DESCRIBE文を実行することにより設定されているので、記述子域の内容を変更しない限り設定する必要はありません。ただし、日時型、時間隔型は文字列型に変更する必要があります。

結果USING
  • PREPARE文により準備された被準備文が動的単一行SELECT文である場合、結果USING句を指定します。

  • 結果USING句にUSING引数を指定した場合、引数には相手指定を設定します。設定する内容については、“表4.1 取得(設定)識別子に設定される値”を参照してください。

    • 引数の順序は相手指定の順序に対応していることが必要です。

    • 引数の個数は相手指定の個数と同じであることが必要です。

    • 引数のデータ型は相手指定のデータ型と代入可能であることが必要です。

  • 結果USING句にUSING記述子を指定した場合、記述子域には相手指定の情報を指定します。

    • 項目記述子域の順序は相手指定の順序に対応していることが必要です。

    • SQLDA構造体のメンバSQLTYPE、SQLLEN、SQLPRECISION.PRECISION、SQLSCALE、SQLNAME、SQLPRECISION.INTERVALまでの情報は、出力DESCRIBE文を実行することにより設定されているので、記述子域の内容を変更しない限り設定する必要はありません。ただし、日時型、時間隔型は文字列型に変更する必要があります。

    • SQL記述子域のTYPE、LENGTH、OCTET_LENGTH、PRECISION、SCALE、CHARACTER_SET_NAME、NAME、DATETIME_INTERVAL_CODE、DATETIME_INTERVAL_PRECISIONまでの情報は、出力DESCRIBE文を実行することにより設定されているので、記述子域の内容を変更しない限り設定する必要はありません。ただし、日時型、時間隔型は文字列型に変更する必要があります。

記述子名
  • 記述子名には、SQL記述子域の名前またはSQLDA構造体変数の変数名を指定します。

  • 記述子名は、文字列定数または文字列型の埋込み変数で指定します。

使用例

1

DELETE文:探索を動的に実行します。なお、可変長文字型の展開規則は、“6.3 SQL埋込みCプログラム”を参照してください。

  EXEC SQL BEGIN DECLARE SECTION;
      VARCHAR CMDAREA[100];
      short INVAR1;
  EXEC SQL END DECLARE SECTION;
                  :
  strcpy(CMDAREA.sqlvar,"DELETE FROM S1.TBL WHERE COL1 = ?");
  CMDAREA.sqllen = strlen(CMDAREA.sqlvar);
  EXEC SQL PREPARE CMD FROM :CMDAREA; 
                  :
    (変数"INVAR1"に値を設定)
                  :
  EXEC SQL EXECUTE CMD USING :INVAR1;

2

単一行SELECT文を動的に実行します。なお、可変長文字型の展開規則は、“6.3 SQL埋込みCプログラム”を参照してください。

  EXEC SQL BEGIN DECLARE SECTION;
      VARCHAR CMDAREA[100];
  EXEC SQL END DECLARE SECTION;
                  :
  strcpy(CMDAREA.sqlvar,"SELECT COL1,COL2,COL3 FROM S1.TBL WHERE COL4 = ?");
  CMDAREA.sqllen = strlen(CMDAREA.sqlvar);
  EXEC SQL PREPARE CMD FROM :CMDAREA;
                  :
    (SQL記述子域に必要な情報を設定)
                  :
  EXEC SQL EXECUTE CMD INTO SQL DESCRIPTOR 'DESC1'
                       USING SQL DESCRIPTOR 'DESC2';

例3

SQLDA構造体を使用して、単一行SELECT文を動的に実行します。なお、可変長文字型の展開規則は、“6.3 SQL埋込みCプログラム”を参照してください。

  #include "qdbnosis.h"

  EXEC SQL BEGIN DECLARE SECTION;
    VARCHAR CMDAREA[100];
    SQLDA   *sqlda_out;
    SQLDA   *sqlda_in;
  EXEC SQL END DECLARE SECTION;
              :
  strcpy(CMDAREA.sqlvar,"SELECT COL1,COL2,COL3 FROM S1.TBL WHERE COL4=?");
  CMDAREA.sqllen = strlen( CMDAREA.sqlvar );
  EXEC SQL PREPARE CMD FROM :CMDAREA;
              :
    (SQLDA構造体に必要な情報を設定)
              :
  EXEC SQL EXECUTE CMD1 INTO SQL DESCRIPTOR :sqlda_out
                        USING SQL DESCRIPTOR :sqlda_in;
例4

拡張SQL文識別子を指定して単一行SELECT文を動的に実行します。なお、可変長文字型の展開規則は、“6.3 SQL埋込みCプログラム”を参照してください。

  EXEC SQL BEGIN DECLARE SECTION;
      CHAR CMDVAR[4];
      VARCHAR CMDAREA[100];
  EXEC SQL END DECLARE SECTION;
                  :
  strcpy(CMDVAR,"CMD");
  strcpy(CMDAREA.sqlvar,"SELECT COL1,COL2,COL3 FROM S1.TBL WHERE COL4 = ?");
  CMDAREA.sqllen = strlen(CMDAREA.sqlvar);
  EXEC SQL PREPARE :CMDVAR FROM :CMDAREA;
                  :
    (SQL記述子域に必要な情報を設定)
                  :
  EXEC SQL EXECUTE :CMDVAR INTO SQL DESCRIPTOR 'DESC1'
                           USING SQL DESCRIPTOR 'DESC2';