ヘッダーをスキップ

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

戻る | 次へ |

    $ ACS CREATE LIBRARY [.ADALIB]
    $ ACS SET LIBRARY [.ADALIB]
    $ SQLPRE == "$SQL$PRE"
    $ SQLPRE
    INPUT FILE> sql_all_datatypes.sqlada/ADA
    $ ! This LINK command requires that the logical name
    $ ! LNK$LIBRARY is defined as SYS$LIBRARY:SQL$USER.OLB.
    $ ACS LINK sql_all_datatypes sql_sql_all_datatypes.obj
    $ RUN sql_all_datatypes.exe
            .
            .
            .
    This is the stored row

    CHAR_COL: Begin  end
    SMALLINT_COL: -32768
    INTEGER_COL: -2147483648
    REAL_COL:  0.12346
    DOUBLE_PRECISION_COL:  0.12345678901234
    DATE_COL: 30-OCT-1987 09:00:00.00
    VARCHAR_COL: This string is 39 characters in length.
            .
            .
            .
    This is the row after update

    CHAR_COL: NULL
    SMALLINT_COL:  32767
    INTEGER_COL:  2147483647
    REAL_COL:  0.12346
    DOUBLE_PRECISION_COL:  0.12345678901234
    DATE_COL: 10/30/87 09:00:00
    VARCHAR_COL: This string is 39 characters in length.

注意 Adaプリコンパイラを使用する場合、サブプログラムごとに一意のプロシージャ名を使用する必要があります。プログラムの様々なサブプログラムに同じプロシージャ名が使用される場合、いくつかの代替方法があります。 プリコンパイラされたAdaではなく、モジュール言語を使用するのが理想的です。モジュール言語を使用する場合、この制限は適用されません。SQLモジュール言語の詳細は、第3章を参照してください。 または、Adaの個別コンパイル時機能を使用できます。この機能を使用すると、すべてのサブプログラムが個別にプリコンパイルされます。ただし、この代替方法を使用する場合、メイン・プログラム・ユニットで宣言された型や変数などは、サブプログラムのSQL文で認識されないため、これらの文では参照できなくなります。 もう1つの方法は、SQL文で使用されるすべての名前を一意にすることです。アプリケーションがANSI規格に準拠する必要がある場合、SQL文で使用されるすべてのホスト言語変数名はファイル内で一意である必要があります。

## 4.4.3 サポートされているC変数宣言

注意 C言語では、大/小文字が区別されます。Cプログラムで宣言されたオブジェクトの名前は大/小文字が区別されますが、SQL表の名前と他の名前は大/小文字が区別されません。このため、SQL文に指定するC構成メンバーでは注意が必要です。これらの構成メンバーには、プログラムの各部の変数名とラベルが含まれます。C変数の宣言の詳細は、『Oracle Rdb7 Guide to SQL Programming』を参照してください。

次のリストは、CでSQLプリコンパイラがサポートしている文字データ型の変数宣言構文を示しています。

- char x[n]

- char *xはLONG VARCHAR型が前提です（char x[16...]）。

- char CHARACTER SET character-set-name句
  CHARACTER SET character-set-name句はオプションです。

- $SQL_VARCHAR (n)

- $SQL_VARCHAR (n) CHARACTER SET character-set-name
  CHARACTER SET句はオプションです。

サポートされているキャラクタ・セットの詳細は、第2.1節を参照してください。

次のリストは、CでSQLプリコンパイラがサポートしている変数宣言構文を示しています。

- データ型のキーワード（表4-4を参照）

- 記憶域クラスの識別子と修飾子

- 構造体

- 共用体

- typedef

- 初期値代入

- 配列
  SQL文の構造体への参照で使用するインジケータ配列を宣言するためにのみ、単次元配列のみがサポートされています。また、配列のサイズは明示的に指定する必要があります。インジケータ配列要素にはすべてのデータ型を使用できますが、Oracle Rdbでは、INTEGERデータ型の変数を使用することをお薦めします。

