ヘッダーをスキップ

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

戻る | 次へ |

# 2.3 データ型

CREATE TABLE文またはALTER TABLE文で表の新しい列を定義する場合、その列のデータ型を指定する必要があります。列のデータ型によって、SQLでの列の値の解釈方法および格納方法が制御されます。値式（ファンクション、パラメータおよびリテラル）にはすべて、データ型が関連付けられています。

表2-8に、SQLデータ型のキーワード、および基底OpenVMSデータ型のリストを示します。

表2-8 SQLキーワードとOpenVMSデータ型の比較
SQLキーワード | OpenVMSデータ型
--- | ---
CHAR (n) | 文字列（DSC$K_DTYPE_T）
CHAR (n)、キャラクタ・セットによる修飾 | 文字列（DSC$K_DTYPE_T）
NCHAR (n) | 文字列（DSC$K_DTYPE_T）
VARCHAR (n) | 可変文字列（DSC$K_DTYPE_VT）
VARCHAR (n)、キャラクタ・セットによる修飾 | 可変文字列（DSC$K_DTYPE_VT）
NCHAR VARYING(n) | 可変文字列（DSC$K_DTYPE_VT）
LONG VARCHAR | 可変文字列（DSC$K_DTYPE_VT）
TINYINT [(n)]1 | 符号付きバイト整数（DSC$K_DTYPE_B）
SMALLINT [(n)]1 | 符号付きワード整数（DSC$K_DTYPE_W）
INTEGER [(n)]1 | 符号付きロングワード整数（DSC$K_DTYPE_L）
QUADWORD [(n)]1、2 | 符号付きクワッドワード整数（DSC$K_DTYPE_Q）
BIGINT [(n)]1、2 | 符号付きクワッドワード整数（DSC$K_DTYPE_Q）
DECIMAL [(n[,n])]3 | パック10進数文字列（DSC$K_DTYPE_P）
NUMERIC [(n[,n])]3 | 左区切り記号付き数値文字列（DSC$K_DTYPE_NL）
FLOAT [(n)] | nの値に応じた、単精度浮動小数点数（F浮動小数点）または倍精度浮動小数点数（G浮動小数点）（DSC$K_DTYPE_FまたはDSC$K_DTYPE_G）
REAL | 単精度浮動小数点数（DSC$K_DTYPE_F）
DOUBLE PRECISION4 | 倍精度浮動小数点数（G浮動小数点）（DSC$K_DTYPE_G）3
DATE | DATE VMS（デフォルトのDATE）はDSC$K_DTYPE_ADT、DATE ANSIはOracle Rdb内部
TIME | Oracle Rdb内部
TIMESTAMP | Oracle Rdb内部
INTERVAL | Oracle Rdb内部
LIST OF BYTE VARYING | --
BYTE VARYING | -- 5

1SQLの整数データ型のスケール変更係数（n）は、Oracle Rdbの整数データ型の負のスケール変更係数と等しいものです。SQLでは、Oracle Rdbの正のスケール変更係数はサポートされていません。
2キーワードはQUADWORDではなくBIGINTを使用することをお薦めします。
3SQLではDECIMALデータ型およびNUMERICデータ型がサポートされていないため、表定義でDECIMALまたはNUMERICが指定されると、整数型または浮動小数点型の列がデータベースに作成されます。ただし、データベース列の整数値、文字値または浮動小数点値と、プロシージャ・パラメータおよびホスト言語変数の数値文字列値との間は、SQLによって変換されます。
4SQLでは、ホスト言語でG浮動小数点データ型がサポートされていない場合、データベース内のG浮動小数点型の値はD浮動小数点型の値に変換されます。
5BYTE VARYINGデータ型は、符号なし8ビット・バイトの文字列です。現時点では、SQL LISTセグメントの形式としてのみ有効ですが、今後の使用のために予約されています。

データ型を指定する場合は、次の形式を使用します。

