ヘッダーをスキップ

Oracle Rdb SQLリファレンス・マニュアル リリース7.2 E06178-01 |
| 目次 | 索引

戻る | 次へ |

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では、DESCRIBE文の途中でSQLTYPEの値を設定します。ただし、使用しているアプリケーション・プログラムでは、別のデータ型のSQLTYPEの値のみ変更可能です。 たとえば、SQLでは、データベース列でDECIMALデータ型をサポートしていません。つまり、SQLでは、SQLDAのSQLTYPEフィールドにDECIMALデータ型のコードは返されません。ただし、プログラムでDECIMALのデータ型にコードを設定できるため、SQLでデータベースからのデータをDECMALに変換し、プログラム内のDECIMALパラメータからのデータをデータベースのデータ型に変換できます。 ただし、SQLでは、このようなプログラム・パラメータはSQLTYPEコードで示すデータ型に対応するものとみなされます。対応しない場合は、予期しない結果が生じる可能性があります。

# D.5 SQLDAと関連付けられるパラメータ: SQLSIZEおよびSQLDAPTR

SQLではSQLDA自体の宣言の他に、2つの関連するパラメータ、SQLSIZEとSQLDAPTRも宣言します。このようなパラメータは、PL/Iプログラムでのみ使用できます。PL/Iプログラムでは、DESCRIBE文またはPREPARE...SELECT LIST INTO文の前にSQLDAの記憶域を動的に割り当てる際、この両方のパラメータを使用します。使用中のプログラムでは、次の処理が必要です。

- SQLSIZEに値を割り当て、同じ値をSQLNに割り当てます。SQLDAの宣言はSQLSIZEとSQLNの両方を参照するため、プログラムでは、SQLDAのメモリーを割り当てる際にその値を使用します。

- SQLNに割り当てられた値に基づいてSQLDAにメモリーを動的に割り当て、SQLDAで使用するメモリーのアドレスをSQLDAPTRに割り当てます。

次のプログラムの一部では、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;

# D.6 SQLDA2の目的

SQLでは、追加フィールドとフィールド・サイズをサポートする、SQLDAの拡張バージョンSQLDA2を使用できます。

記述子領域をコールする動的SQL文では、SQLDAまたはSQLDA2のいずれかを使用できます。SQLでは、SQLDA構造を使用してアプリケーションの入力パラメータを指定する場合、SQLDA2フィールドとフィールド・サイズのデフォルト値を想定します。ただし、そのアプリケーションで結果の値が表示されない場合は、エラー・メッセージが表示されます。

次のいずれかがパラメータ・マーカーまたは選択リスト項目に該当する場合、SQLDAのかわりにSQLDA2を使用します。

- 列名の長さが30オクテットを超える場合。（オクテットは8ビット）

- 列のデータ型がDATE、DATE VMS、DATE ANSI、TIME、TIMESTAMPであるか、期間データ型のいずれかの場合。

- データ型がCHAR、CHAR VARYING、CHARACTER、CHARACTER VARYING、VARCHAR、LONG VARCHAR、またはRAWのいずれかであり、次に該当する場合。

  - キャラクタ・セットがデフォルトの8ビット・キャラクタ・セットでない場合。

  - オクテット最大長が32,767を超える場合。

SQLDA2は、SQLでPREPARE文の項目が記述された後に検証できます。Oracle Rdbでは、フィールドを個人で設定するのではなく、この方法をお薦めします。

次の方法のいずれかを使用して、独自に使用するデータを抽出します。

- 使用する前にCASTファンクションによってデータをTEXTに変換します。

- EXTRACTファンクションによって個々のフィールドを抽出し、書式設定します。

- CASTファンクションによってDATE VMSに変換し、OpenVMSシステム・サービスを使用します。

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. */

## D.6.2 SQLDA2でのフィールドの説明

SQLDA2構造のSQLVAR2フィールドは、準備された文の個々の選択リスト項目を示す次のパラメータ、またはパラメータ・マーカーで構成されます。

- 長さ（SQLLENフィールドおよびSQLOCTET_LENフィールド）

  注意 SQLDAとSQLDA2については、SQLLENフィールドが大幅に異なります。SQLDAでは、SQLLENフィールドにはバイト数のフィールド長が含まれます。SQLDA2では、SQLLENフィールドには、文字のフィールド長が含まれるか、特定のデータ型（INTERVALおよびLIST OF BYTE VARYING）のサブタイプ・フィールドのいずれかになります。これは、DESCRIBE文を発行して、SQLからの情報を使用中のプログラムに返す場合などに該当します。 SQLDA2のSQLOCTET_LENフィールドは、SQLDAのSQLLENフィールドに類似しています。SQLDA2を使用する場合は、SQLLENのかわりにSQLOCTET_LENを使用して、SQLDATAフィールドに動的メモリーを割り当てます。