- ポインタ
  単一レベルのポインタ変数と、要素データ型を指し示すポインタ変数のみがサポートされています。
  Cポインタ変数では長さ属性を指定できないため、charポインタ変数を参照する文を処理するために、使用可能な最大メモリー量を割り当てる必要がある場合があります。次の場合、charポインタ変数の長さを確認できないため、変数ごとに16,383バイトのメモリーが割り当てられます。

  - 連結値式またはサブストリングがSQL文に含まれる場合。

  - SQL文が条件でcharポインタ変数を参照している場合（`WHERE EMP_ID = :POINTER_VAR`など）。

  - SQL文でcharポインタ変数の内容がデータベースの数値データ型に変換される場合。

  特にリモート・データベースにアクセスする場合、charポインタ変数にこのように大きなメモリーを割り当てると、メモリーが無駄になり、パフォーマンスが低下するため、これらのケースではcharポインタ変数を使用しないでください。

- 有効な宣言構文。有効な宣言構文の例は、次のとおりです。

      a_var[10];

      $SQL_VARCHAR(10) x,y,z;

      int            SQLCODE;

      struct
           {
           char       b_var[5];
           short int  c_var;
           } a_record;

      union
           {
           char         string_date[17];
           struct
                {
                char     year_var1[2];
                char     year_var2[2];
                char     month_var[2];
                char     day_var[2];
                char     hour_var[2];
                char     minute_var[2];
                char     second_var[2];
                char     hundredth_var[2];
                } date_group;
            } date_union;

      int               indicator_item[2];

      globaldef double  c_var;

      static            d_var;

      char              *x;

- 無効な宣言構文

表4-4 サポートされているCデータ型
C型または typedef | SQL型 | コメントおよび制限
--- | --- | ---
char | CHARACTER |
char * | LONG VARCHAR | VARCHAR(16383)と想定される。
char [n] | CHARACTER | nは整数リテラルである必要がある。#defineの名前または式はサポートされない。
int | INTEGER | 符号なしでは指定できない。
short | SMALLINT | 符号なしでは指定できない。
short int | INTEGER | 符号なしでは指定できない。
long int | INTEGER | 符号なしでは指定できない。
float | REAL |
double | DOUBLE PRECISION |
enum | INTEGER |
long | INTEGERまたはBIGINT | OpenVMSの場合、longデータ型は32ビットである。
int8 | TINYINT | `#include <ints.h>` が必要である。
int16 | SMALLINT | `#include <ints.h>` が必要である。
__int16 | SMALLINT |
int32 | INTEGER | `#include <ints.h>` が必要である。
__int32 | INTEGER |
int64 | BIGINT | OpenVMS Alphaプラットフォームのみ。 `#include <ints.h>` が必要である。
__int64 | BIGINT |
| $SQL_VARCHAR (n) | CHARACTER SET句はオプションである。
| SQL_DATE SQL_DATE_ANSI SQL_DATE_VMS SQL_TIME SQL_TIMESTAMP | SQLプリコンパイラにより、ネイティブCデータ型の疑似型が変換される。
| SQL_INTERVAL (DAY TO SECOND) | 2つの日付または時刻間の差異を示す変数にはこのデータ型を使用する。サポートされているすべてのINTERVALデータ型は、表4-2を参照。

