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

4.10 DESCRIBE文

機能

被準備文中の動的パラメタ指定または選択リストについての情報を取り出します。

記述形式

構文の構成

一般規則

INPUT(入力DESCRIBE)
  • キーワードINPUTを指定したDESCRIBE文を、“入力DESCRIBE文”と呼びます。

  • 入力DESCRIBE文は、記述子域に被準備文である動的SELECT文、動的単一行SELECT文、DELETE文:探索、UPDATE文:探索、INSERT文、UPDATE文:位置づけの動的パラメタ指定の情報が取り込まれます。結果は、記述子域に次のように格納されます。格納する内容については、“表4.1 取得(設定)識別子に設定される値”を参照してください。

    • 被準備文中にある動的パラメタ指定の個数が、SQLDA構造体のメンバSQLNの数を超えている、またはALLOCATE DESCRIPTOR文で指定した実現値の数を超えていると、項目記述子域には値が設定されません。そうでなければ、項目記述子域の先頭から、動的パラメタ指定が記述されている順序に対応して値が設定されます。

OUTPUT(出力DESCRIBE)
  • キーワードOUTPUTを指定した、またはキーワードを省略したDESCRIBE文を、“出力DESCRIBE文”と呼びます。

  • 出力DESCRIBE文は、記述子域に被準備文である動的SELECT文または動的単一行SELECT文の選択リストの情報が取り込まれます。結果は、記述子域に次のように格納されます。格納する内容については、“表4.1 取得(設定)識別子に設定される値”を参照してください。

    • 選択リストの個数が、SQLDA構造体のメンバSQLNの数を超えている、またはALLOCATE DESCRIPTOR文で指定した実現値の数を超えていると、項目記述子域には値が設定されません。そうでなければ、項目記述子域の先頭から、選択リストの順序に対応して値が設定されます。

表4.1 取得(設定)識別子に設定される値

設定識別子

出力DESCRIBE

入力DESCRIBE

OPEN,EXECUTE

FETCH,EXECUTE

SQLDA構造体

SQL記述子域

SQLD

COUNT

選択リストの個数

被準備中にある動的パラメタ指定の個数

動的パラメタ指定の個数を設定する。 (注1)

相手指定の個数を設定する。
(注1)

SQLTYPE

TYPE

データ型のコード

動的パラメタ指定のデータ型に対応するコード (注2)

動的パラメタ指定のデータ型に対応するコードを設定する。 (注1)

相手指定のデータ型に対応するコードを設定する。
(注1)

LENGTH

  • 文字列の最大文字長(文字列型または各国語文字列型の場合)

  • データ長(真数型、概数型、日時型、時間隔型、BLOB型、またはROW_IDの場合)
    (注3)

  • 文字列の最大文字長を設定する。(文字列型または各国語文字列型の場合)
    (注1)

  • 無視(真数型または概数型の場合)
    (注1)

  • データ長を設定する。(BLOB型、ROW_IDの場合)
    (注1)
    (注4)

(注1)

SQLLEN

OCTET_LENGTH

  • 文字列の最大バイト数(文字列型または各国語文字列型の場合)

  • データ長(真数型、概数型、日時型、時間隔型、BLOB型、またはROW_IDの場合)
    (注3)

  • 文字列の最大バイト数を設定する。(文字列型または各国語文字列型の場合)
    (注1)

  • 無視(真数型、概数型またはBLOB型の場合)
    (注1)
    (注4)

(注1)

SQLPRECISION.PRECISION

PRECISION

  • 精度(真数型または概数型の場合)

  • 0(真数型でも概数型でもない場合)

  • 精度を設定する。(真数型または概数型の場合) (注1)

  • 無視(真数型でも概数型でもない場合) (注1)

(注1)

SQLSCALE (注2)

SCALE

  • 位取り(真数型または概数型の場合)

  • 0(真数型でも概数型でもない場合)

  • 位取りを設定する。(真数型または概数型の場合)

  • 無視(真数型でも概数型でもない場合) (注1)