- データ型（SQLTYPE）

- スケールと精度（SQLLENまたはSQLCHRONO_SCALEおよびSQLCHRONO_PRECISION）

- キャラクタ・セット情報（SQLCHAR_SET_NAME、SQLCHAR_SET_SCHEMA、SQLCHAR_SET_CATALOG）

- データ値（SQLDATA）

- NULL標識値（SQLIND）

- カーソル指定の結果列の名前（SQLNAME）

表D-3は、SQLDA2の様々なフィールドと、それを動的SQLに渡す際のSQLでの使用方法について説明しています。ある時点で、SQLDA2には選択リスト項目またはパラメータ・マーカーのいずれかの情報が含まれますが、両方は含まれません。

表D-3 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ビット TINYINT、SMALLINT、INTEGER、およびBIGINTについては、SQLSIZEおよびSQLOCTET_LENGTHが選択リスト項目またはパラメータ・マーカーのバイト長を示す。 DECIMALについては、SQLSIZEが精度を示す。ただし、DECIMALデータ型のSQLLENはユーザーのみ設定可能のため、DESCRIBE文ではSQLから返されない。 |  |
| SQLSCALE---上位16ビット SQLSCALEはスケール（小数点以下桁数）を示す。 リスト・カーソルでは、スケール変更係数を必要とするデータ型でデータが返されない。 |  |
| 浮動小数点データ型については、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: EXECUTE文およびOPEN文で、プログラムで格納された値を取得し、それを準備された文でパラメータ・マーカーに代入する。 FETCH文で、結果表の値を格納する。
SQLIND | 値がロングワード（32ビット）・サイズの、ロングワード標識変数のアドレスである、SQLVAR2のサブフィールド（プログラムで標識変数を設定しない場合の値は0）。 | プログラム。 | プログラムまたはSQL: FETCH文で、SQLによって選択リスト項目に関連付けられる標識変数の値を格納する。 FETCH文の後に、プログラムによって、選択リスト項目に関連する標識変数の値を取得する。 EXECUTE文およびOPEN文で、SQLによってパラメータ・マーカーに関連する標識変数の値を取得する。
SQLNAME | 値が次のようなSQLVAR2の可変文字列サブフィールド: 選択リスト項目に対する、準備されたSELECT文の選択リストの列の名前。 パラメータ・マーカーに対する、パラメータ・マーカーが（INSERT文またはUPDATE文で）割り当てられた、または（基本条件で）比較された列の名前。 |  |
| 選択リスト項目、割当てまたは比較で、演算式または基本条件以外の条件に関連する場合、SQLではSQLNAMEに値が割り当てられない。 | SQL。 | 選択リスト項目またはパラメータ・マーカーに関連付けられた列名を検索するためのプログラム（オプション）。
SQLNAME_LEN | 値がSQLNAMEで指定された列の長さ（オクテット）を示す、SQLVAR2のサブフィールド。 |  |

1CHARACTER、NATIONAL CHARACTERを含みます。
2VARCHAR、VARCHAR2、NATIONAL CHARACTER、VARYING、RAW、およびLONG VARCHARを含みます。

表D-4は、SQLTYPEが期間データ型のいずれかを示す場合に考えられる、SQLLENフィールドの値を示しています。

表D-4 SQLDA2の時間隔修飾子のコード
コード | 時間隔修飾子 | 時間隔サブタイプ
--- | --- | ---
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フィールドの値を示しています。

表D-5 SQLDA2の日時データ型のコード
コード | 日時データ型 | 日時サブタイプ
--- | --- | ---
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フィールドの値を示しています。

表D-6 SQLCHAR_SET_NAMEフィールドの値
キャラクタ・セットの値 | 説明
--- | ---
DEFAULT | データベースのデフォルト・キャラクタ・セット
GB18030 | PRC簡体中国語
NATIONAL | 各国語キャラクタ・セット
UNSPECIFIED | キャラクタ・セットは指定されていない。SQLでは、データの互換性をチェックしない。
name-of-cset | サポートされているキャラクタ・セット名のリストは、表2-1を参照。