以降の項では、文字、DECIMALとNUMERIC、固定小数点数と浮動小数点数、日時、LIST OF BYTE VARYINGの各データ型、およびデータ型間の変換規則について説明します。

## 2.3.1 文字データ型

SQLでは、次の文字データ型がサポートされています。

- CHAR
  このデータ型は、列のデータが固定長のオクテット・シーケンスまたは文字列であることを示しています。符号なし整数（n）を使用して、列のオクテット数または文字数を指定します。（サポート対象のキャラクタ・セットの文字に使用されるオクテット数のリストは、表2-2を参照してください。）nの最大サイズは、65,271オクテットです。文字の場合、nの最大サイズは、65,271を1文字当たりの最大オクテット数で割った値になります。たとえば、KANJIキャラクタ・セットでは最大で2オクテット使用します。したがって、nは65,271/2、つまり32,635文字です。nを省略すると、SQLでは1オクテットまたは1文字の列が作成されます。

- キーワードCHARACTER SETおよびキャラクタ・セット名で修飾されたCHARまたはCHARACTER
  このデータ型は、キャラクタ・セットがCHARACTER SET句で指定されているという点以外は、CHARと同じ特性を持ちます。キャラクタ・セット名のリストは、第2.1節を参照してください。

- NCHAR、NATIONAL CHARまたはNATIONAL CHARACTER
  この各国語キャラクタ・データ型は、キャラクタ・セットが各国語キャラクタ・セットとして指定されているという点以外は、CHARと同じ特性を持ちます。

- VARCHARまたはCHARACTER VARYING
  このデータ型は、列のデータが可変長のオクテット・シーケンスまたは文字列であることを示しています。符号なし整数（n）を使用して、列の最大オクテット数または最大文字数を指定します。nの最大サイズは、65,269オクテットです。文字の場合、nの最大サイズは、65,269を1文字当たりの最大オクテット数で割った値になります。たとえば、KANJIキャラクタ・セットでは最大で2オクテット使用します。したがって、nは65,269/2、つまり32,634文字になります。
  Oracle RdbではVARCHAR2のシノニム以外に、ANSI/ISO SQL規格に準拠し、VARCHARのシノニムとしてデータ型キーワードCHARACTER VARYINGおよびCHAR VARYINGがサポートされています。

- キーワードCHARACTER SETおよびキャラクタ・セット名で修飾されたVARCHAR
  このデータ型は、キャラクタ・セットがCHARACTER SET句で指定されているという点以外は、VARCHARと同じ特性を持ちます。キャラクタ・セット名のリストは、第2.1節を参照してください。

- NCHAR VARYING、NATIONAL CHAR VARYINGまたはNATIONAL CHARACTER VARYING
  この各国語キャラクタ・セット・データ型は、キャラクタ・セットが各国語キャラクタ・セットとして指定されているという点以外は、VARCHARと同じ特性を持ちます。

- LONG VARCHAR
  このデータ型は、列のデータが最大16,383オクテットで可変長のオクテット・シーケンスまたは文字列であることを示しています。文字の場合、nの最大サイズは、16,383を1文字当たりの最大オクテット数で割った値になります。たとえば、KANJIキャラクタ・セットでは最大で2オクテット使用します。したがって、nは16,383/2、つまり8,191文字になります。LONG VARCHARデータ型は、VARCHAR (16383)と指定するのと同じです。

- RAWは、VARCHARのシノニムです。常にキャラクタ・セットUNSPECIFIEDが使用されるため（CHARACTER SET句を使用できないため）、データベース内の他のすべてのキャラクタ・セットのデータに割り当てられます。これにより、あらゆるキャラクタ・セットのデータを、このデータ型の列、パラメータまたは変数に割り当てることができます。長さを指定する場合、0〜65535の値を指定できます。実際に使用される長さは、表の行内で使用可能な領域によって制限される場合があります。ただし、変数定義およびパラメータ定義では最大長まで使用できます（これはCHAR、VARCHARおよびVARCHAR2の各データ型にも該当します）。