(注1)

SQLNULLABLE

NULLABLE

  • 1(NULL値を許す場合)

  • 0(NULL値を許さない場合)

  

  

INDICATOR

なし

  • 標識変数に対する値を設定する。動的パラメタ指定の値がNULL値なら負を設定する。(NULLABLEの値が1の場合)
    (注5)

  • 無視(NULLABLEの値が1でない場合)
    (注5)

相手指定に対する標識変数が設定される。

DATA

なし

動的パラメタ指定に対する値を設定する。(注5)

相手指定に対する値が設定される。

SQLNAME

NAME

選択リストの値式の列指定の列名が設定される。列指定でない場合は値は設定されない。値式にAS句が指定された場合は、AS句の列名が設定される。

動的パラメタ指定に対応する列指定の列名、または動的パラメタ指定に対応する値式の列指定の列名が設定される。動的パラメタ指定に対応する値式が列指定でない場合は、または動的パラメタ指定が演算式中に含まれる場合は、値は設定されない。

無視

  

CHARACTER_SET_NAME

選択リストの値式のデータ型が文字列型または各国語文字列型の場合、データ型に対応する文字セット名が設定される。そうでない場合は、空白が設定される。

動的パラメタ指定のデータ型が文字列型または各国語文字列型の場合、データ型に対応する文字セット名が設定される。そうでない場合は、空白が設定される。

動的パラメタ指定のデータ型が文字列型または各国語文字列型の場合、データ型に対応する文字セット名を設定する。 (注1)

相手指定のデータ型が文字列型または各国語文字列型の場合、データ型に対応する文字セット名を設定する。 (注1)

SQLSCALE (注2)

DATETIME_INTERVAL_CODE

日時型、時間隔型以外

  • 0


日時型

  • 1(DATE型の場合)

  • 2(TIME型の場合)

  • 3(TIMESTAMP型の場合)

時間隔型

  • 1(時間隔修飾子がYEARの場合)

  • 2(時間隔修飾子がMONTHの場合)

  • 3(時間隔修飾子がDAYの場合)

  • 4(時間隔修飾子がHOURの場合)

  • 5(時間隔修飾子がMINUTEの場合)

  • 6(時間隔修飾子がSECONDの場合)

  • 7(時間隔修飾子がYEAR TO MONTHの場合)

  • 8(時間隔修飾子がDAY TO HOURの場合)

  • 9(時間隔修飾子がDAY TO MINUTEの場合)

  • 10(時間隔修飾子がDAY TO SECONDの場合)

  • 11(時間隔修飾子がHOUR TO MINUTEの場合)

  • 12(時間隔修飾子がHOUR TO SECONDの場合)

  • 13(時間隔修飾子がMINUTE TO SECONDの場合)

日時型、時間隔型以外 (注1)

  • 0を設定する。


日時型 (注1)

  • 1を設定する。(DATE型の場合)

  • 2を設定する。(TIME型の場合)

  • 3を設定する。(TIMESTAMP型の場合)

時間隔型(注1)

  • 1を設定する。(時間隔修飾子がYEARの場合)

  • 2を設定する。(時間隔修飾子がMONTHの場合)

  • 3を設定する。(時間隔修飾子がDAYの場合)

  • 4を設定する。(時間隔修飾子がHOURの場合)

  • 5を設定する。(時間隔修飾子がMINUTEの場合)

  • 6を設定する。(時間隔修飾子がSECONDの場合)

  • 7を設定する。(時間隔修飾子がYEAR TO MONTHの場合)

  • 8を設定する。(時間隔修飾子がDAY TO HOURの場合)

  • 9を設定する。(時間隔修飾子がDAY TO MINUTEの場合)

  • 10を設定する。(時間隔修飾子がDAY TO SECONDの場合)

  • 11を設定する。(時間隔修飾子がHOUR TO MINUTEの場合)

  • 12を設定する。(時間隔修飾子がHOUR TO SECONDの場合)

  • 13を設定する。(時間隔修飾子がMINUTE TO SECONDの場合)

