Symfoware Server SQLビギナーズガイド - FUJITSU -
目次 索引 前ページ次ページ

第7章 アプリケーションの実行時に動的SQL文を実行する方法> 7.2 SQL文を動的に変更して実行する

7.2.1 SQL文の準備とSQLDA構造体の操作

動的SQLを使用してデータベースからデータの取り出しを行う場合には、実行結果を受け取る相手指を指定します。相手指定に実行結果を受け取るためには、選択リストの情報をその相手指定の属性と一致させることが必要です。そこで、データベースからSQLDA構造体に選択リストの情報を取り込んで、属性を変更します。SQLDA構造体の位置づけを以下に示します。

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

SQLDA構造体は、項目記述子域“SQLVAR”およびSQLVARの最大要素数“SQLN”と有効要素数“SQLD”で構成されています。

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; 

SQLDA構造体の構成要素の各メンバの意味は以下の通りです。

■SQLN

SQLNは、記述され得る動的パラメタ指定の最大数または選択リスト項目の最大数を示します。したがって、SQLNは配列SQLVARの最大要素数を決定します。

■SQLD

SQLDは、配列SQLVARの有効要素数を決定します。

被準備文中に選択リスト項目がある場合、SQLDA構造体を指定した出力DESCRIBE文を実行すると、SQLDには選択リスト項目の個数が返却されます。

また、被準備文中に動的パラメタ指定が記述されている場合、SQLDA構造体を指定した入力DESCRIBE文を実行すると、SQLDには動的パラメタ指定の個数が返却されます。

■SQLVAR

SQLVARは、動的パラメタ指定または選択リスト項目の各種情報を格納する配列です。

動的パラメタ指定に対してはSQL文が実行される前に、この配列の情報を設定する必要があります。n個の動的パラメタ指定があるような、SQL文を被準備文として実行する場合、SQLVAR[0]からSQLVAR[n-1]に格納されている情報でSQL文が実行されます。

選択リストに対してはSQL文が実行される前に、この配列の情報を設定する必要があります。n個の選択リストがあるようなSQL文を被準備文として実行する場合、SQL文実行後にSQLVAR[0]からSQLVAR[n-1]に指定したデータバッファにデータが格納されます。

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

メンバ名

意味

データ型

SQLDATA

ホスト変数のアドレス

SQLIND

標識変数のアドレス

SQLLEN

長さ(バイト数)

2進の精度を持つ真数(注1)

SQLTYPE

データ型のコード

2進の精度を持つ真数(注2)

SQLSCALE

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

2進の精度を持つ真数(注2)

SQLPRECISION.PRECISION

精度

2進の精度を持つ真数(注2)

SQLPRECISION.INTERVAL. DATETIME_INTERVAL_PRECISION

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

2進の精度を持つ真数(注3)

SQLNULLABLE

NULL値を許すかどうか

2進の精度を持つ真数(注2)

SQLNAME

列指定の列名

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

SQLEXTINF

拡張情報

注1) C言語のint型のデータ型です。

注2) C言語のshort型のデータ型です。

注3) C言語のchar型のデータ型です。

SQLDA構造体のSQLTYPEの値(データ型のコード)とSQLのデータ型の対応は以下のとおりです。

コード

データ型

1

CHARACTER

2

NUMERIC

3

DECIMAL

4

INTEGER

5

SMALLINT

7

REAL

8

DOUBLE PRECISION

9

DATE, TIMEまたはTIMESTAMP

10

INTERVAL

11

NATIONAL CHARACTER

12

CHARACTER VARYING

13

NATIONAL CHARACTER VARYING

30

BLOB

50

ROW_ID

 

SQLTYPEの値が日時型を示す9の場合、SQLSCALEには、以下のDATETIME_INTERVAL_CODEを格納します。

コード

データ型

1

DATE

2

TIME

3

TIMESTAMP

 