- LONGは、LIST OF BYTE VARYING AS TEXTのシノニムです。

- LONG RAWは、LIST OF BYTE VARYING AS BINARYのシノニムです。

どのデータ型も、各文字の長さは1オクテット以上になります。この長さはキャラクタ・セットによって異なります。デフォルトでは、文字データ型の長さはオクテットです。文字の長さを指定するには、SET DIALECT文またはSET CHARACTER LENGTH文を使用します。

データ型をキャラクタ・セットで修飾しない場合は、その列のキャラクタ・セットとしてデータベースのデフォルト・キャラクタ・セットが指定されたものとみなされます。データベースのデフォルト・キャラクタ・セットを指定しない場合、その列はDEC_MCSキャラクタ・セットであるとみなされます。

テキスト値がリテラルであるか、パラメータに格納されているリテラルであるか、または表列に格納されているリテラルであるかどうかにかかわらず、テキスト値は演算式内で使用できません。

    SQL> SELECT EMPLOYEE_ID + 1 FROM EMPLOYEES;
    %SQL-F-UNSSTRXPR, Unsupported string expression

注意 デフォルトでは、C言語の文字列はヌル文字で終了する文字列として処理されます。バイナリ入力を操作するCアプリケーションを作成する方法は、次のとおりです。 SQL Cプリコンパイラで$SQL_VARCHARデータ型を使用します。 言語修飾子として、GENERALのSQLモジュール言語を使用します。 文字列解釈オプションとして、FIXEDのSQLモジュール言語およびリポジトリを使用します。

### 2.3.1.1 CHAR列またはVARCHAR列の最大長の計算

SQLのすべてのデータ型で、データベース行の領域を一定量使用します。使用される領域のほとんどは、事前にサイズが決定しています。たとえば、BIGINTデータ型の記憶域には8オクテットが必要です。ただし、CHARデータ型、VARCHARデータ型、およびこれらと同等のNATIONAL CHARACTERデータ型では、文字単位で記憶域サイズを指定できます。

Oracle Rdbでは、格納される行のサイズは65,272オクテットに制限されています。これにより、その表の列数および関連付けられるデータ型のサイズが制限されます。

また、表定義ごとに可変オーバーヘッドがあります。このオーバーヘッドのサイズは、NULLフラグを表す可変のオクテット数になります（列ごとに1つのフラグ）。表列の数が増加すると、NULLビット・ベクターも大きくなります（整数のオクテットとして格納されます）。表の8列ごとに単一のオクテットが使用され、NULLビット・ベクターが格納されます。

注意 VARCHAR、NATIONAL CHARACTER VARYING（または同等の構文）の各列では、実際の長さの情報を保存するために2オクテットがさらに必要になります。

CHAR列またはVARCHAR列の最大長は、新しい列の格納に使用可能な空き領域の量に応じて制御されます。たとえば、単一のCHAR(65271)列を持つ表を作成できます。

    SQL> CREATE TABLE T1 (A CHAR(65271));

ただし、追加でBIGINT列を定義すると、CHAR列の最大長は65,263オクテットに減少します（65,271 - 8オクテット）。

    SQL> CREATE TABLE T1 (A CHAR(65271), B BIGINT);
    %RDB-E-NO_META_UPDATE, metadata update failed
    -RDMS-F-RECMAXEXC, relation T1 definition exceeds data limit

    SQL> CREATE TABLE T1 (A CHAR(65263), B BIGINT);

最大の文字列長は、表のデータ型および列数によって異なります。

## 2.3.2 日時データ型

SQLでは、日付と時刻を表す4種類のデータ型が提供されています。これらを今後、日時データ型と呼びます。DATE、TIMEおよびTIMESTAMPの各データ型では、カレンダ日付および時計の時刻を参照します。INTERVALデータ型は、2つの日時の値で示す期間を参照する相対日時データ型です。