SQLPRECISION.INTERVAL

DATETIME_INTERVAL_PRECISION

精度(時間隔型の場合)

  • 0(時間隔型でない場合)

精度を設定する。(時間隔型の場合) (注1)

  • 無視(時間隔型でない場合) (注1)

注1) 入力DESCRIBE文または出力DESCRIBE文で設定される値

注2) SQLTYPE=10(INTERVAL)の場合、SQLSCALEにDATETIME_INTERVAL_CODEの値が格納されます。

注3) 日時型、時間隔型は文字列で表現したデータ長

注4) 日時型・時間隔型は、文字列として設定します。

注5) 利用者が設定する値

備考1.(注1)、(注5)の項目は、SQL文を実行する前に設定しておく必要のある項目です。

備考2.(注1)、(注5)のない項目は、SQL文の実行時に設定される項目です。

備考3.動的パラメタ指定のデータ型は、以下のように決定されます。

  • 動的パラメタ指定が演算式中に含まれる場合、動的パラメタ指定のデータ型は演算の相手の値式のデータ型となります。

  • 動的パラメタ指定が演算式中に含まれない場合、動的パラメタ指定のデータ型は比較や代入の相手の値式のデータ型となります。たとえば、C2=?の場合、動的パラメタ指定のデータ型はC2のデータ型となります。

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

  • 情報を取り出す被準備文を準備したPREPARE文がSQL文識別子を指定している場合は、SQL文識別子を指定します。

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

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

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

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

USING記述子
  • 同一の記述子名のUSING記述子が動的OPEN文に指定されている場合は、動的OPEN文に指定しているカーソルは、閉じられた状態であることが必要です。

  • 同一の記述子名のUSING記述子が動的OPEN文、動的FETCH文、EXECUTE文に指定され、これらの文の実行が終了している場合にDESCRIBE文を実行すると、先のSQL記述子域の内容は失われます。

