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

4.15 OPEN文(動的OPEN文)

機能

動的OPEN文は、入力変数とカーソル指定を関連づけ、動的カーソル宣言またはALLOCATE CURSOR文で指定したカーソルを開きます。

記述形式

構文の構成

参照項番

権限

一般規則

カーソル名または拡張カーソル名
  • カーソルの名前を指定します。

  • 動的カーソル宣言で定義したカーソルを開く場合は、カーソル名を指定します。

  • ALLOCATE CURSOR文で定義したカーソルを開く場合は、拡張カーソル名を指定し、拡張カーソル名の値にカーソルの名前を指定します。

  • 拡張カーソル名は、文字列型の埋込み変数で指定します。拡張カーソル名の値に空白を含む場合は、前後の空白を取り除いた値がカーソルの名前になります。

  • カーソル名を指定した場合、カーソル名は、同一コンパイル単位に含まれる動的カーソル宣言で定義されていることが必要です。

  • カーソル名と拡張カーソル名の値が同じでも、異なるカーソルとして区別されます。

USING
  • カーソル名に関連する被準備文が動的パラメタ指定を含む場合、USING句が指定されていることが必要です。

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

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

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

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

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

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

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

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

使用例

例1

SQLDA構造体を使用して、SQL文識別子CMDに対応する被準備文の動的パラメタ指定の情報を取得します。なお、可変長文字型の展開規則は、“6.3 SQL埋込みCプログラム”を参照してください。

  #include "qdbnosis.h"
  
  EXEC SQL BEGIN DECLARE SECTION;
      VARCHAR CMDAREA[100];
      SQLDA   *sqlda_in;
  EXEC SQL END DECLARE SECTION;
              :
  size = sizeof(SQLDA) + sizeof(sqlvar) * (50 - 1 );
  
  sqlda_in = (SQLDA *)malloc(size);                                          (1)
  memset( sqlda_in, 0x00, size );
  sqlda_in->SQLN = 50;
  
  EXEC SQL DECLARE CU1 CURSOR FOR CMD;                                           (2)
  strcpy(CMDAREA.sqlvar,"SELECT COL1,COL2,COL3 FROM S1.TBL WHERE COL4=?");   (3)
  CMDAREA.sqllen = strlen( CMDAREA.sqlvar );
  
  EXEC SQL PREPARE CMD FROM :CMDAREA;                                        (4)
  
  EXEC SQL DESCRIBE INPUT CMD USING SQL DESCRIPTOR :sqlda_in;                (5)
              :
    (SQLDA構造体に必要な情報を設定)
              :
  EXEC SQL OPEN CU1 USING SQL DESCRIPTOR :sqlda_in;                          (6)
  EXEC SQL FETCH CU1 INTO :COL1,:COL2,:COL3;
              :
  EXEC SQL CLOSE CU1;

(1) SQLDA構造体sqlda_inの領域を割り当てます。

(2) 動的カーソル宣言によりCU1のカーソルを宣言します。

(3) ホスト変数CMDAREAに動的SELECT文を設定します。

(4) ホスト変数CMDAREAが示すSQL文をSQL文識別子CMDに対応づけます。

(5) SQL文識別子CMDに対応する被準備文の動的パラメタの情報をSQLDA構造体sqlda_inに取り込みます。

(6) USING句を指定して動的パラメタ指定の値を関連づけて、動的OPEN文によりカーソルをオープンします。


例2