日時データ型には、次の種類があります。

- DATE
  DATE型は、次の2つのキーワードで修飾できます。

  - DATE ANSIは、YEAR TO DAYで構成されるDATEを指定します。

  - DATE VMSは、YEAR TO SECONDを含むタイムスタンプを指定します。

  DATEデータ型を修飾しない場合は、表に列を作成するときにDATE VMSとして解釈されます。INSERT文またはSELECT文を発行する場合は、DATEデータ型を修飾する必要があります。DATE VMSデータ型は、日時の演算には使用できません。
  SET DEFAULT DATE FORMAT文、プログラムに埋め込まれているDECLARE MODULE文のプリコンパイラDEFAULT DATE FORMAT句、またはモジュール・ファイルのモジュール言語DEFAULT DATE FORMAT句を使用すると、DATEをDATE ANSIに変更できます。ドメインまたは表を作成する前に、SET DEFAULT DATE FORMAT文を使用する必要があります。データベース定義を作成した後は、この文はデータ型の変更に使用できません。
  DATEデータ型の書式の詳細は、第2.4.3項を参照してください。

- TIME
  HOUR、MINUTEおよびSECONDの各フィールドがあります。TIMEの後に小数秒精度を指定できます。小数秒精度とは、第2.3節の構文図でfracとして示されている、秒の小数部分の桁数を表す0〜2の間の数値のことです。小数秒精度なしでTIMEを指定すると、TIME(0)にデフォルト設定されます。

- TIMESTAMP
  YEAR、MONTH、DAY、HOUR、MINUTEおよびSECONDの各フィールドがあります。TIMESTAMPの後に小数秒精度を指定できます。小数秒精度とは、第2.3節の構文図でfracとして示されている、秒の小数部分の桁数を表す0〜2の間の数値のことです。小数秒精度なしでTIMESTAMPを指定すると、100分の1秒であるTIMESTAMP(2)にデフォルト設定されます。

- INTERVAL
  2つの日時データ型の間の差異を指定します。
  INTERVALを修飾して期間の計算方法を指定するために、SQLでは2つの期間のカテゴリが提供されています。表2-9に示すように、各カテゴリには独自の時間隔修飾子のセットがあります。

  表2-9 時間隔修飾子
  期間カテゴリ | 時間隔修飾子
  --- | ---
  YEAR-MONTH | YEAR
  | YEAR TO MONTH
  | MONTH
  DAY-TIME | DAY
  | DAY TO HOUR
  | DAY TO MINUTE
  | DAY TO SECOND
  | HOUR
  | HOUR TO MINUTE
  | HOUR TO SECOND
  | MINUTE
  | MINUTE TO SECOND
  | SECOND

  期間の書式を設定する際、Oracle Rdbでは先行フィールドの桁数を指定する必要があります。先行フィールド桁数の最小値は1桁、最大値は9桁です。期間先行フィールド精度は、第2.3節の構文図にprecとして示されています。期間先行フィールド精度を指定しない場合、2にデフォルト設定されます。
  次の例では、HOURS_WORKED列が2つのTIMESTAMP列から計算されます。HOURおよびSECONDの各時間隔修飾子の先行フィールド精度は、HOURS(2)およびSECONDS(2)にデフォルト設定されます。

      SQL> CREATE TABLE ACCOUNTING.DAILY_HOURS
      cont>   (EMPLOYEE_ID  CHAR(5),
      cont>    START_TIME   TIMESTAMP,
      cont>    END_TIME     TIMESTAMP,
      cont>    HOURS_WORKED
      cont>        COMPUTED BY (END_TIME - START_TIME) HOUR TO SECOND
      cont>    );
      SQL> --
      SQL> -- Now show the columns in the table - note default precisions
      SQL> --
      SQL> SHOW TABLE (COLUMNS) ACCOUNTING.DAILY_HOURS;
      Information for table DAILY_HOURS

      Columns for table DAILY_HOURS:
      Column Name                     Data Type        Domain
      -----------                     ---------        ------
      EMPLOYEE_ID                     CHAR(5)
      START_TIME                      TIMESTAMP(2)
      END_TIME                        TIMESTAMP(2)
      HOURS_WORKED                    INTERVAL
                                       HOUR (2) TO SECOND (2)
       Computed:       BY (END_TIME - START_TIME) HOUR TO SECOND
      SQL> --
      SQL> -- Output shows the two-digit precision in HOUR and SECOND qualifiers
      SQL> --
      SQL> SELECT EMPLOYEE_ID, HOURS_WORKED FROM ACCOUNTING.DAILY_HOURS;
       EMPLOYEE_ID   HOURS_WORKED
       00415          09:44:36.85
       00415          10:16:21.25
       00415          10:30:17.57
       .
       .
       .

  小数秒精度とは、第2.3節の構文図でfracとして示されている、SECONDフィールドの小数点以下の桁数のことです。この数字は秒の小数の桁数を表します。小数秒精度は、0〜2の間の値になります。小数秒精度を指定しない場合、SECONDフィールドの小数秒精度には2がデフォルト設定されます。
  INTERVAL修飾子は、日付フィールドの重要度の高い方から低い方に指定する必要があります。日時フィールドの重要度の順序は、高い方から低い方にYEAR、MONTH、DAY、HOUR、MINUTE、SECONDです。表2-10および表2-11は、期間に含まれるフィールドを示しています。