サポートされていない一部の構文は、SQL操作では重要でない場合、受け入れられますが、無視されます。たとえば、記憶域クラス修飾子の実装は、SQL操作では重要でないとみなされます。このような修飾子は宣言では受け入れられますが、無視されます。一方、SQLで変数を正しく使用するには、SQLによってデータ型構文の実装が解釈される必要があります。このため、SQLで列挙データ型がサポートされていないときに宣言にキーワードenumが含まれる場合、宣言は無効とみなされます。すべての無効な宣言について、宣言自体の後にエラーが返されるのではなく、この宣言を参照するSQL文の後にエラーが返されます。#defineディレクティブは認識されません。たとえば、`{`および`}`をBEGINおよびENDとする定義はサポートされていません。無効な宣言構文の例は、次のとおりです。各宣言の後ろにあるコメントは、宣言によって指定された変数や、宣言に依存する変数をSQL文で参照できない理由を示しています。

    int           indicator_item[];    /* implicit dimension for array */
    char          func_ret();          /* function return status */
    int           mult_arr[5][10];     /* multidimensional array */
    unsigned int  uns_var;             /* unsigned data */
    int           bit3 : 4, bit4 : 3;  /* bit fields */
    enum          {a, b, c} enum_var;  /* enumerated data type */
    char          *a_prt[5];           /* array of pointers */
    int           **x;                 /* two levels of pointers */
    struct        x_rec *x             /* pointer to structures */
    foo (char *x, int y)               /* declarations within functions */

表4-5は、各SQLデータ型についてサポートされるC変数宣言の例を示しています。

表4-5 SQLデータ型に対するC宣言
SQLの例 | Cの例
--- | ---
CHAR(10) | char str1[11] SQLでは、文字列はASCIZ形式と想定される。このため、CHAR列のcharホスト言語変数は列サイズより1文字多いものとして宣言する。（これにより、ASCIZ文字列の最後にヌル文字用の空白を確保できる。）データ・ディクショナリから定義をコピーするときに、SQL INCLUDE文にFIXED引数を指定して、必要に応じてこの制限を回避できる。 キャラクタ・セットはUNSPECIFIED。
CHAR(10) CHARACTER SET KANJI | char CHARACTER SET KANJI str[11]1 このデータ型は、キャラクタ・セットがCHARACTER SET句で指定されているという点以外は、charと同じ特性を持つ。
VARCHAR(10) | $SQL_VARCHAR(10) typedef $SQL_VARCHAR(max_length_of_varchar)を使用する場合、ワードの長さを示すホスト言語変数（len）を定義するマクロがファイルの先頭で宣言され、データのバイト数（data）がこの後ろに続く。この例では、lenの後ろに10バイトのデータが続く。バイナリ・データを格納して渡すために適したC変数宣言としてSQLでサポートされているのは、この宣言のみである。 キャラクタ・セットはUNSPECIFIED。
VARCHAR(10) CHARACTER SET KANJI | $SQL_VARCHAR(10) CHARACTER SET KANJI str1 このデータ型は、キャラクタ・セットがCHARACTER SET句で指定されているという点以外は、$SQL_VARCHARと同じ特性を持つ。
LONG VARCHAR | char str3[16384] SQLでは、文字列はASCIZ形式と想定されるため、ヌル文字列終端文字を使用して、LONG VARCHAR列に格納されている値の長さが確認される。このため、LONG VARCHARデータ型のホスト言語変数は、固定長のchar変数として宣言する。この変数は、列で使用可能な最長の有効文字列にヌル終端文字用の1文字を加えた長さに対応できる必要がある。 キャラクタ・セットはUNSPECIFIED。
TINYINT | char num1 SQLではTINYINT列に対するスケール変更係数をサポートしているが、Cではサポートしていない。
SMALLINT | short num1 SQLではSMALLINT列に対するスケール変更係数をサポートしているが、Cではサポートしていない。SMALLINT列をスケール変更する場合、変数はshortではなくfloatとして宣言する。
INTEGER | long num2 SQLではINTEGER列に対するスケール変更係数をサポートしているが、Cではサポートしていない。INTEGER列をスケール変更する場合、変数はintではなくdoubleとして宣言する。
BIGINT | double num3 CではBIGINTデータ型をサポートしていない。Cデータ型のdoubleは、スケール変更するBIGINT列とスケール変更しないBIGINT列の両方に適しており、変換はSQLによって実行される。ただし、doubleデータ型の場合、BIGINT列に格納可能なより大きい値の近似処理のみが行われる。
FLOAT(6) FLOAT(25) | float num4 double num4
REAL | float num5
DOUBLE PRECISION | double num6
DATE | SQL_DATE datenum1
DATE ANSI | SQL_DATE_ANSI datenum2
DATE VMS | SQL_DATE_VMS datenum3
TIME | SQL_TIME datenum4
TIMESTAMP | SQL_TIMESTAMP datenum5
INTERVAL DAY TO HOUR | SQL_INTERVAL (DAY TO HOUR) datenum6 サポートされているすべてのINTERVALデータ型は、表4-2を参照。
LIST OF BYTE VARYING | char datenum[8] Cでは、LIST OF BYTE VARYINGデータ型はサポートしていない。LIST OF BYTE VARYING列に対して8バイトの文字変数を宣言すると、リストの先頭要素を指し示す、セグメント化された文字列識別子を格納するために十分な空白が確保される。このリストの個別要素の値を取得するには、CHARデータ型またはVARCHARデータ型のホスト言語変数を使用できる。