記述子名
  • 記述子名には、ALLOCATE DESCRIPTOR文で割当てを行ったSQL記述子域の名前またはSQLDA構造体の変数名を指定します。

  • SQL記述子域の値は、DESCRIPTOR取得文とDESCRIPTOR設定文で、それぞれ取得と設定を行います。

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

  • SQLDA構造体は、動的パラメタ指定または相手指定に関する情報を示します。

    SQLDA構造体は、項目記述子域(SQL記述子域の各要素)SQLVAR、SQLVARの最大要素数SQLNおよび有効要素数SQLDで構成されています。SQLNおよびSQLDのデータ型は2進の精度を持つ真数です。

    SQLDA構造体の形式を以下に示します。

    #define SQL_DESC_ENT_NUM 1
      
    typedef struct sqlextinf {
        int     SQLPOSITION;         /* CALL文のパラメタ位置 */
        char    SQLSYSTEMRSV[252];   /* 予約域 */
    } sqlextinf;
      
    typedef struct sqlvar {
        char    *SQLDATA;            /* 変数データ域 */
        short   *SQLIND;             /* 標識変数データ域 */
        int      SQLLEN;             /* データ長 */
        short    SQLTYPE;            /* データ型のコード */
        short    SQLSCALE;           /* 位取り */
        union{
              short  PRECISION;
              struct {
                char    PRECISION;
                char    DATETIME_INTERVAL_PRECISION;
              } INTERVAL;
        } SQLPRECISION;              /* 精度 */
        short    SQLNULLABLE;        /* NULL可能性 */
        struct {
            short  SQLNAMEL;         /* 列名長 */
            char   SQLNAMEC[128];    /* 列名 */
        } SQLNAME;
        sqlextinf *SQLEXTINF;        /* 拡張情報 */
    } sqlvar;
      
    typedef struct SQLDA {
        short   SQLN;                /* SQLVARの実配列数 */
        short   SQLD;                /* SQLVARのデータの設定数 */
        sqlvar  SQLVAR[SQL_DESC_ENT_NUM];
    } SQLDA;

  • SQL記述子域は動的パラメタ指定または相手指定に関する情報を示します。SQL記述子域は識別子COUNTと0以上の項目記述子域(SQL記述子域の各要素)で構成されています。COUNTはSQL記述子域の動的パラメタ指定または相手指定の数を示し、そのデータ型は2進の精度を持つ真数です。

  • 項目記述子域は以下の内容で構成されています。

    表4.2 項目記述子域の内容

    項目記述子域

    意味

    データ型

    SQLDA構造体のメンバ名

    SQL記述子域の識別子

    SQLDATA

    ホスト変数のアドレス

    SQLIND

    標識変数のアドレス

    DATA

    データ値

    TYPE, LENGTH, OCTET_LENGTH, PRECISION, SCALE, CHARACTER_SET_NAME, DATETIME_INTERVAL_CODEで指定されるデータ型に一致

    INDICATOR

    標識変数の値

    2進の精度を持つ真数

    SQLLEN

    OCTET_LENGTH

    長さ(バイト数)

    2進の精度を持つ真数

    LENGTH

    長さ(文字数)

    2進の精度を持つ真数

    SQLTYPE

    TYPE

    データ型のコード

    2進の精度を持つ真数

    SQLSCALE

    SCALE

    位取りまたは日時型・時間隔型のコード

    2進の精度を持つ真数

    SQLPRECISION.PRECISION

    PRECISION

    精度

    2進の精度を持つ真数

    SQLPRECISION.INTERVAL

    DATETIME_INTERVAL_PRECISION

    時間隔先行フィールド精度

    2進の精度を持つ真数

    DATETIME_INTERVAL_CODE

    日時型・時間隔型のコード

    2進の精度を持つ真数

    SQLNULLABLE

    NULLABLE

    NULL値を許すかどうか

    2進の精度を持つ真数

    SQLNAME

    NAME

    列指定の列名

    SQLDA構造体の場合:
    長さ108バイト以下の文字列型
    SQL記述子域の場合:
    長さ38バイト以上108バイト以下の文字列型

    CHARACTER_SET_NAME

    文字セット名

    長さ38バイト以上108バイト以下の文字列型

    SQLEXTINF

    拡張情報

  • SQLDA構造体のSQLTYPEの値(データ型のコード)またはSQL記述子域のTYPEの値(データ型のコード)とSQLのデータ型の対応は以下の通りです。

    表4.3 SQLTYPEまたはTYPEの値とSQLのデータ型の対応

    コード

    データ型

    1

    CHARACTERまたはNATIONAL CHARACTER (注1)

    2

    NUMERIC

    3

    DECIMAL

    4

    INTEGER

    5

    SMALLINT

    7

    REAL

    8

    DOUBLE PRECISION

    9

    DATE、TIMEまたはTIMESTAMP

    10

    INTERVAL

    11

    NATIONAL CHARACTER (注1)

    12

    CHARACTER VARYING
    またはNATIONAL CHARACTER VARYING (注1)

    13

    NATIONAL CHARACTER VARYING (注1)

    30

    BLOB

    31

    (注2)

    50

    ROW_ID

    注1) データ型がNATIONAL CHARACTER、NATIONAL CHARACTER VARYINGの場合、SQLDA構造体の場合は、コードが11と13になります。 SQL記述子域の場合は、コードが1と12になります。CHARACTERとNATIONAL CHARACTERの区別は、CHARACTER_SET_NAMEの値で識別します。

    注2) SQL埋込みCプログラムにおいて、8バイトの整数型(long long型など)と対応します。DESCRIBE文では、コードに31は返却されません。


  • SQLDA構造体のSASQLTYPEの値が9を示す場合は、メンバSQLSCALEには以下のDATE_TIME_INTERVAL_CODEを格納します。また、SQL記述子域のTYPEの値が9を示す場合は、以下のDATETIME_INTERVAL_CODEを格納します。