表2-10 年月INTERVAL列のフィールド
キーワード | 意味 | 有効範囲
--- | --- | ---
YEAR | 年 | 符号付きの値
MONTH | 月 | 符号付きの値（YEAR TO MONTH期間の場合は--11 ... 11に制限される）

この期間に対してMONTHのみを指定すると、月の値はY x 12 + Mとして計算されます。YおよびMは内部的に(Y,M)として格納された年および月を表します。

表2-11 日時INTERVAL列のフィールド
|  | 有効範囲
--- | --- | ---
キーワード | 意味 | 先行フィールドの場合 | それ以外
DAY | 日1 | --3649634 ... 3649634 | （同じ）
HOUR | 時間2 | --87591216 ... 87591216 | 0 ... 23
MINUTE | 分3 | --999999999 ... 999999999 | 0 ... 59
SECOND | 秒4 | --21474836.47 ... 21474836.47 | 0 ... 59.99

1この値は約9999年分の日数です。
2HOURの値は、DAYの最大値に24を乗算した値に制限されます。
3この値は、最大期間先行フィールド精度によって制限されます。
4この値は、INTEGER(2) scale --2に格納できる最大値によって制限されます。

日時フィールドのサブセットを指定すると、最も重要度の高いフィールドの値が合計され、指定された最も重要度の高い先行フィールドに適切な値が設定されます。

時間隔修飾子で指定されていない、重要度の低いフィールドは切り捨てられます。たとえば、期間が内部的に(D,H,M,S)として格納されているとします。時間隔修飾子でHOUR TO MINUTEを指定すると、HOURはD x 24 + Hに、MINUTEはMに設定され、SECONDフィールドは切り捨てられます。

演算式内で日時に関する変数と定数を使用できます。有効な演算子のリストは、表2-27を参照してください。日時計算の詳細は、『Oracle Rdb7 Introduction to SQL』を参照してください。

YESTERDAY、TODAYおよびTOMORROWの各文字列リテラルのコンパイル時変換の詳細は、第2.4.2項を参照してください。

例2-1は、これらの複数の日時データ型の使用方法を示しています。

