Symfoware Server SQLビギナーズガイド - FUJITSU - |
目次 索引 |
第7章 アプリケーションの実行時に動的SQL文を実行する方法 | > 7.2 SQL文を動的に変更して実行する |
動的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は配列SQLVARの最大要素数を決定します。
SQLDは、配列SQLVARの有効要素数を決定します。
被準備文中に選択リスト項目がある場合、SQLDA構造体を指定した出力DESCRIBE文を実行すると、SQLDには選択リスト項目の個数が返却されます。
また、被準備文中に動的パラメタ指定が記述されている場合、SQLDA構造体を指定した入力DESCRIBE文を実行すると、SQLDには動的パラメタ指定の個数が返却されます。
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の実行の準備を行うには、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文変数
PREPARE文によって準備された被準備文を解放するには、DEALLOCATE PREPARE文を使用します。
被準備文が動的SELECT文の場合、SQL文識別子に対応するカーソルを参照している準備可能動的UPDATE文:位置づけまたは準備可能動的DELETE文:位置づけの被準備文も同時に解放されます。また、その際のカーソルは、閉じられた状態であることが必要です。
DEALLOCATE PREPARE文の指定例を以下に示します。解放する被準備文は、PREPARE文によってSQL文識別子をSTMと定義された被準備文とします。
DEALLOCATE PREPARE STM (1) |
(1) SQL文識別子
“図:被準備文の実行結果の取り出し手順”で示したように、データベースからSQLDA構造体に選択リストの情報を取り込むには、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) 選択リスト
SQLD : 2
選択リストの個数2が設定されます。
SQLDA構造体の項目記述子域のメンバの情報
製品名、在庫数量の属性がそれぞれ設定されます。
製品名 : NATIONAL CHARACTER(10)(NOT NULL制約あり)
在庫数量: INTEGER(NOT NULL制約なし)
識別子 |
製品名 |
在庫数量 |
---|---|---|
SQLTYPE |
11 |
4 |
SQLLEN |
20 |
4 |
SQLPRECISION.PRECISION |
0 |
31 |
SQLSCALE |
0 |
0 |
SQLNULLABLE |
0 |
1 |
SQLIND |
値は設定されない |
値は設定されない |
SQLDATA |
値は設定されない |
値は設定されない |
SQLNAME |
製品名 (注) |
在庫数量 (注) |
SQLPRECISION.INTERVAL |
0 |
0 |
注) 長さはSQLNAMELに格納されます。
目次 索引 |