表4.4 SQLTYPEの値が9を示す場合のDATETIME_INTERVAL_CODEの値

コード

データ型

1

DATE

2

TIME

3

TIMESTAMP


  • SQLDA構造体のSQLTYPEの値が10を示す場合は、メンバSQLSCALEには以下のDATE_TIME_INTERVAL_CODEを格納します。また、SQL記述子域のTYPEの値が10を示す場合は、以下のDATETIME_INTERVAL_CODEを格納します。

表4.5 SQLTYPEの値が10を示す場合のDATETIME_INTERVAL_CODEの値

コード

時間隔修飾子

1

YEAR

2

MONTH

3

DAY

4

HOUR

5

MINUTE

6

SECOND

7

YEAR TO MONTH

8

DAY TO HOUR

9

DAY TO MINUTE

10

DAY TO SECOND

11

HOUR TO MINUTE

12

HOUR TO SECOND

13

MINUTE TO SECOND


  • TYPEの値が1または12のとき、CHARACTER_SET_NAMEの値(文字セット名)は文字列型と各国語文字列型で以下のように異なります。

    文字列型:

    BASIC

    各国語文字列型:

    NCHAR

  • SQLDA構造体の場合、DESCRIBE文を実行すると、選択リストまたは動的パラメタ指定のデータ型に対応する精度、位取りおよび長さが、それぞれのSQLDA構造体のメンバSQLPRECISION、SQLSCALEおよびSQLLENに設定されます。

    また、SQL記述子域の場合は、DESCRIBE文を実行すると、動的パラメタ指定または選択リストのデータ型に対応する精度、位取り、長さ(文字数)および長さ(バイト数)が、それぞれのSQL記述子域の識別子のPRECISION、SCALE、LENGTH、OCTET_LENGTH、DATETIME_INTERVAL_PRECISIONに設定されます。


    SQLDA構造体の場合、データ型に対応するそれぞれの値は、以下のとおりです。

    表4.6 SQLのデータ型とSQLDA構造体の値の対応

    SQLのデータ型(注1)

    SQLTYPE

    SQLPRECISION

    SQLSCALE

    SQLLEN

    DATETIME_INTERVAL_PRECISION

    CHARACTER

    1

    0

    0

    1~32000

    0

    NUMERIC

    2

    1~18

    0~18

    1~19

    0

    DECIMAL

    3

    1~18

    0~18

    1~10

    0

    INTEGER

    4

    31

    0

    4

    0

    SMALLINT

    5

    15

    0

    2

    0

    REAL

    7

    23

    0

    4

    0

    DOUBLE PRECISION

    8

    52

    0

    8

    0

    DATE

    9

    0

    1 (注2)

    10

    0

    TIME

    9

    0

    2 (注2)

    8

    0

    TIMESTAMP

    9

    0

    3 (注2)

    19

    0

    INTERVAL

    10

    (注3)

    (注4)

    2~19

    1~19

    NATIONAL CHARACTER

    11

    0

    0

    2~32000

    0

    CHARACTER VARYING

    12

    0

    0

    3~32002 (注5)

    0

    NATIONAL CHARACTER VARYING

    13

    0

    0

    4~32002 (注5)

    0

    BLOB

    30

    0

    0

    n*1024 (注6)

    0

    (注7)

    31

    63

    0

    8

    0

    ROW_ID

    50

    0

    0

    24

    0

    注1) SQLデータ型に対応するCの変数定義については“6.3 SQL埋込みCプログラム”を参照してください。SQLデータ型に対応するCOBOLの変数定義については“6.4 SQL埋込みCOBOLプログラム”を参照してください。

    注2) DATE、TIMEまたはTIMESTAMPでは、SQLSCALE=0ですがDATETIME_INTERVAL_CODE値を代替として利用します。

    注3) INTERVALでのSQLPRECISIONはPRECISION値(0)とDATETIME_INTERVAL_PRECISIONとなります。

    注4) INTERVALでは、SQLSCALE=0ですがDATETIME_INTERVAL_CODE値を代替として利用します。

    注5) 先頭に2バイトの長さが含まれます。

    注6) n=1~2097150を示します。

    注7) SQL埋込みCプログラムにおいて、8バイトの整数型(long long型など)と対応します。DESCRIBE文では、コードに31は返却されません。


    SQL記述子域の場合、データ型に対応するそれぞれの値は、以下のとおりです。