1文字長およびプリコンパイラの詳細は、第4.4.1項を参照してください。

オンライン・サンプル・プログラムsql_all_datatypes.scには、変数を宣言してSQL文で使用する例が用意されています。また、このプログラムは、様々なSQLデータ定義文およびデータ操作文も示します。SQLをインストールした後、プログラムを出力、入力または検索することにより、様々なトピックに関するサンプル・コードを見つけることができます。

次の制限はC変数に適用されます。

- CでSQLプリコンパイラを使用してCモジュール言語を指定する場合は通常、C文字列はヌル文字で終了する文字列として変換されます。つまり、これらの文字列がデータベースからプログラムに渡される場合、ヌル文字用として文字列の最後に空白が確保されます。入力のために文字列がデータベースに渡される場合、データベースに格納する文字数を確認するためにこのヌル文字が検索されます。データベースにはヌル文字の前にある文字のみが格納され、ヌル文字は格納されません。
  この制限の唯一の例外は、データ定義をデータ・ディクショナリからコピーする場合です。SQL INCLUDE文では、必要に応じて、文字データを固定文字形式に変換するデフォルト設定を変更することもできます。詳細は、「INCLUDE文」のFIXED引数とNULL TERMINATED BYTES引数を参照してください。
  SQLプリコンパイラのかわりにSQLモジュール言語を使用する場合、長さフィールドを文字カウントとして解釈するように指定することもできます。詳細は、第3.2節の「NULL TERMINATED CHARACTERS引数」を参照してください。
  SQLによるC文字列の変換方法のため、バイナリ・データをデータベースと相互に渡すアプリケーションで問題が発生する可能性があります。CでSQLプリコンパイラを使用する際のこのような問題を回避するには、SQLに備えられている$SQL_VARCHARデータ型を使用します。
  構造体にディクショナリ・レコードと同じ名前を使用しない場合、SQL INCLUDE文のAS name句を使用して、ディクショナリ・レコード名を変更できます。詳細は、「INCLUDE文」を参照してください。

- C言語用のSQLプリコンパイラでは、宣言に連続する数値以外が含まれる文字配列として宣言されたホスト言語変数がSQL文によって参照されると、次のエラー・メッセージが表示されます。

      %SQL-F-BAD_ARRAY, Host variable address contains an array syntax error
      in its declaration.

  たとえば、宣言に名前付きの定数または式が含まれる場合、このエラーが発生します。

      #define NAME_LEN     (20)
      #define ADDRESS_LEN  (31)
            char name [NAME_LEN + 1]          /* This cannot be used */
            char address [ADDRESS_LEN]        /* This cannot be used */

  この場合、2段階のアクションが必要となる解決策があります。

  1. 宣言から式を削除し、これに応じて#define行を更新します。また、#define行から丸カッコを削除します。

         #define NAME_LEN      21
         #define ADDRESS_LEN   31
               char name [NAME_LEN]
               char address [ADDRESS_LEN]

  2. SQLプリコンパイラを起動する前にCプリプロセッサを介してCコードを実行します。これにより、プリコンパイラが使用しようとする前にすべての名前付き定数が変換されます。

         CC/PREPROCESS=filename.SCP filename.SC
         SQL$PRE/CC filename.SCP

