データ型は値のセットを定義します。データ型の参照は、コンテキストに指定可能な値のセットを指定します。データ型は、表から検索された値、または式や定数に従って計算された値に応じて決まります。
TimesTenでは、ODBC標準に基づいてデータ型が変換されます。詳細は、Microsoft社や様々なサード・パーティから入手できる、ODBC APIリファレンスのドキュメントを参照してください。次のサイトに、Microsoft社のODBC APIリファレンスのドキュメントがあります。
https://msdn.microsoft.com/en-us/library/ms714562(VS.85).aspx
TimesTenキャッシュを使用する場合、『Oracle TimesTen Application-Tier Database Cacheユーザーズ・ガイド』のOracle DatabaseとTimesTenデータ型間のマッピングに関する項を参照してください。この項では、パススルー問合せで行われる型変換およびキャッシュ・グループの列の作成に有効なデータ型を比較します。
次の各項では、TimesTenのデータ型について説明します。
表1-1「サポートされるデータ型」に、TimesTenでサポートされるデータ型を示します。
表1-1 サポートされているデータ型
データ型 | 説明 |
---|---|
詳細は、「BINARYおよびVARBINARYデータ型」を参照してください。 |
|
64ビットの浮動小数点数
正の最小有限値: 2.22507485850720E-308 正の最大有限値: 1.79769313486231E+308 詳細は、「BINARY_DOUBLE」を参照してください。 |
|
32ビットの浮動小数点数
正の最小有限値: 1.17549E-38F 正の最大有限値: 3.40282E+38F 詳細は、「BINARY_FLOAT」を参照してください。 |
|
可変長バイナリ・ラージ・オブジェクト。 有効な範囲は、1バイトから16,777,216バイトまでです。 詳細は、「BLOB」を参照してください。 |
|
長さが
長さが0(ゼロ)の文字列は、
詳細は、「CHAR」を参照してください。 |
|
シングルバイト文字またはマルチバイト文字を格納する可変長キャラクタ・ラージ・オブジェクト。 有効な範囲は、データベース文字セットに応じて1バイトから4,194,304バイトまでのデータです。具体的には、 詳細は、「CLOB」を参照してください。 |
|
日付と時刻の情報(世紀、年、月、日、時、分、秒) 書式は次のとおりです。
有効な日付の範囲は紀元前4712年1月1日から西暦9999年12月31日です。 小数秒はありません。 詳細は、「DATE」を参照してください。 |
|
時間隔型 TimesTenでは、型 ノート: 時間隔型の列は指定できません。実行時にSQL式で使用される非永続型があります。さらに、時間隔データ型が返される比較では、時間隔データ型を完結した式の最終結果に使用することはできません。この時間隔の結果から必要な要素を抽出するには、 詳細は、「TimesTenの時間間隔」を参照してください。 |
|
必要なバイト数は2* 長さが0(ゼロ)の文字列は、
詳細は、「NCHAR」を参照してください。 |
|
Unicode文字を格納する各国語可変長キャラクタ・ラージ・オブジェクト。 有効な範囲は、1文字から2,097,152文字までです。 詳細は、「NCLOB」を参照してください。 |
|
精度とスケールが指定された数値。 精度の範囲は1から38桁です。スケールの範囲は-84から127です。精度とスケールの両方ともオプションです。 精度およびスケールを指定しない場合は、最大精度の38および柔軟なスケールが指定されたとみなされます。
詳細は、「NUMBER」を参照してください。 |
|
必要なバイト数は2* 有効な範囲は、1文字から2,097,152文字までです。
長さが0(ゼロ)の文字列は、 非空白埋め比較セマンティクスが使用されます。 詳細は、「NVARCHAR2」を参照してください。 |
|
TimesTen Classicで表の行またはマテリアライズド・ビューの行のアドレスを表す18バイトの文字列。 リテラルの 詳細は、「ROWIDデータ型」を参照してください。 |
|
00:00:00(午前0時)から23:59:59(午後11時59分59秒)の間の時刻 書式は かわりに、 詳細は、「TIME」を参照してください。 |
|
|
日付の年、月および日の値に加えて、時間の時、分および秒の値
小数秒の精度の範囲は0(ゼロ)から9です。デフォルトは6です。書式は次のとおりです。
詳細は、「TIMESTAMP」を参照してください。 |
範囲が-9,223,372,036,854,775,808から9,223,372,036,854,775,807までの符号付き8バイト整数。
詳細は、「TT_BIGINT」を参照してください。 |
|
日付情報(世紀、年、月、日) 書式は 有効な日付は、1753-01-01(1753年1月1日)から9999-12-31(9999年12月31日)の間の日付です。 詳細は、「TT_DATE」を参照してください。 |
|
範囲が-2,147,483,648から2,147,483,647までの符号付き整数。
詳細は、「TT_INTEGER」を参照してください。 |
|
|
範囲が-32,768から32,767までのネイティブ符号付き16ビット整数。
詳細は、「TT_SMALLINT」を参照してください。 |
1753-01-01 00:00:00(1753年1月1日午前0時)から9999-12-31 23:59:59(9999年12月31日午後11時59分59秒)の間の日付と時刻 マイクロ秒に満たない端数は、
詳細は、「TT_TIMESTAMP」を参照してください。 |
|
0から255までの範囲の符号なし整数。
詳細は、「TT_TINYINT」を参照してください。 |
|
最大長が 有効な範囲は、1バイトから4,194,304バイトまでです。 かわりに、 詳細は、「BINARYおよびVARBINARYデータ型」を参照してください。 |
|
長さが
バイト長セマンティクスの場合、有効な範囲は1バイトから4,194,304バイトまでです。 文字長セマンティクスの場合、有効な範囲は1文字から1,048,576文字までです。
長さが0(ゼロ)の文字列は、 非空白埋め比較セマンティクスが使用されます。
詳細は、「VARCHAR2」を参照してください。 |
TimesTenは、ANSI SQLデータ型をサポートしています。これらのデータ型は、TimesTenデータ型に変換され、データはTimesTenデータ型として保存されます。表1-2に、ANSI SQLデータ型とTimesTenデータ型とのマッピングを示します。
表1-2 データ型のマッピング: ANSI SQLからTimesTen
ANSI SQLデータ型 | TimesTenデータ型 |
---|---|
文字セマンティクスがサポートされています。 |
|
バイナリ精度126の浮動小数点数。 かわりに、 |
|
バイナリ精度
内部的には、 |
|
|
|
|
|
|
|
精度 |
|
バイナリ精度63の浮動小数点数。 かわりに、 |
|
|
TimesTenでは、表1-3に示すデータ型がサポートされています。
表1-3 下位互換性のためにサポートされているデータ型
文字データ型は、文字(英数字)データをデータベース文字セットまたはUTF-16書式で格納します。文字データはバイト値を使用する文字列に格納されます。バイト値は、データベース作成時に定義されるデータベース文字セットのいずれかに対応しています。シングルバイト文字セットとマルチバイト文字セットの両方がサポートされています。
文字データ型には次のものがあります。
CHAR
型は、固定長文字列を指定します。CHAR
列に値を挿入する際、定義されている列長よりその値が短い場合は、列長にあわせてTimesTenの空白文字が埋め込まれます。CHAR
列に値を挿入する際に、その値が定義されている列長より長い場合は、エラーが戻されます。
デフォルトでは、列長はバイトで定義されます。CHAR
修飾子を使用し、列長を文字で定義します。文字のサイズは、データベース文字セットに応じて1バイトから4バイトの範囲になります。BYTE
修飾子およびCHAR
修飾子は、NLS_LENGTH_SEMANTICS
パラメータ設定より優先されます。NLS_LENGTH_SEMANTICS
の詳細は、「ALTER SESSION」を参照してください。『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のグローバリゼーション・サポートの属性の設定に関する項も参照してください。
ノート: CHAR 型を使用すると、長さが0(ゼロ)の文字列はNULL として解釈されます。TT_CHAR 型を使用すると、長さが0(ゼロ)の文字列は、NULL 以外の有効な値となります。CHAR とTT_CHAR の両方で、空白埋め比較セマンティクスが使用されます。TT_CHAR 型は下位互換用にサポートされています。 |
次の例では、表を作成します。列は型CHAR
およびTT_CHAR
を使用して定義されます。これらの型では、空白埋め比較セマンティクスが使用されます。
Command> CREATE TABLE typedemo (name CHAR (20), nnme2 TT_CHAR
(20));
Command> INSERT INTO typedemo VALUES ('SMITH ','SMITH ');
1 row inserted.
Command> DESCRIBE typedemo;
Table USER.TYPEDEMO:
Columns:
NAME CHAR (20)
NAME2 TT_CHAR (20)
1 table found.
(primary key columns are indicated with *)
Command> SELECT * FROM typedemo;
< SMITH , SMITH >
1 row found.
Command> -- Expect 1 row found; blank-padded comparison semantics
Command> SELECT * FROM typedemo WHERE name = 'SMITH';
< SMITH , SMITH >
1 row found.
Command> SELECT * FROM typedemo WHERE name2 = 'SMITH';
< SMITH , SMITH >
1 row found.
Command> -- Expect 0 rows; blank padded comparison semantics.
Command> SELECT * FROM typedemo WHERE name > 'SMITH';
0 rows found.
Command> SELECT * FROM typedemo WHERE name2 > 'SMITH';
0 rows found.
次の例では、表typedemo
を変更し、列name3
を追加します。列name3
は、文字セマンティクスで定義されます。
Command> ALTER TABLE typedemo ADD COLUMN name3 CHAR (10 CHAR); Command> DESCRIBE typedemo; Table USER.TYPEDEMO: Columns: NAME CHAR (20) NAME2 TT_CHAR (20) NAME3 CHAR (10 CHAR) 1 table found.
NCHAR
データ型は、2バイトのUnicode文字の固定長文字列です。NCHAR
データ型は、Unicodeの空白文字U+0020 SPACE
を使用して指定した長さまで調整されます。空白埋め比較セマンティクスが使用されます。
ノート: NCHAR 型を使用すると、長さが0(ゼロ)の文字列はNULL として解釈されます。TT_NCHAR 型を使用すると、長さが0(ゼロ)の文字列は、NULL以外の有効な値となります。NCHAR とTT_NCHAR の両方で、空白埋め比較セマンティクスが使用されます。TT_NCHAR 型は下位互換用にサポートされています。
|
次の例では、表typedemo
を変更し、列Name4
を追加します。データ型はNCHAR
です。
Command> ALTER TABLE typedemo ADD COLUMN Name4 NCHAR (10); Command> DESCRIBE typedemo; Table USER.TYPEDEMO: Columns: NAME CHAR (20) NAME2 TT_CHAR (20) NAME3 CHAR (10 CHAR) NAME4 NCHAR (10) 1 table found.
VARCHAR2
データ型は、可変長文字列を指定します。VARCHAR2
列を定義する場合は、バイトまたは文字の最大数を定義します。各値は指定したとおりに格納されます。この値が列の最大長を超えることはできません。
最大長を指定する必要があります。最小値は1バイト以上である必要があります。文字の最大長を指定するには、CHAR
修飾子を使用します。たとえば、VARCHAR2(10 CHAR)
です。
文字のサイズは、データベース文字セットに応じて1バイトから4バイトの範囲になります。BYTE
修飾子およびCHAR
修飾子は、NLS_LENGTH_SEMANTICS
パラメータ設定より優先されます。NLS_LENGTH_SEMANTICS
の詳細は、「ALTER SESSION」を参照してください。『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のグローバリゼーション・サポートの属性の設定に関する項も参照してください。
NULL
値は、行内の各NULL値可能フィールドに対して単一ビットとして格納されます。値がNULL
であるINLINE VARCHAR2(
n
)
は、(nullビット) +4バイト+ n
バイトの記憶域を使用します。つまり、値がNULL
であるNOT INLINE VARCHAR2 (
n
)
よりもn
バイト多く記憶域を使用します。この記憶域の原則は、すべての可変長データ型(TT_VARCHAR
、TT_NVARCHAR
、VARCHAR2
、NVARCHAR2
、VARBINARY
)に適用されます。
ノート:
|
次の例では、表typedemo
を変更し、列name5
とname6
を追加します。name5
列は型VARCHAR2
により定義されます。name6
列はTT_VARCHAR
により定義されます。次の例では、列name5
での非空白埋め比較セマンティクスの使用と、列name6
での空白埋め比較セマンティクスの使用を示しています。
Command> ALTER TABLE typedemo ADD COLUMN name5 VARCHAR2 (20); Command> ALTER TABLE typedemo ADD COLUMN name6 TT_VARCHAR (20); Command> DESCRIBE typedemo; Table USER.TYPEDEMO: Columns: NAME CHAR (20) NAME2 TT_CHAR (20) NAME3 CHAR (10 CHAR) NAME4 NCHAR (10) NAME5 VARCHAR2 (20) INLINE NAME6 TT_VARCHAR (20) INLINE 1 table found. (primary key columns are indicated with *) Command> -- Insert SMITH followed by 5 spaces into all columns Command> INSERT INTO typedemo VALUES ('SMITH ', 'SMITH ', 'SMITH ', 'SMITH ', 'SMITH ', 'SMITH'); 1 row inserted. Command> -- Expect 0; Nonpadded comparison semantics Command> SELECT COUNT (*) FROM typedemo WHERE name5 = 'SMITH'; < 0 > 1 row found. Command> -- Expect 1; Blank-padded comparison semantics Command> SELECT COUNT (*) FROM typedemo WHERE name6 = 'SMITH'; < 1 > 1 row found. Command> -- Expect 1; Nonpadded comparison semantics Command> SELECT COUNT (*) FROM typedemo WHERE name5 > 'SMITH'; < 1 > 1 row found. Command> -- Expect 0; Blank-padded comparison semantics Command> SELECT COUNT (*) FROM typedemo WHERE name6 > 'SMITH'; < 0 > 1 row found.
NVARCHAR2
データ型は、2バイトのUnicode文字の可変長文字列です。NVARCHAR2
列を定義する場合は、文字の最大数を定義します。各値は指定したとおりに格納されます。この値が列の最大長を超えることはできません。
ノート: NVARCHAR2 型を使用すると、長さが0(ゼロ)の文字列はNULL として解釈されます。TT_NVARCHAR 型を使用すると、長さが0(ゼロ)の文字列は、NULL以外の有効な値となります。NVARCHAR2 では非空白埋め比較セマンティクスが使用されます。TT_NVARCHAR では空白埋め比較セマンティクスが使用されます。TT_NVARCHAR 型は下位互換用にサポートされています。
|
次の例では、表typedemo
を変更し、列Name7
を追加します。データ型はNVARCHAR2
です。
Command> ALTER TABLE typedemo ADD COLUMN Nnme7 NVARCHAR2 (20); Command> DESCRIBE typedemo; Table USER1.TYPEDEMO: Columns: NAME CHAR (20) NAME2 TT_CHAR (20) NAME3 CHAR (10 CHAR) NAME4 NCHAR (10) NAME5 VARCHAR2 (20) INLINE NAME6 TT_VARCHAR (20) INLINE NAME7 NVARCHAR2 (20) INLINE 1 table found.
数値型では、正および負の固定小数点数と浮動小数点数、0(ゼロ)、無限大、および演算での未定義の結果として生成される値(NaN
(非数))が格納されます。
TimesTenは、正確な数値型と近似値型の両方のデータ型をサポートします。算術演算は数値型に対してのみ実行できます。同様に、SUM
集計およびAVG
集計でも数値型が必要になります。
NUMBER
データ型は、0(ゼロ)と、絶対値が1.0×10-130以上1.0×10126未満の範囲にある正と負の固定小数点数を格納します。NUMBER
の各値は5から22バイトである必要があります。
固定小数点数はNUMBER(
p,s
)
として指定します。
引数p
は精度(有効な10進数の総桁数)です。最上位桁は最も左にあるゼロ以外の桁で、最下位桁は最も右の既知の桁です。
引数s
はスケール(小数点から最下位桁までの桁数)です。スケールの範囲は-84から127です。
正のスケールは、小数点の右側にある最下位桁まで(最下位桁も含む)の有効桁数です。
スケールが負の場合、小数点の左側にある桁数です。この場合は最下位有効桁を含みません。スケールが負の場合、数値は整数部分の右から指定された桁数のみ丸められるため、最下位有効桁は小数点の左側になります。
スケールは、精度より大きくできます。たとえば、E表記法があります。スケールが精度より大きい場合、精度は小数点の右側の最大有効桁数を指定します。たとえば、列をNUMBER(4,5)
型として定義し、その列に.000127を挿入すると、その値は.00013として格納されます。小数点以下1桁目の数字はゼロである必要があります。TimesTenでは、値は小数点以下5桁に丸められます。
値が精度を超えると、エラーが戻されます。値がスケールを超えると、その値は丸められます。
NUMBER(
p
)
は、精度p
およびスケール0の固定小数点数を表すため、NUMBER(
p
,0)
と同じです。
浮動小数点数はNUMBER
として指定してください。精度およびスケールを指定しない場合は、最大精度および最大スケールが使用されます。
次の例では、NUMBER
データ型で定義され、異なる精度とスケールが指定された列col6
、col7
、col8
およびcol9
を追加することにより、表numerics
を変更します。
Command> ALTER TABLE numerics ADD col6 NUMBER;
Command> ALTER TABLE numerics ADD col7 NUMBER (4,2);
Command> ALTER TABLE numerics ADD col8 NUMBER (4,-2);
Command> ALTER TABLE numerics ADD col8 NUMBER (2,4);
Command> ALTER TABLE numerics ADD col9 NUMBER (2,4);
Command> DESCRIBE numerics;
Table USER1.NUMERICS:
Columns:
COL1 TT_TINYINT
COL2 TT_SMALLINT
COL3 TT_INTEGER
COL4 TT_INTEGER
COL5 TT_BIGINT
COL6 NUMBER
COL7 NUMBER (4,2)
COL8 NUMBER (4,-2)
COL9 NUMBER (2,4)
1 table found.
(primary key columns are indicated with *)
次の例では、表numbercombo
を作成し、異なる精度とスケールを指定したNUMBER
データ型で列を定義します。値123.89が列に挿入されます。
Command> CREATE TABLE numbercombo (col1 NUMBER, col2 NUMBER (3), col3 NUMBER (6,2), col4 NUMBER (6,1), col5 NUMBER (6,-2)); Command> DESCRIBE numbercombo; Table USER1.NUMBERCOMBO: Columns: COL1 NUMBER COL2 NUMBER (3) COL3 NUMBER (6,2) COL4 NUMBER (6,1) COL5 NUMBER (6,-2) 1 table found. (primary key columns are indicated with *) Command> INSERT INTO numbercombo VALUES (123.89,123.89,123.89,123.89,123.89); 1 row inserted. Command> VERTICAL ON; Command> SELECT * FROM numbercombo; COL1: 123.89 COL2: 124 COL3: 123.89 COL4: 123.9 COL5: 100 1 row found.
次の例では、表を作成し、NUMBER(4,2)
データ型で列を定義します。値123.89を挿入しようとすると、オーバーフローのエラーになります。
Command> CREATE TABLE invnumbervalue (col6 NUMBER (4,2)); Command> INSERT INTO invnumbervalue VALUES (123.89); 2923: Number type value overflow The command failed.
次の例では、表を作成し、精度より大きいスケールを使用したNUMBER
データ型で列を定義します。値が列に挿入されます。
Command> CREATE TABLE numbercombo2 (col1 NUMBER (4,5), col2 NUMBER (4,5), col3 NUMBER (4,5), col4 NUMBER (2,7), col5 NUMBER (2,7), col6 NUMBER (2,5), col7 NUMBER (2,5)); Command> INSERT INTO numbercombo2 VALUES (.01234, .00012, .000127, .0000012, .00000123, 1.2e-4, 1.2e-5); 1 row inserted. Command> DESCRIBE numbercombo2; Table USER1.NUMBERCOMBO2: Columns: COL1 NUMBER (4,5) COL2 NUMBER (4,5) COL3 NUMBER (4,5) COL4 NUMBER (2,7) COL5 NUMBER (2,7) COL6 NUMBER (2,5) COL7 NUMBER (2,5) 1 table found. (primary key columns are indicated with *) Command> SELECT * FROM numbercombo2; COL1: .01234 COL2: .00012 COL3: .00013 COL4: .0000012 COL5: .0000012 COL6: .00012 COL7: .00001 1 row found.
TT_BIGINT
データ型は、-9,223,372,036,854,775,808(-263)から9,223,372,036,854,775,807(263-1)の範囲の符号付き整数です。このデータ型で必要な記憶域は8バイトであるため、NUMBER
データ型よりサイズが小さくなります。また、NUMBER
データ型より高いパフォーマンスを提供します。BIGINT
は指定できません。
次の例では、表numerics
を変更し、BIGINT
データ型でcol5
を追加します。エラーが生成されます。2つ目のALTER TABLE
によって、TT_BIGINT
データ型でcol5
が追加されます。
Command> ALTER TABLE numerics ADD COLUMN col5 BIGINT; 3300: BIGINT is not a valid type name; use TT_BIGINT instead The command failed. Command> ALTER TABLE numerics ADD COLUMN col5 TT_BIGINT; Command> DESCRIBE numerics; Table USER1.NUMERICS: Columns: COL1 TT_TINYINT COL2 TT_SMALLINT COL3 TT_INTEGER COL4 TT_INTEGER COL5 TT_BIGINT 1 table found. (primary key columns are indicated with *)
TT_INTEGER
データ型は、-2,147,483,648(-231)から2,147,483,647(231 -1)の範囲の符号付き整数です。このデータ型で必要な記憶域は4バイトであるため、NUMBER
データ型よりサイズが小さくなります。また、NUMBER
データ型より高いパフォーマンスを提供します。TT_INTEGER
のかわりにTT_INT
を指定できます。INTEGER
またはINT
を指定すると、これらの型はNUMBER(38)
にマップされます。
次の例では、表numerics
を変更し、INT
データ型でcol3
を追加します。表の説明にデータ型がNUMBER(38)
であることが示されています。列col3
は削除されます。2つ目のALTER TABLE
によって、INTEGER
データ型でcol2
が追加されます。表の説明にデータ型がNUMBER(38)
であることが示されています。列col3
は削除されます。次に、データ型TT_INTEGER
およびTT_INT
で、列col3
およびcol4
が追加されます。表の説明に両方のデータ型がTT_INTEGER
であることが示されます。
Command> ALTER TABLE numerics ADD col3 INT; Command> DESCRIBE numerics; Table USER1.NUMERICS: Columns: COL1 TT_TINYINT COL2 TT_SMALLINT COL3 NUMBER (38) 1 table found. (primary key columns are indicated with *) Command> ALTER TABLE numerics col3; Command> ALTER TABLE numerics ADD col3 INTEGER; Command> DESCRIBE numerics; Table USER1.NUMERICS: Columns: COL1 TT_TINYINT COL2 TT_SMALLINT COL3 NUMBER (38) 1 table found. (primary key columns are indicated with *) Command> ALTER TABLE numerics col3; Command> ALTER TABLE numerics ADD COLUMN col3 TT_INTEGER; Command> DESCRIBE numerics; Table USER1.NUMERICS: Columns: COL1 TT_TINYINT COL2 TT_SMALLINT COL3 TT_INTEGER 1 table found. (primary key columns are indicated with *) Command> ALTER TABLE numerics ADD col4 TT_INT; Command> DESCRIBE numerics; Table USER1.NUMERICS: Columns: COL1 TT_TINYINT COL2 TT_SMALLINT COL3 TT_INTEGER COL4 TT_INTEGER 1 table found. (primary key columns are indicated with *)
TT_SMALLINT
データ型は、-32,768(-215)から32,767(215-1)の範囲の符号付き整数です。このデータ型で必要な記憶域は2バイトであるため、NUMBER
データ型よりサイズが小さくなります。また、NUMBER
データ型より高いパフォーマンスを提供します。SMALLINT
データ型は、指定することはできますが、NUMBER(38)
にマップされます。
次の例では、表numerics
を変更し、SMALLINT
データ型でcol2
を追加します。表の説明にデータ型がNUMBER(38)
であることが示されています。列col2
は削除されます。2つ目のALTER TABLE
によって、TT_SMALLINT
データ型でcol2
が追加されます。
Command> ALTER TABLE numerics ADD COLUMN col2 SMALLINT; Command> DESCRIBE Numerics; Table USER1.NUMERICS: Columns: COL1 TT_TINYINT COL2 NUMBER (38) 1 table found. (primary key columns are indicated with *) Command> ALTER TABLE numerics COLUMN col2; Command> ALTER TABLE numerics ADD COLUMN col2 TT_SMALLINT; Command> DESCRIBE numerics; Table USER1.NUMERICS: Columns: COL1 TT_TINYINT COL2 TT_SMALLINT 1 table found. (primary key columns are indicated with *)
TT_TINYINT
データ型は、0から255(28-1)の範囲の符号なし整数です。このデータ型で必要な記憶域は1バイトであるため、NUMBER
データ型よりサイズが小さくなります。また、NUMBER
データ型より高いパフォーマンスを提供します。TT_TINYINT
を否定するデータ型はTT_SMALLINT
です。また、TINYINT
を指定することはできません。
次の例では、col1
という列をデータ型TINYINT
で定義するnumerics
という表を最初に作成します。エラーが戻されます。その後、データ型TT_TINYINT
で列を再定義します。
Command> CREATE TABLE numerics (col1 TINYINT); 3300: TINYINT is not a valid type name; useTT_TINYINT
instead The command failed. Command> CREATE TABLE numerics (col1TT_TINYINT
); Command> DESCRIBE numerics; Table USER1.NUMERICS: Columns: COL1 TT_TINYINT 1 table found. (primary key columns are indicated with *)
浮動小数点数には、小数点を含めることも、含めないこともできます。また、浮動小数点数の範囲は、指数を使用して拡張することができます(たとえば、1.2E-20などです)。
浮動小数点数ではスケールを使用しません。これは、小数点の後に表示できる桁数が制限されていないためです。
バイナリの浮動小数点数は、バイナリ精度(数字0と1)を使用して格納されます。NUMBER
データ型の場合は、10進数の精度(数字0から9)を使用して格納されます。
NUMBER
でサポートされている範囲と精度内にあるリテラル値は、NUMBER
として格納されます。これは、リテラルが10進数の精度を使用して表されるためです。
浮動小数点数には、次のいずれかのデータ型を使用します。
BINARY_DOUBLE
は、64ビット倍精度の浮動小数点数です。
BINARY_FLOAT
およびBINARY_DOUBLE
はいずれも、特別な値であるInf
、-Inf
およびNaN
(非数)をサポートし、IEEE標準に準拠しています。
浮動小数点数の制限は次のとおりです。
BINARY_FLOAT
正の最小有限値: 1.17549E-38F
正の最大有限値: 3.40282E+38F
BINARY_DOUBLE
正の最小有限値: 2.22507485850720E-308
正の最大有限値: 1.79769313486231E+308
次の例では表を作成し、BINARY_FLOAT
およびBINARY_DOUBLE
データ型で2つの列を定義します。
Command> CREATE TABLE BfBd (Col1 BINARY_FLOAT
, Col2 BINARY_DOUBLE);
Command> DESCRIBE BfBd;
Table UISER1.BFBD:
Columns:
COL1 BINARY_FLOAT
COL2 BINARY_DOUBLE
1 table found.
(primary key columns are indicated with *)
BINARY
データ型は、長さがn
バイトの固定長のバイナリ値(n
の値の範囲は1から8300バイト)です。BINARY
データ型にはn
バイトの記憶域が必要です。データは後続の0(ゼロ)を使用してその列の最大長まで調整されます。ゼロ埋め比較セマンティクスが使用されます。
VARBINARY
データ型は、最大長がn
バイトの可変長のバイナリ値(n
の値は1から4,194,304(222)バイト)です。
次の例では表を作成し、2つの列(データ型BINARY
で定義されるcol1
とデータ型VARBINARY
で定義されるcol2
)を定義します。次に、各列にバイナリ・データが挿入されます。BINARY
値では、右側にゼロが埋め込まれることに注意してください。
Command> CREATE TABLE bvar (col1 BINARY (10), col2 VARBINARY (10)); Command> DESCRIBE bvar; Table USER1.BVAR: Columns: COL1 BINARY (10) COL2 VARBINARY (10) INLINE 1 table found. (primary key columns are indicated with *) Command> INSERT INTO bvar (col1, col2) VALUES (0x4D7953514C, 0x39274D); 1 row inserted. Command> SELECT * FROM bvar; < 4D7953514C0000000000, 39274D > 1 row found.
式の結果の型は、型の優先順位が最も高いオペランドにより決定されます。数値の優先順位は次のとおりです(高い順位から低い順位へ)。
BINARY_DOUBLE
BINARY_FLOAT
NUMBER
TT_BIGINT
TT_INTEGER
TT_SMALLINT
TT_TINYINT
たとえば、TT_INTEGER
とBINARY_FLOAT
値の合計は、BINARY_FLOAT
のほうが数値の優先順位が高いため、BINARY_FLOAT
型になります。同様に、NUMBER
とBINARY_DOUBLE
値の積はBINARY_DOUBLE
型になります。
LOBデータ型は、TimesTen Scaleoutではサポートされていません。
ラージ・オブジェクト(LOB)データ型では、テキスト、イメージ、ビデオ、空間データなどの、サイズの大きい非構造化データを格納できます。LOBには、BLOB
、CLOB
およびNCLOB
データ型があります。
LOBデータ型の列では、データの挿入や更新を行うことができます。更新操作では、EMPTY_CLOB
またはEMPTY_BLOB
を使用してLOB値をNULL
、つまり空の値に設定したり、LOB全体を新しいデータに置き換えることができます。別のLOB値でLOB値を更新できます。LOB列が含まれている行を削除すると、LOB値も削除されます。
LOBデータ型のセマンティクスは、次のSQLセマンティクスと似ています。
BLOB
データ型はSQL VARBINARY
セマンティクスを使用します。
CLOB
データ型はSQL VARCHAR2
セマンティクスを使用します。
NCLOB
データ型はSQL NVARCHAR2
セマンティクスを使用します。
次のSQL文、演算子および関数は、1つ以上のLOBデータ型を引数として受け入れます。
SQL文: CREATE TABLE
、SELECT
、INSERT
およびUPDATE
演算子: LIKE
およびIS [NOT] NULL
関数: ASCIISTR
、CONCAT
、INSTR
、INSTRB
、INSTR4
、LENGTH
、LENGTHB
、LOWER
、LPAD
、NLSSORT
、NVL
、TRIM
、LTRIM
、RTRIM
、SUBSTR
、SUBSTRB
、SUBSTR4
、REPLACE
、RPAD
、SOUNDEX
、TO_DATE
、TO_NUMBER
、TO_CHAR
およびUPPER
説明
LOB列は常に表外に保存されるため、LOB列の宣言時にはINLINE
属性を使用できません。
1つの表内に複数のLOBデータ型の列を定義できます。
LOB列で主キーを作成できません。LOB列には索引を定義できません。
ディテール表にLOB列が含まれている場合は、マテリアライズド・ビューを作成できません。
SQLに加えて、PL/SQL、ODBC、JDBC、OCIおよびPRO*C/C++でLOB固有のAPIを使用してLOBを作成および更新できます。これらのAPIの詳細は、該当するTimesTenの開発者ガイドを参照してください。
次の各項では、各LOBデータ型についてさらに詳しく説明します。
さらに、次の各項では、LOB全般に関する詳細情報も示します。
バイナリLOB(BLOB
)データ型は、構造化されていないバイナリ・ラージ・オブジェクトを格納するために使用します。BLOB
データの最大サイズは16MBです。
列でBLOB
を定義する場合、VARBINARY
やその他の可変長データ型の場合とは異なり、最大文字数は定義しません。かわりに、この列では次を定義します。
Command> CREATE TABLE blob_content (id NUMBER PRIMARY KEY, blob_column BLOB );
BLOB
を操作するために、次の関数が提供されます。
BLOB
を初期化する方法には、空のBLOB
を初期化するためのEMPTY_BLOB
関数を含む、2つの方法があります。BLOB
の初期化の詳細は、「LOBの初期化」を参照してください。空のLOBとNULL
のLOBとの違いの詳細は、「NULLのLOBと空のLOBの違い」を参照してください。
バイナリ値をBLOB
に変換するには、TO_LOB
またはTO_BLOB
関数を使用します。詳細は、「TO_BLOB」および「TO_LOB」を参照してください。
キャラクタLOB(CLOB
)データ型は、シングルバイト・キャラクタ・データおよびマルチバイト・キャラクタ・データを格納するために使用します。CLOB
データの最大サイズは4MBです。CLOB
に格納できる最大文字数は、シングルバイト文字セットまたはマルチバイト文字セットのいずれを使用しているかによって異なります。
列でCLOB
を定義する場合、VARCHAR
やその他の可変長データ型の場合とは異なり、最大文字数は定義しません。かわりに、この列では次を定義します。
Command> CREATE TABLE clob_content (id NUMBER PRIMARY KEY, clob_column CLOB );
CLOB
を操作するために、次の関数が提供されます。
CLOB
を初期化する方法には、空のCLOB
を初期化するためのEMPTY_CLOB
関数を含む、2つの方法があります。CLOB
の初期化の詳細は、「LOBの初期化」を参照してください。空のLOBとNULL
のLOBとの違いの詳細は、後述の「NULLのLOBと空のLOBの違い」を参照してください。
文字列をCLOB
に変換するには、TO_LOB
またはTO_CLOB
関数を使用します。詳細は、「TO_CLOB」および「TO_LOB」を参照してください。
各国語キャラクタLOB(NCLOB
)データ型は、Unicodeデータを格納するために使用します。NCLOB
データの最大サイズは4MBです。
列でNCLOB
を定義する場合、VARCHAR
やその他の可変長データ型の場合とは異なり、最大文字数は定義しません。かわりに、この列では次を定義します。
Command> CREATE TABLE nclob_content (id NUMBER PRIMARY KEY, nclob_column NCLOB );
NCLOB
データ型では、次の関数がサポートされます。
NCLOB
を初期化する方法には、空のNCLOB
を初期化するためのEMPTY_CLOB
関数を含む、2つの方法があります。NCLOB
の初期化の詳細は、「LOBの初期化」を参照してください。空のLOBとNULL
のLOBとの違いの詳細は、この直後の「NULLのLOBと空のLOBの違い」を参照してください。
文字列をNCLOB
に変換するには、TO_LOB
またはTO_CLOB
関数を使用します。詳細は、「TO_CLOB」および「TO_LOB」を参照してください。
NULL
のLOBは、空のLOBとは意味が異なります。
NULL
のLOBはNULL
の値を持つため、NULL
のLOBをリクエストするとNULLが返されます。
空のLOBは、EMPTY_CLOB
またはEMPTY_BLOB
関数により初期化されます。これらの関数はLOBを初期化して、長さが0(ゼロ)のNULL
以外の値にします。EMPTY_CLOB
またはEMPTY_BLOB
関数を使用して、NULL値不可列でLOBを初期化することもできます。
次の2つの方法のいずれかにより、LOBを初期化できます。
EMPTY_BLOB
またはEMPTY_CLOB
関数を使用して、BLOB
、CLOB
またはNCLOB
列に空のLOBを挿入できます。これは、データがないが、データの準備用にLOBを作成する場合に役立ちます。NULL値不可のLOB列を初期化する場合にも有用です。
データを直接挿入することにより、LOBを初期化します。EMPTY_BLOB
またはEMPTY_CLOB
関数を使用してLOBを初期化する必要はなく、単にデータを直接挿入できます。
次に、各タイプの初期化の例を示します。
次の例に示すように、EMPTY_CLOB
関数を使用してLOBを初期化できます。
Command> INSERT INTO clob_content (id, clob_column) VALUES (1, EMPTY_CLOB( ) ); 1 row inserted.
次の例に示すように、データを直接挿入して、LOBを初期化できます。
Command> INSERT INTO clob_content(id, clob_column) VALUES (4, 'Demonstration of the LOB initialization.'); 1 row inserted.
次の例に示すように、UPDATE
文を使用して、既存のLOB値を初期化または更新できます。
Command> UPDATE blob_content SET blob_column = 0x000AF4511 WHERE id = 1; 1 row updated. Command> SELECT * FROM blob_content; < 1, 0000AF4511 > 1 rows found. Command> UPDATE clob_content SET clob_column = 'Demonstration of the CLOB data type ' WHERE id = 1; 1 row updated. Command> SELECT * FROM clob_content; < 1, Demonstration of the CLOB data type >
ROWID
データ型は、TimesTen Scaleoutではサポートされていません。表またはマテリアライズド・ビューの行のアドレスは、行ID (ROWID)と呼ばれます。行IDのデータ型はROWID
です。ROWIDは、ROWID
擬似列を問い合せることで確認できます。ROWID疑似列の詳細は、「ROWID」
を参照してください。
SQL文では、リテラルのROWID
値は、次のように一重引用符で囲んだ定数として指定してください。
Command> SELECT ROWID, last_name FROM employees WHERE department_id = 20; < BMUFVUAAACOAAAALhM, Hartstein > < BMUFVUAAACOAAAAMhM, Fay > 2 rows found. Command> SELECT ROWID, last_name FROM employees WHERE ROWID='BMUFVUAAACOAAAALhM'; < BMUFVUAAACOAAAALhM, Hartstein > 1 row found.
ROWID
データ型を次のように使用します。
表の列またはマテリアライズド・ビューの列のデータ型として使用できます。
ORDER BY
句およびGROUP BY
句で使用できます。
INSERT...SELECT
文で使用できます。次の例では、列col1
はROWID
データ型で定義されています。
Command> DESCRIBE master; Table MYUSER.MASTER: Columns: *ID ROWID NOT NULL NAME CHAR (30) 1 table found. (primary key columns are indicated with *) Command> INSERT INTO master(id, name) SELECT ROWID, last_name FROM employees; 107 rows inserted. Command> SELECT * FROM master; < BMUFVUAAACOAAAAGhG, King > < BMUFVUAAACOAAAAHhG, Kochhar > < BMUFVUAAACOAAAAIhG, De Haan > ... 107 rows found.
次に示すように、TO_CHAR
関数をROWID
擬似列で使用できます。
Command> INSERT INTO master(id, name) SELECT TO_CHAR(ROWID), last_name FROM employees; 107 rows inserted. Command> SELECT * FROM master; < BMUFVUAAACOAAAAGhG, King > < BMUFVUAAACOAAAAHhG, Kochhar > ... 107 rows found.
次に示すように、CAST
関数をROWID
擬似列で使用できます。
Command> CREATE TABLE master (id CHAR(20) NOT NULL PRIMARY KEY, name CHAR(30)); Command> INSERT INTO master(id, name) SELECT CAST(ROWID AS CHAR(20)), last_name FROM employees; 107 rows inserted.
暗黙的な型変換は、値の割当てと、ROWID
データとCHAR
データ間またはROWID
データとVARCHAR2
データ間の比較処理でサポートされています。
CHAR
、VARCHAR2
およびROWID
のオペランドがCOALESCE
、DECODE
、NVL
またはCASE
式(「CASE式」を参照)で組み合せて使用されている場合、結果のデータ型はROWID
になります。CHAR
値およびVARCHAR2
値を使用した式は、ROWID
値に変換されて式が評価されます。
CONCAT
などの文字列関数でROWID
値を使用するには、アプリケーションでSQL TO_CHAR
関数を使用して
ROWID値を明示的にCHAR
値に変換する必要があります。
日時データ型には次のものがあります。
DATE
値の書式はYYYY-MM-DD HH:MI:SS
で、範囲は-4712-01-01(紀元前4712年1月1日)から9999-12-31(西暦9999年12月31日)です。小数秒はありません。DATE
型では7バイトの記憶域が必要です。
TimesTenでは、ユーザー指定のNLS_DATE_FORMAT
設定はサポートされていません。SQL TO_CHAR
およびTO_DATE
関数を使用して、他の形式を指定できます。
TIMESTAMP
値の書式は、YYYY-MM-DD HH:MI:SS [.FFFFFFFFF]
です。小数秒の精度の範囲は0(ゼロ)から9です。デフォルトは6です。日付の範囲は-4712-01-01(紀元前4712年1月1日)から9999-12-31(西暦9999年12月31日)までです。TIMESTAMP
型では12バイトの記憶域が必要です。TIMESTAMP
型は日付の範囲が広く、TT_TIMESTAMP
より高い精度をサポートします。
TimesTenでは、ユーザー指定のNLS_TIMESTAMP_FORMAT
設定はサポートされていません。SQLのTO_CHAR
およびTO_DATE
関数を使用すると、その他の書式を指定できます。
TT_DATE
値の書式はYYYY-MM-DD
で、範囲は1753-01-01(西暦1753年1月1日)から9999-12-31(西暦9999年12月31日)です。TT_DATE
データ型では4バイトの記憶域が必要です。
この項の内容は次のとおりです。
TimesTenの時間隔型は、定数で指定する場合または式の中間結果を表す場合でのみ使用できます。時間隔型は最終結果に使用することはできません。列に時間隔型を定義することはできません。「データ型の仕様」を参照してください。
時間隔である単一フィールドのリテラルを式に指定することはできますが、時間隔データ型を戻す完結した式は指定できません。時間隔の結果から必要な要素を抽出するには、かわりにEXTRACT
関数を使用する必要があります。
TimesTenでは、次の形式の時間隔リテラルがサポートされています。
INTERVAL [+/-]
CharString
IntervalQualifier
この項では、DATE
、TIME
およびTIMESTAMP
の各データ型の例を示します。
DATE
型のdcol
列とTIME
型のtcol
列を含む、sample
という名前の表を作成するには、次を使用します。
CREATE TABLE sample (tcol TIME, dcol DATE);
sample
表にDATE
とTIME
の値を挿入する構文は、次のとおりです。
INSERT INTO sample VALUES (TIME '12:00:00', DATE '1998-10-28');
sample
表の、1998年10月29日の正午から午後4時までの行をすべて選択する構文は、次のとおりです。
SELECT * FROM sample WHERE dcol = DATE '1998-10-29' AND tcol BETWEEN TIME '12:00:00' AND TIME '16:00:00';
TIMESTAMP
データ型のtscol
列を含む、sample2
という名前の表を作成して、1998年10月29日の正午から午後4時までの行をすべて選択するには、次の文を使用します。
CREATE TABLE sample2 (tscol TIMESTAMP); INSERT INTO sample2 VALUES (TIMESTAMP '1998-10-28 12:00:00'); SELECT * FROM sample2 WHERE tscol BETWEEN TIMESTAMP '1998-10-29 12:00:00' AND '1998-10-29 16:00:00';
ノート: TIME 、DATE およびTIMESTAMP 型については、リテラルと文字列の両方の書式を使用できます。たとえばTIME の値は、timestring ('12:00:00') およびtimeliteral (TIME '16:00:00') の両方の書式で指定できます。TimesTenでは、最初の値をCHAR 型として読み取り、後で必要に応じてTIME 型に変換します。2番目の値はTIME として読み取ります。前述の例では、リテラル書式を使用しています。マイクロ秒に満たない端数は、「Data truncated」 エラーになります。 |
TimesTenでは、TIMEZONE
はサポートされません。TIME
およびTIMESTAMP
データ型値は、時差の調整を行わずに格納されます。アプリケーションでは、あるタイムゾーンを想定し、データベースに値を送信する前に、TIME
およびTIMESTAMP
をそのタイムゾーンに変換する必要があります。たとえば、アプリケーションでタイムゾーンを太平洋標準時間と想定します。アプリケーションで太平洋夏時間または東部標準時間のTIME
およびTIMESTAMP
値を使用している場合は、TIME
およびTIMESTAMP
を太平洋標準時間に変換する必要があります。
日付、タイムスタンプおよび時間隔データで算術演算を実行できます。TimesTenでは、次のルールに従って結果が計算されます。
DATE
またはTIMESTAMP
値に数値を加算、またはそこから数値を減算できます。TimesTenでは内部的にTIMESTAMP
値をDATE
値に変換します。
TT_DATE
またはTT_TIMESTAMP
値に数値を加算、またはそこから数値を減算でき、結果として得られる値はそれぞれTT_DATE
またはTT_TIMESTAMP
になります。
数値は日数として扱われます。たとえば、SYSDATE
+ 1は、明日になります。SYSDATE
- 7は、1週間前になります。
2つの日付列の減算により、2つの日付間の日数が得られます。戻り型は数値です。
日付値の加算はできません。日付値またはタイムスタンプ値の乗算や除算はできません。
表1-4に、日時の演算処理のマトリックスを示します。
表1-4 DateTime算術演算
DATE | TT_DATE | TIMESTAMP | TT_TIMESTAMP | NUMERIC | INTERVAL | |
---|---|---|---|---|---|---|
DATE |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
+(プラス) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
DATE |
DATE |
-(マイナス) |
NUMBER |
NUMBER |
INTERVAL |
INTERVAL |
DATE |
DATE |
*(乗算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
/(除算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
TT_DATE |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
+(プラス) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
TT_DATE |
TT_DATE |
-(マイナス) |
NUMBER |
TT_BIGINT |
INTERVAL |
INTERVAL |
TT_DATE |
TT_DATE |
*(乗算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
/(除算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
TIMESTAMP |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
+(プラス) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
DATE |
TIMESTAMP |
-(マイナス) |
INTERVAL |
INTERVAL |
INTERVAL |
INTERVAL |
DATE |
TIMESTAMP |
*(乗算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
/(除算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
TT_TIMESTAMP |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
+(プラス) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
TT_TIMESTAMP |
TT_TIMESTAMP |
-(マイナス) |
INTERVAL |
INTERVAL |
INTERVAL |
INTERVAL |
TT_TIMESTAMP |
TT_TIMESTAMP |
*(乗算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
/(除算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
NUMERIC |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
+(プラス) |
DATE |
TT_DATE |
DATE |
TT_TIMESTAMP |
なし |
サポートなし |
-(マイナス) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
なし |
サポートなし |
*(乗算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
なし |
INTERVAL |
/(除算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
なし |
サポートなし |
INTERVAL |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
+(プラス) |
DATE |
TT_DATE |
TIMESTAMP |
TT_TIMESTAMP |
サポートなし |
INTERVAL |
-(マイナス) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
INTERVAL |
*(乗算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
INTERVAL |
サポートなし |
/(除算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
INTERVAL |
サポートなし |
SELECT tt_date1 - tt_date2 FROM t1; SELECT EXTRACT(DAY FROM timestamp1-timestamp2) FROM t1; SELECT * FROM t1 WHERE timestamp1 - timestamp2 = NUMTODSINTERVAL(10, 'DAY'); SELECT SYSDATE + NUMTODSINTERVAL(20,'SECOND') FROM dual; SELECT EXTRACT (SECOND FROM timestamp1-timestamp2) FROM dual; /* select the microsecond difference between two timestamp values d1 and d2 */ SELECT 1000000*(EXTRACT(DAY FROM d1-d2)*24*3600+ EXTRACT(HOUR FROM d1-d2)*3600+ EXTRACT(MINUTE FROM d1-d2)*60+EXTRACT(SECOND FROM d1-d2) FROM d1;
この例では、2つの列にTIMESTAMP
値を挿入してから、EXTRACT
関数を使用してそれらの2つの値を減算します。
Command> CREATE TABLE ts (id TIMESTAMP, id2 TIMESTAMP); Command> INSERT INTO ts VALUES (TIMESTAMP '2007-01-20 12:45:23', TIMESTAMP '2006-12-25 17:34:22'); 1 row inserted. Command> SELECT EXTRACT (DAY FROM id - id2) FROM ts; < 25 > 1 row found.
次の問合せでは、エラーが戻されます。結果がINTERVALとなるSELECT文は実行できません。
SELECT timestamp1 - timestamp2 FROM t1;
INTERVAL YEAR TO MONTH
とINTERVAL DAY TO SECOND
は比較できません。
SELECT * FROM t1 WHERE timestamp1 - timestamp2 = NUMTOYMINTERVAL(10, 'YEAR');
INTERVAL DAY TO SECOND
とINTERVAL DAY
は比較できません。
SELECT * FROM t1 WHERE timestamp1 - timestamp2 = INTERVAL '10' DAY;
INTERVAL DAY TO SECOND
からYEAR
を抽出することはできません。
SELECT EXTRACT (YEAR FROM timestamp1 - timestamp2) FROM dual;
日時および時間隔の算術演算を実行する場合、次の制限を考慮してください。
INTERVAL YEAR
とINTERVAL MONTH
に対してDATE
およびTIMESTAMP
型を使用した加算または減算の結果は終了しません。たとえば、DATE
またはTIMESTAMP
の2004-02-29に1年を追加すると、2005年2月29日は存在しないため(2005年はうるう年ではありません)、日付算術エラー(TimesTenエラー2787)になります。INTERVALの1
月をDATEの2005-01-30
に追加すると、2月に30日はないため同じエラーになります。
結果はINTERVAL DAY
に対して終了します。
時間隔データ型は、完結した式の最終結果に使用することはできません。時間隔の結果から必要な要素を抽出するには、EXTRACT
関数を使用する必要があります。
宣言された列の長さが128バイトより大きい可変長の列は表外に保存されます。宣言された列の長さが128バイト以下の可変長の列は、表内に保存されます。すべてのLOBデータ型は表外に保存されます。
文字セマンティクスの場合、表外に保存されるバイトの数は文字セットによって異なります。たとえば、文字ごとに4バイトが必要な文字セットでは、宣言された列の長さが32(128/4)より大きい可変長の列は表外に保存されます。
表1-5に、データ型別の記憶域要件を示します。
表1-5 データ型別の記憶域要件
データ型 | 必要な記憶域 |
---|---|
|
|
8バイト |
|
4バイト |
|
文字セマンティクスを使用する場合、列長( |
|
7バイト |
|
TimesTenでは、時間隔型を格納することはできません。 |
|
必要なバイト数は2× |
|
5から22バイト |
|
2×(値の長さ)+24バイト(最小40バイト)。
2×(列の長さ)+8バイト。 |
|
12バイト |
|
12バイト |
|
8バイト |
|
4バイト |
|
4バイト |
|
2バイト |
|
8バイト |
|
8バイト |
|
1バイト |
|
値の長さ+24バイト(最小40バイト)。
列の長さ+ 8バイト。 |
|
値の長さ+24バイト(最小40バイト)。 この記憶域の原則は、すべての可変長
n + 8バイト。 文字セマンティクスを使用する場合、列長( |
|
値の長さ+48バイト(最小56バイト) |
|
2×(値の長さ)+48バイト(最小56バイト) |
この項では、TimesTenで各データ型の値を比較する方法について説明します。
新しい日付の方が古い日付より大きいとみなされます。たとえば、'10-AUG-2005'に相当する日付は、'30-AUG-2006'に相当する日付よりも小さく、'30-AUG-2006 1:15 pm'は、'30-AUG-2006 10:10 am'より大きくなります。
文字値は、次の方法で比較されます。
バイナリ・ソートでは、データベース文字セットでの文字の数値コードの連結値に従って文字列が比較されます。文字セット内のある文字の数値がもう一方の文字の数値より大きい場合、その文字がもう一方の文字より大きいと判断されます。空白はすべての文字より小さくなります。
言語ソートは、数値コードのバイナリ順序が、比較している文字の言語順序と一致しない場合に役立ちます。言語ソートでは、NLS_SORT
によって設定された言語ルールに基づいて、SQLソートおよびSQL比較が行われます。言語ソートの詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の言語ソートに関する説明を参照してください。
デフォルトはバイナリ・ソートです。
空白埋め比較セマンティクスを使用している場合に2つの値の長さが異なると、両方が同じ長さになるまで短い方の値に空白が追加されます。その後、最初の異なる文字が検出されるまで1文字ずつ値が比較されます。この最初の違いが検出された位置で、より大きな文字を持つ値が、大きい方の値とみなされます。2つの値に異なる文字がない場合、これらは同等であるとみなされます。つまり、2つの値の違いが後続の空白の数のみである場合、これらの値は同等であるとみなされます。
空白埋め比較セマンティクスは、比較対象の両方の値がCHAR
型またはNCHAR
型の式あるいはテキスト・リテラルである場合に使用します。
非空白埋め比較セマンティクスを使用している場合、最初の異なる文字が検出されるまで2つの値が1文字ずつ比較されます。この最初に違いが検出された位置で、より大きな文字を持つ値が、大きい方の値とみなされます。長さが異なる2つの値が短い方の値の最後まで同じである場合は、長い方が大きい値とみなされます。長さが同じ2つの値に異なる文字がない場合、これらは同等であるとみなされます。
非空白埋め比較セマンティクスは、比較対象の両方の値にVARCHAR2
型またはNVARCHAR2
型が使用されている場合に使用します。
空白埋め比較セマンティクスを使用した場合の例は、次のとおりです。
'a ' = 'a'
非空白埋め比較セマンティクスを使用した場合の例は、次のとおりです。
'a ' > 'a'
通常、1つの式に異なるデータ型の値を使用することはできません。ただし、TimesTenでは、データ型間の暗黙的および明示的な変換の両方がサポートされています。暗黙的な変換のアルゴリズムは、ソフトウェア・リリースの変更によって変更されることがあり、明示的な変換を指定しておくと、その動作は将来的にも確実になるため、明示的な変換をお薦めします。
あるデータ型から別のデータ型への変換が適切である場合、TimesTenは値を変換します。
表1-6および表1-7に、TimesTenの暗黙的なデータ型変換をマトリックスで示します。セル内のYES
は、その変換がサポートされていることを示します。セル内のNO
は、その変換がサポートされていないことを示します。表の後に、暗黙的な変換のルールを示します。
表1-6 暗黙的なデータ型変換
CHAR | VARCHAR2 | NCHAR | NVARCHAR2 | DATE | TT_DATE | TIMESTAMP | TT_TIMESTAMP | |
---|---|---|---|---|---|---|---|---|
CHAR |
該当なし |
YES |
YES |
YES |
YES |
YES |
YES |
YES |
VARCHAR2 |
YES |
該当なし |
YES |
YES |
YES |
YES |
YES |
YES |
NCHAR |
YES |
YES |
該当なし |
YES |
YES |
YES |
YES |
YES |
NVARCHAR2 |
YES |
YES |
YES |
該当なし |
YES |
YES |
YES |
YES |
DATE |
YES |
YES |
YES |
YES |
該当なし |
YES |
YES |
YES |
TT_DATE |
YES |
YES |
YES |
YES |
YES |
該当なし |
YES |
YES |
TIMESTAMP |
YES |
YES |
YES |
YES |
YES |
YES |
該当なし |
YES |
TT_TIMESTAMP |
YES |
YES |
YES |
YES |
YES |
YES |
YES |
該当なし |
NUMERIC |
YES |
YES |
YES |
YES |
NO |
NO |
NO |
NO |
BLOB |
NO |
NO |
NO |
NO |
NO |
NO |
NO |
NO |
CLOB |
YES |
YES |
YES |
YES |
NO |
NO |
NO |
NO |
NCLOB |
YES |
YES |
YES |
YES |
NO |
NO |
NO |
NO |
BINARY/ VARBINARY |
YES |
YES |
YES |
YES |
NO |
NO |
NO |
NO |
ROWID |
YES |
YES |
YES |
YES |
NO |
NO |
NO |
NO |
表1-7 暗黙的なデータ型変換(前の表の続き)
NUMERIC | BLOB | CLOB | NCLOB | BINARY/ VARBINARY | ROWID | |
---|---|---|---|---|---|---|
CHAR |
YES |
YES |
YES |
YES |
YES |
YES |
VARCHAR2 |
YES |
YES |
YES |
YES |
YES |
YES |
NCHAR |
YES |
YES |
YES |
YES |
YES |
YES |
NVARCHAR2 |
YES |
YES |
YES |
YES |
YES |
YES |
DATE |
NO |
NO |
NO |
NO |
NO |
NO |
TT_DATE |
NO |
NO |
NO |
NO |
NO |
NO |
TIMESTAMP |
NO |
NO |
NO |
NO |
NO |
NO |
TT_TIMESTAMP |
NO |
NO |
NO |
NO |
NO |
NO |
NUMERIC |
該当なし |
NO |
NO |
NO |
NO |
NO |
BLOB |
NO |
該当なし |
NO |
NO |
YES |
NO |
CLOB |
NO |
NO |
該当なし |
YES |
NO |
NO |
NCLOB |
NO |
NO |
YES |
該当なし |
NO |
NO |
BINARY/ VARBINARY |
NO |
YES |
YES |
YES |
該当なし |
NO |
ROWID |
NO |
NO |
NO |
NO |
NO |
該当なし |
次のルールが適用されます。
文字データ型と非文字データ型に対する算術演算および比較中に、TimesTenはすべての文字データ型を数値または日時のいずれかの適切なデータ型に変換します。CHAR
/VARCHAR2
とNCHAR
/NVARCHAR2
の算術演算では、TimesTenはNUMBER
に変換します。
算術演算では、文字値を数値に変換する場合、浮動小数点値INF
およびNAN
はサポートされません。
連結操作では、TimesTenにより、他のオペランドに応じて、文字データ型以外のデータ型がCHAR
、NCHAR
、VARCHAR2
またはNVARCHAR2
に変換されます。
数値と文字値を比較する場合、TimesTenは文字データを数値に変換します。
数値と日時値を比較する場合、TimesTenは文字データを日時値に変換します。
タイムスタンプ値からDATE
値への変換では、タイムスタンプ値の秒の小数部は切り捨てられます。
BINARY_FLOAT
からBINARY_DOUBLE
への変換は正確に行われます。
BINARY_DOUBLE
の値がBINARY_FLOAT
でサポートされている精度のビット数よりも多いビット数を使用している場合、BINARY_DOUBLE
からBINARY_FLOAT
への変換は正確に行われません。
文字値または正確な数値(TT_TINYINT
、TT_SMALLINT
、TT_INTEGER
、TT_BIGINT
、NUMBER
)と浮動小数点値(BINARY_FLOAT
、BINARY_DOUBLE
)間で変換を行うと、不正確になる場合があります。これは、文字値および正確な数値では10進数の精度が使用され、浮動小数点数ではバイナリ精度が使用されるためです。
数値を操作する際、TimesTenは、通常、最大容量を確保するために精度およびスケールを調整します。この場合、このような操作によって変換された数値データ型は、基礎となる表に含まれる数値データ型と異なることがあります。
代入を実行する場合、TimesTenは等号(=)の右側の値を左側の代入ターゲットのデータ型に変換します。
SQL関数または演算子に不当なデータ型の引数を指定して使用する場合、TimesTenで暗黙的な変換がサポートされていれば、その引数を正当なデータ型に変換します。
INSERT
、INSERT... SELECT
およびUPDATE
操作中に、TimesTenは変更する列のデータ型に値を変換します。
CHAR
/VARCHAR2
とNCHAR
/NVARCHAR2
間の暗黙的および明示的な変換がサポートされます。暗黙的な変換の例を次に示します。
Command> CREATE TABLE convdemo (c1 CHAR (10), x1 TT_INTEGER); Command> CREATE TABLE convdemo2 (c1 NCHAR (10), x2 TT_INTEGER); Command> INSERT INTO convdemo VALUES ('ABC', 10); 1 row inserted. Command> INSERT INTO convdemo VALUES ('def', 100); 1 row inserted. Command> INSERT INTO convdemo2 SELECT * FROM convdemo; 2 rows inserted. Command> SELECT x1,x2,convdemo.c1, convdemo2.c1 FROM convdemo, convdemo2 WHERE Convdemo.c1 = convdemo2.c1; X1, X2, C1, C1 < 10, 10, ABC , ABC > < 100, 100, def , def > 2 rows found.
NULL
値は値がないことを示します。これは、存在しない値のプレースホルダとして使用されます。実際のデータ値が不定または値に意味がない場合に、NULL
を使用してください。NULL
は値0(ゼロ)と同じではないため、0(ゼロ)の数値を表すためにNULL値を使用しないでください。式内のパラメータには、そのデータ型に関係なく、NULL
を含めることができます。さらに、表の作成時に列にNOT NULL
またはPRIMARY KEY
整合性制約を指定している場合を除き、表内のすべての列にはそのデータ型に関係なくNULL
を含めることができます。
NULL
の次の特性は、行、パラメータ、ローカル変数の処理に影響します。
デフォルトでは、NULL
はソートにおいて最も優先順位が高い値としてソートされます。ただし、ORDER BY
句でNULLS FIRST
またはNULLS LAST
を使用して、NULL
のソート順序値を変更できます。
GROUP BY
またはSELECT DISTINCT
の演算を除き、2つのNULL
値は非等価です。
NULL
を含む算術式は、NULL
に評価されます。実際、オペランドにNULL
を指定した場合、(連結演算子を除く)すべての演算子はNULL
を戻します。たとえば、(5-col)
のcol
がNULL
の場合、NULL
と評価されます。
NULL
を検査するには、比較条件IS NULL
またはIS NOT NULL
を使用します。NULL
はデータの欠落を表すため、任意の値や別のNULL
との関係で等号や不等号は成り立ちません。そのため、
select * from employees where mgr_id = NULL
という文は、このNULL
に対する比較を行うことができないため、0(ゼロ)に評価されます。ただし、select * from employees where mgr_id is NULL
という文は、会社のCEOを返します。CEOがマネージャを持たない唯一の従業員であるためです。詳細は、「IS NULL条件」を参照してください。
NULL
値自体は演算子または条件のオペランドとして直接使用できます。たとえば、(1 = NULL)
比較がサポートされます。これは、(1 = CAST(NULL AS INT))
のように、NULL
を適切なデータ型にキャストする場合と同じです。両方の方法がサポートされ、同じ結果を返します。
これらの属性によって、次のような場合は、NULL
を含む列、行、パラメータが無視されます。
NULL
を含む列を結合して表を結合した場合。
集計関数を実行した場合。
SQL述語で、NULL
を明示的にテストできます。TimesTenでサポートされるAPIにより、NULL値を処理する方法が提供されます。たとえば、ODBCアプリケーションで、関数SQLBindCol
、SQLBindParameter
、SQLGetData
およびSQLParamData
を使用して、NULL
値の入出力を処理します。
TimesTenでは、IEEE浮動小数点値Inf
(正の無限大)、-Inf
(負の無限大)およびNaN
(非数)がサポートされています。
定数値は、浮動小数点定数が許可されている場合に使用できます。次の定数がサポートされています。
BINARY_FLOAT_INFINITY
-BINARY_FLOAT_INFINITY
BINARY_DOUBLE_INFINITY
-BINARY_DOUBLE_INFINITY
BINARY_FLOAT_NAN
BINARY_DOUBLE_NAN
次の例では、BINARY_FLOAT
型の列およびTT_INTEGER
型の列を含む表を作成します。BINARY_FLOAT_INFINITY
およびBINARY_FLOAT_NAN
は、BINARY_FLOAT
型の列に挿入されます。
Command> CREATE TABLE bfdemo (id BINARY_FLOAT, Ii2 TT_INTEGER); Command> INSERT INTO bfdemo VALUES (BINARY_FLOAT_INFINITY, 50); 1 row inserted. Command> INSERT INTO bfdemo VALUES (BINARY_FLOAT_NAN, 100); 1 row inserted. Command> SELECT * FROM bfdemo; < INF, 50 > < NAN, 100 > 2 rows found.
Inf
、-Inf
およびNaN
は、主キーで定義された列で使用できる値です。これは、主キーで定義された列では使用できないNULL
とは異なります。
BINARY_FLOAT
列およびBINARY_DOUBLE
列には、Inf
、-Inf
およびNaN
の値のみ挿入できます。
浮動小数点の条件によって、式が無限大であるか、演算での未定義の結果(NaN
(非数))であるかが判別されます。
次の構文を考えてみます。
Expression IS [NOT] {NAN|INFINITE}
Expression
は、数値データ型、または数値データ型に暗黙的に変換可能なデータ型に解決される必要があります。
次の表に、浮動小数点の条件を示します。
条件 | 処理 | 例 |
---|---|---|
IS [NOT] NAN |
NOT を指定せずExpression が値NaN の場合、TRUE が返されます。NOT を指定してExpression が値NaN でない場合、TRUE が返されます。 |
SELECT * FROM bfdemo WHERE id IS NOT NAN; ID, ID2 < INF, 50 > 1 row found. |
IS [NOT] INFINITE |
NOT を指定せずExpression が値+Inf または-Inf の場合、TRUE が返されます。NOT を指定してExpression が値+Inf および-Inf のいずれでもない場合、TRUE が返されます。 |
SELECT * FROM bfdemo WHERE id IS NOT INFINITE; ID, ID2 < NAN, 100 > 1 row found. |
ノート: 定数キーワードは、特定のBINARY_FLOAT 値およびBINARY_DOUBLE 値を表します。比較キーワードは、値のプロパティに対応しており、いずれの型に対しても固有ではありません(ただし、BINARY_FLOAT 型、BINARY_DOUBLE 型、またはBINARY_FLOAT やBINARY_DOUBLE に変換可能な型に対しては、TRUE としてのみ評価されます)。 |
Inf
とNaN
の比較には、次のルールが適用されます。
Inf
(または-Inf
)と有限値の間での比較は、想定したとおりの結果になります。たとえば、5 > -Inf
などです。
(Inf = Inf)
および(Inf > -Inf)
は両方ともTRUE
と評価されます。
(NaN = NaN)
はTRUE
と評価されます。
照合順序に関しては次のように適用されます。
-Inf
は、他のすべての値より低い優先順位でソートされます。
Inf
は、NaN
およびNULL
より低い優先順位でソートされ、他のすべての値よりは高い優先順位でソートされます。
NaN
は、Inf
より高い優先順位でソートされます。
NULL
は、NaN
より高い優先順位でソートされます。NULL
は、すべての照合順序で常に最大の値となります。
浮動小数点値を含む式では、Inf
、-Inf
またはNaN
が生成される場合があります。これらの値は、式でオーバーフローまたは例外状態が生成された場合、あるいは式内の1つ以上の値がInf
、-Inf
またはNaN
の場合に生成される可能性があります。Inf
およびNaN
は、オーバーフローまたは0(ゼロ)による除算が条件の場合に生成されます。
集計関数では、Inf
、-Inf
およびNaN
の値は無視されません。NULL
値は無視されます。集計(または任意のSELECT
の結果)からInf
およびNaN
を除外する場合は、IS NOT NAN
条件およびIS NOT INFINITE
条件の両方を使用します。
処理の内容によっては、データがオーバーフローするかまたは切り捨てられる場合があります。オーバーフローはエラーになり、Inf
が生成される場合があります。切り捨ての場合、重要ではないデータが失われます。
INSERT
またはUPDATE
文を使用して、正確な値をデータベースに保存する際、目的の列のスケールがその値より小さい場合にかぎり、切捨てが行われます。このような切捨てが行われた場合、警告が戻されます。オーバーフローのため値が収まらない場合は、特別な値Inf
が戻され、指定した値は挿入されません。
TimesTenでは、計算中、値がデータベースに挿入されるとき、またはデータベースの値が更新されるときに、近似値の切捨てを行うことがあります。INSERT
またはUPDATE
に対してのみエラーが戻されます。近似値がオーバーフローした場合は、特別な値Inf
が戻されます。
次のような場合に、オーバーフローが発生します。
算術演算時、積算の結果の値がその型で使用できる最大値より大きい場合に、オーバーフローが発生することがあります。詳細は、第3章「式」を参照してください。
型変換時に、たとえばTT_INTEGER
値がTT_SMALLINT
値に変換されると、オーバーフローが発生することがあります。
次のように、英数字または数値データ型では、切捨てによってエラーまたは警告が発生する場合があります。