SQLでは、SQLTYPEリテラル値すべての宣言を含むファイルを提供します。表C-2は、このファイルをプリコンパイルされたSQLおよびモジュール言語プログラムに組み込む方法を示しています。
ASCIIとASCIZについては、動的SQLおよびCプログラムで使用する上で、一部混乱することがあります。INSERTまたはUPDATEを使用してCHARデータ型をデータベースに記述する際、文字列には空白が埋め込まれません。スペースのある文字列はヌル終端文字を含むため、データへのアクセスが困難になります。
SQLでは、動的SQLを使用する際のホスト言語を判断できないため、ユーザーのホスト変数のデータ型ではなく、DESCRIBE文のフィールドのデータ型、(CHAR(n))として返します。CHAR(n)をASCIZとする解釈は、データベース変数ではなく、ホスト変数のためのものです。
SQLDAのSQLTYPEをCHARからASCIZに変更してSQLLENを1で増分すると、切捨ては行われず、CHAR STRINGフィールドに空白が埋め込まれます(SQLLENはヌル終端文字ごとに1アカウントずつ増分します)。
SQLではSQLDA自体の宣言の他に、2つの関連するパラメータ、SQLSIZEとSQLDAPTRも宣言します。このようなパラメータは、PL/Iプログラムでのみ使用できます。PL/Iプログラムでは、DESCRIBE文またはPREPARE...SELECT LIST INTO文の前にSQLDAの記憶域を動的に割り当てる際、この両方のパラメータを使用します。使用中のプログラムでは、次の処理が必要です。
次のプログラムの一部では、SQLSIZEとSQLDAPTRを使用して、PL/IプログラムでSQLDAに記憶域を割り当てる方法を示します。
#include <stdlib.h> #define SQLVAR_ELEMENTS 20 /* Declare the SQL Descriptor Area: */ exec sql include SQLDA; /* Allocate memory for the SQLDA and * set the value of its SQLN field: */ SQLDA = malloc (16 + 44 * SQLVAR_ELEMENTS); SQLDA->SQLN = SQLVAR_ELEMENTS; |
SQLでは、追加フィールドとフィールド・サイズをサポートする、SQLDAの拡張バージョンSQLDA2を使用できます。
記述子領域をコールする動的SQL文では、SQLDAまたはSQLDA2のいずれかを使用できます。SQLでは、SQLDA構造を使用してアプリケーションの入力パラメータを指定する場合、SQLDA2フィールドとフィールド・サイズのデフォルト値を想定します。ただし、そのアプリケーションで結果の値が表示されない場合は、エラー・メッセージが表示されます。
次のいずれかがパラメータ・マーカーまたは選択リスト項目に該当する場合、SQLDAのかわりにSQLDA2を使用します。
SQLDA2は、SQLでPREPARE文の項目が記述された後に検証できます。Oracle Rdbでは、フィールドを個人で設定するのではなく、この方法をお薦めします。
次の方法のいずれかを使用して、独自に使用するデータを抽出します。
ANSI/ISO SQL規格で、データは常にアプリケーション・プログラムにCHARデータとして返されるように指定されています。
D.6.1 SQLDA2の宣言
プログラムでは、付録D.3節に示すように、SQLDAの宣言方法と同様にSQLDA2が宣言されます。
構造がSQLDAではなくSQLDA2であることをSQLに示すには、SQLDAIDフィールドがSQLDA2という語句を含み、その後にスペースを2つ含む文字列になるように設定します。
次の例は、複数のホスト言語でのSQLDA2の宣言を示しています。PL/I、CおよびAdaについては、INCLUDE SQLDA文を含むプログラムを処理する場合に、SQLで挿入される宣言の例を示します。その他の言語については、プログラムでSQLDAを明示的に宣言する場合に使用される形式の例を示しています。
例D-5は、INCLUDE SQLDA2文を含むAdaプログラムを処理する場合に、SQLで挿入される宣言を示しています。この例は、NはSQLVAR2の最大出現数を示しています。
例D-5 AdaでのSQLDA2の宣言 |
---|
type SQLNAME_REC is record NAME_LEN : standard.short_integer; NAME_STR : standard.string (1..128); end record; type SQLVAR_REC is record SQLTYPE : standard.short_integer; SQLLEN : standard.integer; SQLDATA : system.address; SQLIND : system.address; SQLCHRONO_SCALE: standard.integer; SQL_CHRONO_PRECISION: standard.integer; SQLNAME : sqlname_rec; SQLCHAR_SET_NAME : standard.string(1..128); SQLCHAR_SET_SCHEMA : standard.string(1..128); SQLCHAR_SET_CATALOG : standard.string(1..128); end record; type SQLVAR_ARRAY is array (1..N) of sqlvar_rec; type SQLDA_RECORD; type SQLDA_ACCESS is access SQLDA_RECORD; type SQLDA_RECORD is record SQLDAID : standard.string (1..8) := 'SQLDA2 '; SQLDABC : standard.integer; SQLN : standard.short_integer; SQLD : standard.short_integer; SQLVAR : sqlvar_array; end record; |
例D-6は、BASICプログラムでSQLDA2を明示的に宣言する場合に使用される形式を示しています。
例D-6 BASICでのSQLDA2の宣言 |
---|
RECORD SQLDA_REC string SQLDAID = 8 ! Value must be "SQLDA2 ". long SQLDABC word SQLN ! Program must explicitly word SQLD ! set SQLN equal to the number GROUP SQLVAR(N) ! of occurrences of SQLVAR. word SQLTYPE long SQLLEN long SQLOCTET_LEN long SQLDATA long SQLIND long SQLCHRONO_SCALE long SQLCHRONO_PRECISION GROUP SQLNAME word SQLNAME string SQLNAMEC = 128 END GROUP SQLNAME string SQLCHAR_SET_NAME = 128 string SQLCHAR_SET_SCHEMA = 128 string SQLCHAR_SET_CATALOG = 128 END GROUP SQLVAR END RECORD SQLDA_REC DECLARE SQLDA_REC SQLDA2 |
例D-7は、INCLUDE SQLDA2文を含むCプログラムを処理する場合に、SQLで挿入される宣言を示しています。
例D-7 CでのSQLDA2の宣言 |
---|
struct SQLDA_STRUCT { char SQLDAID[8]; /*Value must be "SQLDA2 "*/ int SQLDABC; /* ignored. */ short SQLN; short SQLD; struct { short SQLTYPE; long SQLLEN; long SQLOCTET_LEN char *SQLDATA; long *SQLIND; long SQLCHRONO_SCALE long SQLCHRONO_PRECISION short SQLNAME_LEN; char SQLNAME[128]; char SQLCHAR_SET_NAME[128]; char SQLCHAR_SET_SCHEMA[128]; char SQLCHAR_SET_CATALOG[128]; } SQLVAR[N]; /* N is maximum number of */ } *SQLDA; /* occurrences of SQLVAR. */ |
SQLDA2構造のSQLVAR2フィールドは、準備された文の個々の選択リスト項目を示す次のパラメータ、またはパラメータ・マーカーで構成されます。
表D-3は、SQLDA2の様々なフィールドと、それを動的SQLに渡す際のSQLでの使用方法について説明しています。ある時点で、SQLDA2には選択リスト項目またはパラメータ・マーカーのいずれかの情報が含まれますが、両方は含まれません。
フィールド名 | フィールドの意味 | 設定元 | 使用先 |
---|---|---|---|
SQLDAID | 値が常に文字列"SQLDA2 "である文字列フィールド(SQLDA2の後に2スペースが含まれる)。 | プログラム | 構造がSQLDAかSQLDA2かを判断するSQL。 |
SQLDABC | SQLDA2のバイト長であり、SQLNのファンクション(SQLDABC = 16+ (540 * SQLN))。 | SQL | 使用しない。 |
SQLN | SQLVAR2グループ・フィールドの合計出現数(この値はSQLD文、またはDESCRIBE文、またはPREPARE OUTPUT INTO文の値以上であること)。ランタイム・エラーが生成される。 | プログラム | プログラムのSQLDAに十分な記憶域が割り当てられているかどうかを判断するSQL。 |
SQLD | 準備された文の選択リスト項目(DESCRIBE...OUTPUTの場合)またはパラメータ・マーカー(DESCRIBE...INPUTの場合)数(ない場合は、値は0になる)。 | SQL | 記憶域を割り当てる入力パラメータまたは出力パラメータの数を決定するプログラム。 |
SQLVAR2 | それぞれの発生が選択リスト項目またはパラメータ・マーカーを示す、繰返しグループ・フィールド(SQLDの値が0の場合は使用しない)。 | 値なし | 次のエントリでサブフィールドの説明を参照。 |
SQLVAR2サブフィールド(各選択リスト項目またはパラメータ・マーカーで1回出現): | |||
フィールド名 | フィールドの意味 | 設定元 | 使用先 |
SQLTYPE | 値が選択リスト項目またはパラメータ・マーカーのデータ型を示す、SQLVAR2のサブフィールド(表D-2を参照)。 | SQL | 記憶域を該当するデータ型のパラメータに合せて割り当てるプログラム。 |
SQLLEN | 値が選択リスト項目またはパラメータ・マーカーの長さを示す、SQLVAR2のサブフィールド。 | プログラムがリセットされるまではSQL(ユーザーのみが設定可能なDECIMALは除く)。 | |
キャラクタ・タイプのCHARタイプ、CHARACTER VARYINGタイプについては、SQLLENが長さオーバーヘッドを除いた宣言サイズを示す。SQLOCTET_LENを参照。 | |||
固定長データ型(TINYINT、SMALLINT、INTEGER、BIGINT、NUMERIC、およびDECIMAL)については、SQLLENを半分に分割。 | |||
SQLSIZE---下位16ビット
|
|||
SQLSCALE---上位16ビット
|
|||
浮動小数点データ型については、SQLLENおよびSQLOCTET_LENは選択リスト項目またはパラメータ・マーカーのサイズ(オクテット)を示す。 | |||
DATE、DATE ANSI、DATE VMS、TIME、TIMESTAMPについては、SQLLENは日時データ型の長さを示す。 | |||
INTERVALデータ型については、SQLLENは表D-4に示すコードのいずれかを設定する。 | 選択リスト項目またはパラメータ・マーカーに、適切なサイズの記憶域を割り当てるプログラム。 | ||
SQLOCTET_LEN | 値が選択リスト項目またはパラメータ・マーカーの長さ(オクテット)を示す、SQLVAR2のサブフィールド。
SQLTYPEがCHAR1を示す場合、SQLOCTET_LENは文字列に可能な最大長(オクテット)を示す。 |
プログラムがリセットされていない場合はSQL。 | プログラムまたはSQL。 |
SQLTYPE2がCHARACTER VARYINGを示す場合、SQLOCTET_LENは文字列長を示すオクテット(4オクテット追加)を含めた、文字列長の表現に必要な、予想される最大長(オクテット)を示す。 | |||
SQLTYPEが固定スケールまたは浮動小数点データ型を示す場合、SQLOCTET_LENは選択リスト項目またはパラメータ・マーカーの数値サイズ(オクテット)を示す。 | |||
SQLTYPEが日時データ型または期間データ型を示す場合、動的SQLではSQLOCTET_LENが無視される。 | |||
SQLCHRONO_SCALE | 値が特定の列の日時データ型を示す、SQLVAR2のロングワード・サブフィールド。
SQLTYPEが日時データ型を示す場合、SQLCHRONO_SCALEには、表D-5に指定したコードが含まれる。 |
プログラムがリセットされていない場合はSQL。 | プログラム。 |
SQLTYPEが期間データ型を示す場合、SQLCHRONO_SCALEには、暗黙的に示した、または指定した期間先行フィールド精度が含まれる。 | |||
SQLTYPEが日時または期間ではないデータ型を示す場合、SQLCHRONO_SCALEには0が含まれる。 | |||
SQLCHRONO_PRECISION | 列が日時データ型の場合の、値がSQLVAR2で表現される列の精度を示す、SQLVAR2のロングワード・サブフィールド。
SQLTYPEがTIMEデータ型またはTIMESTAMPデータ型を示す場合の、SQLCHRONO_PRECISIONに含まれる時間精度またはタイムスタンプ精度。 |
プログラムがリセットされていない場合はSQL。 | プログラム。 |
SQLTYPEが期間データ型を小数秒精度で示す場合、SQLCHRONO_PRECISIONがその値に設定される。設定されない場合は、SQLCHRONO_PRECISIONは0に設定される。 | |||
SQLCHAR_SET_NAME | SQLTYPEが文字列タイプの場合は値がキャラクタ・セット名、SQLTYPEがその他のデータ型の場合は値がスペースになる、SOLVAR2の128バイトのサブフィールド。 | プログラムがリセットされていない場合はSQL。 | 選択リスト項目またはパラメータ・マーカーに文字データ型がある場合、SQLCHAR_SET_NAMEフィールドは選択リスト項目またはパラメータ・マーカーのキャラクタ・セット名を示す。表D-6は、SQLTYPEが文字データ型のいずれかを示す場合に考えられる、SQLCHAR_SET_NAMEフィールドの値を示す。 |
SQLCHAR_SET_SCHEMA | SQLTYPEが文字列データ型の場合は値がスキーマ名のキャラクタ・セット、SQLTYPEがその他のデータ型の場合は値がスペースになる、SQLVAR2の128バイトのサブフィールド。 | 今後の使用のため予約。 | 今後の使用のため予約。 |
SQLCHAR_SET_CATALOG | SQLTYPEが文字列データ型の場合は値がカタログ名のキャラクタ・セット、SQLTYPEがその他のデータ型の場合は値がスペースになる、SQLVAR2の128バイトのサブフィールド。 | 今後の使用のため予約。 | 今後の使用のため予約。 |
SQLDATA | 値が選択リスト項目またはパラメータ・マーカーに割り当てられた記憶域のアドレスである、SQLVAR2のサブフィールド。このポインタにメモリーを割り当てるには、SQLOCTET_LENを使用。 | プログラム。 | SQL:
|
SQLIND | 値がロングワード(32ビット)・サイズの、ロングワード標識変数のアドレスである、SQLVAR2のサブフィールド(プログラムで標識変数を設定しない場合の値は0)。 | プログラム。 | プログラムまたはSQL:
|
SQLNAME | 値が次のようなSQLVAR2の可変文字列サブフィールド:
|
||
選択リスト項目、割当てまたは比較で、演算式または基本条件以外の条件に関連する場合、SQLではSQLNAMEに値が割り当てられない。 | SQL。 | 選択リスト項目またはパラメータ・マーカーに関連付けられた列名を検索するためのプログラム(オプション)。 | |
SQLNAME_LEN | 値がSQLNAMEで指定された列の長さ(オクテット)を示す、SQLVAR2のサブフィールド。 |
表D-4は、SQLTYPEが期間データ型のいずれかを示す場合に考えられる、SQLLENフィールドの値を示しています。
コード | 時間隔修飾子 | 時間隔サブタイプ |
---|---|---|
1 | YEAR | SQLDA2_DT_YEAR |
2 | MONTH | SQLDA2_DT_MONTH |
3 | DAY | SQLDA2_DT_DAY |
4 | HOUR | SQLDA2_DT_HOUR |
5 | MINUTE | SQLDA2_DT_MINUTE |
6 | SECOND | SQLDA2_DT_SECOND |
7 | YEAR TO MONTH | SQLDA2_DT_YEAR_MONTH |
8 | DAY TO HOUR | SQLDA2_DT_DAY_HOUR |
9 | DAY TO MINUTE | SQLDA2_DT_DAY_MINUTE |
10 | DAY TO SECOND | SQLDA2_DT_DAY_SECOND |
11 | HOUR TO MINUTE | SQLDA2_DT_HOUR_MINUTE |
12 | HOUR TO SECOND | SQLDA2_DT_HOUR_SECOND |
13 | MINUTE TO SECOND | SQLDA2_DT_MINUTE_SECOND |
表D-5は、SQLTYPEがデータ型DATE、DATE ANSI、DATE VMS、TIMEまたはTIMESTAMPを示す場合に考えられる、SQLCHRONO_SCALEフィールドの値を示しています。
コード | 日時データ型 | 日時サブタイプ |
---|---|---|
1 | DATE ANSI | SQLDA2_DT_DATE |
2 | TIME | SQLDA2_DT_TIME |
3 | TIMESTAMP | SQLDA2_DT_TIMESTAMP |
4 | TIME WITH TIME ZONE | SQLDA2_DT_TIME_TZ |
5 | TIMESTAMP WITH TIME ZONE | SQLDA2_DT_TIMESTAMP_TZ |
表D-6は、SQLTYPEが文字データ型のいずれかを示す場合に考えられる、SQLCHAR_SET_NAMEフィールドの値を示しています。
キャラクタ・セットの値 | 説明 |
---|---|
DEFAULT | データベースのデフォルト・キャラクタ・セット |
GB18030 | PRC簡体中国語 |
NATIONAL | 各国語キャラクタ・セット |
UNSPECIFIED | キャラクタ・セットは指定されていない。SQLでは、データの互換性をチェックしない。 |
name-of-cset | サポートされているキャラクタ・セット名のリストは、表2-1を参照。 |