SQL記述子域を使用して、SQL文識別子CMDに対応する被準備文の動的パラメタ指定の情報を取得します。なお、可変長文字型の展開規則は、“6.3 SQL埋込みCプログラム”を参照してください。

  EXEC SQL BEGIN DECLARE SECTION;
      VARCHAR CMDAREA[100];
  EXEC SQL END DECLARE SECTION;
                  :
  EXEC SQL ALLOCATE DESCRIPTOR 'DESC1' WITH MAX 50;                           (1)
  EXEC SQL DECLARE CU1 CURSOR FOR CMD;                                        (2)
  strcpy(CMDAREA.sqlvar,"SELECT COL1,COL2,COL3 FROM S1.TBL WHERE COL4 = ?");  (3)
  CMDAREA.sqllen = strlen(CMDAREA.sqlvar);
  EXEC SQL PREPARE CMD FROM :CMDAREA;                                         (4)
  EXEC SQL DESCRIBE INPUT CMD USING SQL DESCRIPTOR 'DESC1';                   (5)
                  :
    (SQL記述子域に必要な情報を設定)
                  :
  EXEC SQL OPEN CU1 USING SQL DESCRIPTOR 'DESC1';                             (6)
  EXEC SQL FETCH CU1 INTO :COL1,:COL2,:COL3;
                  :
  EXEC SQL CLOSE CU1;

(1) 記述子名DESC1のSQL記述子域を割り当てます。

(2) 動的カーソル宣言によりCU1のカーソルを宣言します。

(3) ホスト変数CMDAREAに動的FETCH文を設定します。

(4) ホスト変数CMDAREAが示すSQL文をSQL文識別子CMDに対応づけます。

(5) SQL文識別子CMDに対応する被準備文の動的パラメタ指定の情報を記述子名DESC1のSQL記述子域に取り込みます。

(6) USING句を指定して動的パラメタ指定の値を関連づけて、動的OPEN文によりカーソルをオープンします。

例3

拡張カーソル名を指定した場合の例を示します。なお、可変長文字型の展開規則は、“6.3 SQL埋込みCプログラム”を参照してください。

  EXEC SQL BEGIN DECLARE SECTION;
       CHAR CURVAR[4];
       CHAR CMDVAR[4];
       VARCHAR CMDAREA[100];
  EXEC SQL END DECLARE SECTION;
                  :
  EXEC SQL ALLOCATE DESCRIPTOR 'DESC1' WITH MAX 50;                         (1)
  strcpy(CURVAR,"CU1");                                                     (2)
  strcpy(CMDVAR,"CMD");                                                     (3)
  strcpy(CMDAREA.sqlvar,"SELECT COL1,COL2,COL3 FROM S1.TBL WHERE COL4 = ?");(4)
  CMDAREA.sqllen = strlen(CMDAREA.sqlvar);
  EXEC SQL PREPARE :CMDVAR FROM :CMDAREA;                                   (5)
  EXEC SQL ALLOCATE :CURVAR CURSOR FOR :CMDVAR;                             (6)
  EXEC SQL DESCRIBE INPUT :CMDVAR USING SQL DESCRIPTOR 'DESC1';             (7)
                  :
    (SQL記述子域に必要な情報を設定)
                  :
  EXEC SQL OPEN :CURVAR USING SQL DESCRIPTOR 'DESC1';                        (8)
  EXEC SQL FETCH :CURVAR INTO SQL DESCRIPTOR 'DESC2';
                  :
  EXEC SQL CLOSE :CURVAR;

(1) 記述子名DESC1のSQL記述子域を割り当てます。

(2) ホスト変数CURVARにカーソルの名前CU1を設定します。

(3) ホスト変数CMDVARに被準備文の名前CMDを設定します。

(4) ホスト変数CMDAREAに動的SELECT文を設定します。

(5) ホスト変数CMDAREAが示すSQL文を拡張SQL文識別子CMDVARの値CMDに対応づけます。

(6) 拡張カーソル名CURVARの値CU1と拡張SQL文識別子CMDVARの値CMDを対応づけます。

(7) 拡張SQL文識別子CMDVARの値CMDに対応する被準備文の動的パラメタ指定の情報を記述子名DESC1のSQL記述子域に取り込みます。

(8) USING句を指定して動的パラメタ指定の値を関連づけて、動的OPEN文によりカーソルをオープンします。