## 4.4.4 サポートされているCOBOL変数宣言

次のリストは、COBOLでSQLプリコンパイラがサポートしている文字データ型の変数宣言構文を示しています。

- PICTURE ISは、PICTUREまたはPICとして省略できます。

- CHARACTER SET character-set-name PICTURE IS。

- 数値変数のPICTURE句は、S（符号付き）から始まる必要があり、P文字を含めることはできません。

- PICTURE句に編集文字を含めることはできません。

サポートされているキャラクタ・セットの詳細は、第2.1節を参照してください。

次のリストは、COBOLでSQLプリコンパイラがサポートしている変数宣言構文を示しています。

- PICTURE IS句

  - PICTURE ISは、PICTUREまたはPICとして省略できます。

  - 数値変数のPICTURE句は、S（符号付き）から始まる必要があり、P文字を含めることはできません。

  - PICTURE句に編集文字を含めることはできません。

- USAGE IS句

  - USAGE ISは、PICTURE句の直後にある必要があります。

  - USAGE ISは、USAGEとして省略することも、完全に省略することもできます。

  - USAGE ISには、引数としてBINARY、COMPUTATIONAL、COMPUTATIONAL-1、COMPUTATIONAL-2またはCOMPUTATIONAL-3が必要です。COMPUTATIONALは、すべてのUSAGE IS宣言またはDISPLAY宣言でCOMPとして省略できます。BINARYは、COMPUTATIONALまたはCOMPのシノニムです。

- VALUE IS句
  VALUE ISは、VALUEとして省略でき、制限なしで使用できます。

- IS EXTERNAL句
  IS EXTERNALは、EXTERNALとして省略でき、制限なしで使用できます。

- IS GLOBAL句
  IS GLOBALは、GLOBALとして省略でき、制限なしで使用できます。

- SIGN句
  SIGNは使用できますが、PICTURE句またはUSAGE IS句の直後にある必要があります。

- Groupデータ項目

  - グループ・データ項目は、宣言なしで使用できます。

  - SQL VARCHARデータ型およびLONG VARCHARデータ型に関連付けられる変数は、レベル49の2つの要素項目を持つグループ・データ項目として宣言する必要があります。最初の要素項目は、文字列の実際の長さを格納するための小さい整数である必要があります。2番目の要素項目は、文字列自体を格納するために十分な長さの文字列である必要があります。

        * Declaration for an SQL column
        * defined as VARCHAR (80):
        *
        01 VARYING_STRING.

                49 STRING_LENGTH   PIC S9(4) USAGE IS COMP.
                49 STRING_TEXT     PIC X(80).

- OCCURS n TIMES句

  - OCCURS句は、インジケータ配列の宣言でのみ使用できます。インジケータ配列要素には任意のデータ型を使用できますが、Oracle Rdbでは、整数（PIC S9(9) COMP）として宣言することをお薦めします。

  - 多次元表（ネストしたOCCURS句）および変数出現データ項目（OCCURS DEPENDING ON句）はサポートされていません。

- REDEFINES句
  REDEFINES句を持つホスト言語変数またはREDEFINES句に従属するホスト言語変数を参照できます。

- SQL日時データ型

  - SQL_DATE、SQL_DATE_ANSI、SQL_DATE_VMS

  - SQL_TIME、SQL_TIMESTAMP

  - SQL_INTERVAL (DAY TO SECOND)
    2つの日付または時刻間の差異を示す変数にはこのデータ型を使用します。（サポートされているすべてのINTERVALデータ型は、表4-2を参照してください。）

  これらのデータ型は、コンパイラ自体でサポートされているホスト言語データ宣言に置き換えられます。