SQLTYPEの値が時間隔型を示す10の場合、SQLSCALEには、以下の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

■実行結果の取り出し手順

USING記述子を使用して、実行結果を取り出す方法の順序を以下に示します。ここでは処理の流れを説明します。なお、各SQL文についてはこれ以降で説明します。

 

[図:被準備文の実行結果の取り出し手順]

SQL文を動的に変更してデータ操作を行う場合、そのSQL文を実行するための準備処理を行います。

■SQL文の準

動的SQLの実行の準備を行うには、PREPAREを使用します。プログラムの実行時にSQL文を作成して実行させる場合に、そのSQL文を“SQL文変”と呼ばれるホスト変数に文字列として格納します。そして、PREPARE文で実行の準備をします。このとき、SQL文変数に格納されたSQL文は文を識別するSQL文識別子と対応づけられます。

SQL文変数の内容が準備可能動的UPDATE文:位置づけまたは準備可能動的DELETE文:位置づけの場合は、事前に対応するカーソルをオープンしておくことが必要です。また、指定したカーソルは動的カーソルであることが必要です。

なお、すでにPREPARE文で定義されたSQL文識別子に対して、再度PREPARE文を実行する場合は、先の被準備文が解放され、新たに被準備文が準備されます。先の被準備文が動的SELECT文の場合、SQL文識別子に対応するカーソルを参照している準備可能動的UPDATE文:位置づけまたは準備可能動的DELETE文:位置づけの被準備文も同時に解放されます。ただし、被準備文が動的SELECT文の場合、SQL文識別子に対応するカーソルは閉じられた状態であることが必要です。

PREPARE文の指定例を以下に示します。実行準備を行うSQL文は、SQL文変数strに格納されているとします。このSQL文のSQL文識別子をSTMと定義します。

PREPARE  STM  FROM  :str
          (1)          (2)

(1) SQL文識別子

(2) SQL文変数

■SQL文の解

PREPARE文によって準備された被準備文を解放するには、DEALLOCATE PREPAREを使用します。

被準備文が動的SELECT文の場合、SQL文識別子に対応するカーソルを参照している準備可能動的UPDATE文:位置づけまたは準備可能動的DELETE文:位置づけの被準備文も同時に解放されます。また、その際のカーソルは、閉じられた状態であることが必要です。

DEALLOCATE PREPARE文の指定例を以下に示します。解放する被準備文は、PREPARE文によってSQL文識別子をSTMと定義された被準備文とします。

 

DEALLOCATE  PREPARE  STM
                        (1)

(1) SQL文識別子

■SQLDA構造体を操作するSQL

図:被準備文の実行結果の取り出し手順”で示したように、データベースからSQLDA構造体に選択リストの情報を取り込むには、DESCRIBE文を使用します。DESCRIBE文とその機能について以下で説明します。

◆DESCRIBE

DESCRIBE文では、PREPARE文で準備された被準備文の選択リストの情報をSQLDA構造体に取り込みます。このSQL文を“出力DESCRIBE”といいます。

SQL文識別子STM2に対応する被準備文の選択リストの情報を、SQLDA構造体に取り込む出力DESCRIBE文の例を以下に示します。

DESCRIBE  OUTPUT  STM2  USING  SQL  DESCRIPTOR  :OUTSQLDA
                     (1)                                  (2)

(1) SQL文識別子

(2) SQLDA構造体

SQL文識別子STM2に対する被準備文が以下の場合、SQLDA構造体の内容は次のようになります。

SELECT 製品名, 在庫数量 FROM 在庫管理.在庫表 WHERE 製品番号 = 110
              (1)

(1) 選択リスト


下へ7.2.1.1 動的SELECT文を準備して実行する(SQLDA構造体の場合)
下へ7.2.1.2 動的単一行SELECT文を準備して実行する(SQLDA構造体の場合)

目次 索引 前ページ次ページ

All Rights Reserved, Copyright (C) 富士通株式会社 2007