表4.7 SQLのデータ型とSQL記述子域の値の対応

SQLのデータ型(注1)

TYPE

PRECISION

SCALE

OCTET_LENGTH

LENGTH

DATETIME_INTERVAL_PRECISION

CHARACTER

1

0

0

1~32000

1~32000

0

NATIONAL CHARACTER

1

0

0

2~32000

2~32000

0

NUMERIC

2

1~18

0~18

1~19

1~19

0

DECIMAL

3

1~18

0~18

1~10

1~10

0

INTEGER

4

31

0

4

4

0

SMALLINT

5

15

0

2

2

0

REAL

7

23

0

4

4

0

DOUBLE PRECISION

8

52

0

8

8

0

DATE

9

0

0

10

10

0

TIME

9

0

0

8

8

0

TIMESTAMP

9

0

0

19

19

0

INTERVAL

10

0

0

2~19

2~19

1~19

CHARACTER VARYING

12

0

0

1~32000

1~32000

0

NATIONAL CHARACTER VARYING

12

0

0

2~32000

1~16000

0

BLOB

30

0

0

n*1024 (注2)

n*1024 (注2)

0

(注3)

31

63

0

8

8

0

ROW_ID

50

0

0

24

24

0

注1) SQLデータ型に対応するCの変数定義については“6.3 SQL埋込みCプログラム”を参照してください。SQLデータ型に対応するCOBOLの変数定義については“6.4 SQL埋込みCOBOLプログラム”を参照してください。

注2) n=1~2097150を示します。

注3) SQL埋込みCプログラムにおいて、8バイトの整数型(long long型など)と対応します。DESCRIBE文では、コードに31は返却されません。


使用例

例1

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

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

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

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

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

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

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

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

(7) SQL文識別子CMDに対応する被準備文の選択リストの情報をSQLDA構造体sqlda_outに取り込みます。

(8) 動的OPEN文、動的FETCH文、動的CLOSE文によりカーソルの操作を行います。


例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 ALLOCATE DESCRIPTOR 'DESC2' WITH MAX 50;                          (2)
  EXEC SQL DECLARE CU1 CURSOR FOR CMD;                                       (3)
  strcpy(CMDAREA.sqlvar,"SELECT COL1,COL2,COL3 FROM S1.TBL WHERE COL4 = ?"); (4)
  CMDAREA.sqllen = strlen(CMDAREA.sqlvar);
  EXEC SQL PREPARE CMD FROM :CMDAREA;                                        (5)
  EXEC SQL DESCRIBE INPUT CMD USING SQL DESCRIPTOR 'DESC1';                  (6)
  EXEC SQL DESCRIBE OUTPUT CMD USING SQL DESCRIPTOR 'DESC2';                 (7)
                  :
    (SQL記述子域に必要な情報を設定)
                  :
  EXEC SQL OPEN CU1 USING SQL DESCRIPTOR 'DESC1';                            (8)
  EXEC SQL FETCH CU1 INTO SQL DESCRIPTOR 'DESC2';                            (8)
                  :
  EXEC SQL CLOSE CU1;

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

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

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

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

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

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

(7) SQL文識別子CMDに対応する被準備文の選択リストの情報を記述子名DESC2のSQL記述子域に取り込みます。

(8) 動的OPEN文、動的FETCH文、動的CLOSE文によりカーソルの操作を行います。