次の例は、SQLで受け入れられるCOBOL宣言と受け入れられないCOBOL宣言を示しています。

    * SQL will accept:
    01 A PIC S9(7)V99 COMP.
    * SQL will not accept (unsigned numeric):
    01 B PIC 9(7)V99 COMP.
    *
    *
    * SQL will accept:
    01 C COMP-1 VALUE IS -1.
    * SQL will not accept (implicit USAGE IS DISPLAY):
    01 E PIC S9(4).
    *
    *
    * SQL will accept:
    01 indicators-x.
       05 indicator-null   pic s9(9) comp occurs 40.
    * SQL will not accept
    01 indicators-x.
       05 indicator-null   pic s9(9) comp occurs 40 indexed by x1.
    *
    * SQL will accept (host structure and indicator array):
    01      F       EXTERNAL.
            02      F1      PIC S9(9) COMP.
            02      F2      PIC X(20).
            02      F2_R    REDEFINES F2.
                    03      G1      PIC X(10).
                    03      G2      COMP-2.
            02      F3      PIC S9(9) COMP.
    01 F_IND_ARRAY
            02 F_IND OCCURS 3 TIMES PIC S9(9) COMP.

表4-6は、各SQLデータ型についてサポートされるCOBOL変数宣言の例を示しています。

表4-6 SQLデータ型に対するCOBOL宣言
SQLの例 | COBOLの例
--- | ---
CHAR(10) | 01 STR1 PICTURE X(10). キャラクタ・セットはUNSPECIFIED。
CHAR(10) CHARACTER SET KANJI | 01 STR1 CHARACTER SET KANJI PICTURE X(10).5
VARCHAR(80) | 01 STR2. 49 STR2L PICTURE S9(4) COMP. 49 STR2C PICTURE X(80). キャラクタ・セットはUNSPECIFIED。
VARCHAR(80) CHARACTER SET KANJI | 01 STR2. 49 STR2L PICTURE S9(4) COMP. 49 STR2C CHARACTER SET KANJI PICTURE X(80).5
LONG VARCHAR | 01 STR3. 49 STR3L PICTURE S9(4) COMP. 49 STR3C PICTURE X(16383). キャラクタ・セットはUNSPECIFIED。
TINYINT(2) TINYINT | COBOLではサポートされない。 COBOLではサポートされない。
SMALLINT(2) SMALLINT | 01 NUM1 PICTURE S99V99 COMP. 01 NUM1 PICTURE S9(4) COMP.
INTEGER(2) INTEGER | 01 NUM2 PICTURE S9(7)V99 COMP. 01 NUM2 PICTURE S9(9) COMP.
BIGINT(2) BIGINT | 01 NUM3 PIC S9(16)V99 COMP. 01 NUM3 PIC S9(18) COMP.
FLOAT(6) FLOAT(25) | 01 NUM4 COMP-1. 01 NUM4 COMP-2.1
REAL | 01 NUM5 COMP-1.
DOUBLE PRECISION | 01 NUM6 COMP-2.2
DATE | 01 DATENUM1 SQL_DATE.
DATE ANSI | 01 DATENUM2 SQL_DATE_ANSI.
DATE VMS | 01 DATENUM3 SQL_DATE_VMS.
TIME | 01 DATENUM4 SQL_TIME(0).
TIMESTAMP | 01 DATENUM5 SQL_TIMESTAMP(2).
INTERVAL DAY TO HOUR | 01 DATENUM6 SQL_INTERVAL (DAY TO HOUR).3
LIST OF BYTE VARYING | 01 STR4 PICTURE X(8).4

1COMP-2はFLOAT(25)です。
2COMP-2はDOUBLE PRECISIONです。
3表4-2は、サポートされているすべてのINTERVALデータ型を示しています。
4この例は、8バイトの文字列を使用して、セグメント化された文字列（リスト）識別子、リストの先頭要素のポインタを取得する方法を示しています。（必要な場合、かわりにBIGINTを使用することもできます。）このリストの個別要素の値を取得するには、CHARデータ型またはVARCHARデータ型のホスト言語変数を使用します。
5文字長およびプリコンパイラの詳細は、第4.4.1項を参照してください。