SQL記述子領域(SQLDA)は、動的SQLプログラムでのみ使用されるパラメータのコレクションです。SQLでは、SQLDAおよびSQLDA2の2つの記述子領域を備えています。D.6〜D.6.2項ではSQLDA2固有の情報について説明します。
動的SQLでは、プリコンパイルされたプログラムのソース・コードまたはSQLモジュール言語プロシージャの一部であるSQL文とは対照的に、プログラムは実行時にSQL文を受け入れたり生成できます。プリコンパイルされたSQLまたはSQLモジュール言語文とは異なり、動的に実行されるこのようなSQL文は、必ずしもプログラムのソース・コードの一部ではありませんが、プログラムの実行中に生成できます。動的SQLは、プログラムが処理する必要のあるSQL文のタイプを予測できない場合に便利です。
SQLDAを使用するには、ホスト言語がポインタ変数をサポートする必要があります。ポインタ変数では、変数に直接データを格納するのではなくデータのアドレスを格納することによって記憶域に間接的にアクセスします。ポインタ変数のサポートも行うSQLプリコンパイラによってサポートされる言語は、PL/I、C、BASICおよびAdaです。ポインタ変数をサポートするその他の言語はSQLDAを使用できますが、ソース・コードに直接SQL文を埋め込むのではなく、SQL文を含むSQLモジュール・プロシージャをコールする必要があります。
D.1 SQLDAの目的
SQLDAでは、動的SQL文の情報をプログラムに、そのプログラムによって割り当てられたメモリーの情報をSQLに提供します。具体的には、SQLおよびホスト言語プログラムは次の目的でSQLDAを使用します。
SQLDAからの情報を読み取る場合に使用されたOPEN文およびFETCH文自体は、PREPARE文で使用された動的文でもなければ、OPEN文およびFETCH文で指定されたカーソルを宣言するDECLARE CURSOR文でもありません。これらの文では準備された文を使用しますが、それ自体は準備された文にはならないSQL文です。動的に実行できない文のリストは、「PREPARE文」を参照してください。
SQLDAを使用する操作の具体的な順序は、プログラムが許容できるのが動的に生成されたSELECT文のみか、SELECT以外の文のみか、あるいはその両方かによって異なります。次に説明する順序は、通常SQLDAを使用する際にプログラムが実行する手順です。具体的な例は、『Oracle Rdb7 Guide to SQL Programming』の動的SQLの使用に関する章、およびサンプル・ディレクトリでのOracle Rdbのインストール時に作成したサンプル・プログラムを参照してください。
SQLは、パラメータ・マーカーのアドレスを使用して記憶域の値(プログラムで指定)を取得し、準備された文でパラメータ・マーカーに代入します。
#include <sql_sqlda.h> |
sql_sqlda.hヘッダー・ファイルは、SQL_T_SQLDA(またはSQL_T_SQLDA2)データ型を定義するSQLDA構造体用にtypedef文を組み込みます。また、SQLDA構造体の定義に対するスーパーセットとしてSQL_T_SQLDA_FULL(またはSQL_T_SQLDA2_FULL)データ型を定義します。SQL_T_SQLDA_FULLデータ型は、レイアウトではSQL_T_SQLDAデータ型と同じです。ただし、CALL文の記述時にSQLが使用する追加フィールドのある追加共用体を含む点が異なります。
SQLDA構造体の宣言の詳細は、『Oracle Rdb7 Guide to SQL Programming』を参照してください。
SQLDAは常に4つのフィールドを含んでおり、5番目のフィールドを含んでいる場合もあります。5番目のフィールドSQLVARは繰返しフィールドです。C以外の言語の場合、個々の選択リスト項目を示す5つのパラメータ、または準備された文のパラメータ・マーカーで構成されます。C言語の場合は、6つのパラメータで構成されます。
次の例は、複数のホスト言語でのSQLDAの宣言を示しています。PL/I、CおよびAdaについては、INCLUDE SQLDA文を含むプログラムを処理する場合に、SQLで挿入される宣言の例を示します。BASICについては、明示的にSQLDAを宣言する場合にプログラムで使用される形式の例を示しています。
これらの宣言例ではすべて、SQLDA構造体の名前としてSQLDAの名前を使用していますが、プログラムでは有効であればどのような名前でも使用できます。
例D-1は、INCLUDE SQLDA文を含むCプログラムを処理する場合に、SQLで挿入される宣言を示しています。
例D-1 AdaでのSQLDAの宣言 |
---|
type SQLNAME_REC is record NAME_LEN : standard.short_integer; NAME_STR : standard.string (1..30); end record; type SQLVAR_REC is record SQLTYPE : standard.short_integer; SQLLEN : standard.short_integer; SQLDATA : system.address; SQLIND : system.address; SQLNAME : sqlname_rec; end record; type SQLVAR_ARRAY is array (1..255) of sqlvar_rec; type SQLDA_RECORD; type SQLDA_ACCESS is access SQLDA_RECORD; type SQLDA_RECORD is record SQLDAID : standard.string (1..8) := 'SQLDA '; SQLDABC : standard.integer; SQLN : standard.short_integer; SQLD : standard.short_integer; SQLVAR : sqlvar_array; end record; |
例D-2は、BASICプログラムでSQLDAを明示的に宣言する場合に使用される形式を示しています。
例D-2 BASICでのSQLDAの宣言 |
---|
RECORD SQLDA_REC string SQLDAID = 8 long SQLDABC word SQLN ! Program must explicitly word SQLD ! set SQLN equal to the number GROUP SQLVAR(100) ! of occurrences of SQLVAR word SQLTYPE word SQLLEN long SQLDATA long SQLIND GROUP SQLNAME word SQLNAME string SQLNAMEC = 30 END GROUP SQLNAME END GROUP SQLVAR END RECORD SQLDA_REC DECLARE SQLDA_REC SQLDA |
例D-3は、INCLUDE SQLDA文を含むCプログラムを処理する場合に、SQLで挿入される宣言を示しています。
例D-3 CでのSQLDAの宣言 |
---|
struct SQLDA_STRUCT { char SQLDAID[8]; int SQLDABC; short SQLN; short SQLD; struct SQLVAR_STRUCT { short SQLTYPE; short SQLLEN; char *SQLDATA; short *SQLIND; short SQLNAME_LEN; char SQLNAME[30]; } SQLVAR[1]; } *SQLDA; |
例D-4は、INCLUDE SQLDA文を含むPL/Iプログラムを処理する場合に、SQLで挿入される宣言を示しています。
例D-4 PL/IでのSQLDAの宣言 |
---|
/* EXEC SQL INCLUDE SQLDA; */ DCL 1 SQLDA BASED ( SQLDAPTR ), 2 SQLDAID CHAR(8), 2 SQLDABC BIN FIXED(31), 2 SQLN BIN FIXED(15), 2 SQLD BIN FIXED(15), 2 SQLVAR (SQLSIZE REFER(SQLN)), 3 SQLTYPE BIN FIXED(15), 3 SQLLEN BIN FIXED(15), 3 SQLDATA PTR, 3 SQLIND PTR, 3 SQLNAME CHAR(30) VAR; DCL SQLSIZE BIN FIXED; DCL SQLDAPTR PTR; |
表D-1は、SQLDAの様々なフィールドと、SQLによるその使用方法について説明しています。ある時点で、SQLDAには選択リスト項目またはパラメータ・マーカーのいずれかの情報が含まれますが、両方は含まれません。
フィールド名 | フィールドの意味 | 設定元 | 使用先 |
---|---|---|---|
SQLDAID | 値が常に文字列SQLDAである文字列フィールド。 | SQL | 使用しない。 |
SQLDABC | SQLDAのバイト長であり、SQLNのファンクション(SQLDABC = 16+ (44 * SQLN))。 | SQL | 使用しない。 |
SQLN | SQLVARグループ・フィールドの合計出現数(この値はSQLD、またはDESCRIBE、PREPARE OUTPUT INTO文の値以上であること)。ランタイム・エラーが生成される。 | プログラム | プログラムのSQLDAに十分な記憶域が割り当てられているかどうかを判断するSQL。 |
SQLD | 準備された文の出力項目(DESCRIBE...OUTPUTの場合)またはパラメータ・マーカー(DESCRIBE...INPUTの場合)数(ない場合は、値は0になる)。 | SQL | 記憶域を割り当てる入力パラメータまたは出力パラメータの数を決定するプログラム。 |
SQLVAR | それぞれの発生が選択リスト項目またはパラメータ・マーカーを示す、繰返しグループ・フィールド(SQLDの値が0の場合は使用しない)。 | 値なし | 次のエントリでサブフィールドの説明を参照。 |
SQLVARサブフィールド(各選択リスト項目またはパラメータ・マーカーで1回出現): | |||
フィールド名 | フィールドの意味 | 設定元 | 使用先 |
SQLTYPE | 値が選択リスト項目またはパラメータ・マーカーのデータ型を示す、SQLVARのサブフィールド(表D-2を参照)。 | SQL | 記憶域を該当するデータ型のパラメータに合せて割り当てるプログラム。 |
SQLLEN | 値が選択リスト項目またはパラメータ・マーカーの長さ(バイト)を示す、SQLVARのサブフィールド。
CHAR1およびCHARACTER VARYINGR1については、長さフィールドのオーバーヘッドなしで宣言されたデータの長さを示す。 固定長データ型(TINYINT、SMALLINT、INTEGER、BIGINT、およびDECIMAL)については、SQLLENを半分に分割。 TINYINT、SMALLINT、INTEGERおよびBIGINTの場合、SQLLENの下位バイトは長さ、上位バイトはスケール(小数点以下桁数)を示す。 |
プログラムがリセットされるまではSQL(ユーザーのみが設定可能なDECIMALまたはH_FLOATは除く) | 選択リスト項目またはパラメータ・マーカーに、適切なサイズの記憶域を割り当てるプログラム。 |
DECIMALについては、下位バイトは精度、上位バイトはスケールを示す。ただし、DECIMALデータ型のSQLLENはユーザーのみ設定可能のため、DESCRIBE文ではSQLから返されない。 | |||
リスト・カーソルでは、スケール変更係数を必要とするデータ型でデータが返されない。 | |||
浮動小数点データ型については、SQLLENはバイト数のフィールド長を示す。したがって、SQLLEN = 4はREALデータ型、SQLLEN = 8はDOUBLE PRECISIONデータ型、SQLLEN = 16はH_FLOATデータ型をそれぞれ示す。データの浮動小数点表現(VAXとIEEE)は、SQL$PREコマンドラインの/FLOAT修飾子で決定される。 | |||
SQLDATA | 値が選択リスト項目またはパラメータ・マーカーに割り当てられた記憶域のアドレスである、SQLVARのサブフィールド。
CHARACTER VARYING2の場合、長さフィールドの許可に十分なメモリー(SQLLENに2オクテットを加えたもの)を割り当てる。 |
プログラム | SQL:
|
SQLIND | 値がワード(16ビット)・サイズの、標識変数のアドレスである、SQLVARのサブフィールド(プログラムでSQLINDを設定しない場合の値は0)。 | プログラム | プログラムまたはSQL:
|
SQLNAME1 | 値が次のようなSQLVARの可変文字列サブフィールド:
出力項目に対する、準備されたSELECT文の選択リストの列の名前。 入力項目に対する、パラメータ・マーカーが(INSERT文またはUPDATE文で)割り当てられた、または(基本条件で)比較された列の名前。 選択リスト項目、割当てまたは比較で、演算式または基本条件以外の条件に関連する場合、SQLではSQLNAMEに値が割り当てられない。 |
SQL | 選択リスト項目またはパラメータ・マーカーに関連付けられた列名を検索するためのプログラム(オプション)。 |
表D-2は、SQLVARのSQLTYPEサブフィールドの数値およびリテラル値とその値の意味を説明しています。
数値 | リテラル値 | データ型 |
---|---|---|
449 | SQLDA_VARCHAR | VARCHAR1、CHARACTER VARYING |
453 | SQLDA_CHAR | CHAR、CHARACTER |
481 | SQLDA_FLOAT | FLOAT5、REAL、DOUBLE PRECISION |
485 | SQLDA_DECIMAL | DECIMAL |
497 | SQLDA_INTEGER | INTEGER |
501 | SQLDA_SMALLINT | SMALLINT |
503 | SQLDA_DATE | DATE VMS |
505 | SQLDA_QUADWORD | BIGINT |
507 | SQLDA_ASCIZ | ASCIZ2 |
509 | SQLDA_SEGSTRING | LIST OF BYTE VARYING |
515 | SQLDA_TINYINT | TINYINT |
516 | SQLDA_VARBYTE | VARBYTE3、4 |
519 | SQLDA2_DATETIME | 日時(ANSI) |
521 | SQLDA2_INTERVAL | INTERVAL |