例2-1 日時データ型の使用
    SQL> -- Create a simple table with a variety of data types.  Note the use
    SQL> -- of date-time literals for the DEFAULT and CHECK clauses.
    SQL> --
    SQL> CREATE TABLE DATE_TEST
    cont>   (A DATE VMS,
    cont>    B DATE ANSI,
    cont>    C TIME(0)
    cont>      DEFAULT TIME '06:00:00',
    cont>    D TIMESTAMP(2),
    cont>    E INTERVAL YEAR(4)
    cont>      CHECK(E > INTERVAL '10' YEAR)
    cont>      NOT DEFERRABLE,
    cont>    F INTERVAL DAY(3) TO MINUTE,
    cont>    G CHAR(16));
    SQL> --
    SQL> -- Literal dates are represented as TEXT literals.  On  OpenVMS ,
    SQL> -- the date format is controlled by the LIB$DT_INPUT_FORMAT
    SQL> -- and SYS$LANGUAGE logical names.  For more information about
    SQL> -- these logical names, see the  OpenVMS  documentation for the
    SQL> -- Run-Time Library.
    SQL> --
    SQL> INSERT INTO DATE_TEST (A) VALUE ('2-APR-1957');
    1 row inserted
    SQL> SET LANGUAGE SPANISH
    SQL> INSERT INTO DATE_TEST (A) VALUE ('2-abr-1957');
    1 row inserted
    SQL> SET LANGUAGE ENGLISH
    SQL> SELECT A FROM DATE_TEST;
     A
      2-APR-1957 00:00:00.00
      2-APR-1957 00:00:00.00
    2 rows selected
    SQL> --
    SQL> -- The ANSI/ISO SQL standard specifies that only date-time literals
    SQL> -- can be assigned to date-time columns (for example, DATE, TIME,
    SQL> -- TIMESTAMP, and INTERVAL).  These date-time literals are used
    SQL> -- in INSERT, SELECT, and UPDATE statements and in CREATE and ALTER
    SQL> -- statements.
    SQL> --
    SQL> INSERT INTO DATE_TEST (B) VALUE (DATE '1993-2-23');
    1 row inserted
    SQL> INSERT INTO DATE_TEST (C) VALUE (TIME '12:20:00');
    1 row inserted
    SQL> INSERT INTO DATE_TEST (D) VALUE (TIMESTAMP '1993-2-23 12:20:00.00');
    1 row inserted
    SQL> INSERT INTO DATE_TEST (E) VALUE (INTERVAL '35' YEAR(4));
    1 row inserted
    SQL> INSERT INTO DATE_TEST (F) VALUE (INTERVAL '365:10:21' DAY(3) TO
    MINUTE);
    1 row inserted
    SQL> --
    SQL> -- DATE VMS columns can have associated edit strings defined
    SQL> -- for them.  However, ANSI/ISO date-time values always print
    SQL> -- in ANSI/ISO format unless you cast them to DATE VMS.
    SQL> --
    SQL> SELECT D, CAST(D AS DATE VMS)
    cont>   FROM DATE_TEST
    cont>   WHERE D IS NOT NULL;
     D
     1993-02-23 12:20:00.00   23-FEB-1993 12:20:00.00
    1 row selected
    SQL> --
    SQL> --  Oracle Rdb  also supports another internal format for
    SQL> -- DATE VMS.  This format is similar to the TIMESTAMP format
    SQL> -- except that the punctuation is omitted.  This example assigns
    SQL> -- the CHAR column (A) to the DATE VMS (G) column and then displays
    SQL> -- the result.  In an application, the CHAR column could be a CHAR
    SQL> -- host variable or module language parameter.
    SQL> --
    SQL> INSERT INTO DATE_TEST (G) VALUE ('1957020100000000');
    1 row inserted
    SQL> UPDATE DATE_TEST
    cont>   SET A=G
    cont>   WHERE G IS NOT NULL;
    1 row updated
    SQL> SELECT A, G
    cont>   FROM DATE_TEST
    cont>   WHERE G IS NOT NULL;
     A                         G
      1-FEB-1957 00:00:00.00   1957020100000000
    1 row selected
    SQL> ROLLBACK;