ヘッダーをスキップ
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と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を使用します。

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

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

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

表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を参照。