1 データ型
データ型は値のセットを定義します。データ型の参照は、コンテキストに指定可能な値のセットを指定します。データ型は、表から検索された値、または式や定数に従って計算された値に応じて決まります。
TimesTenでは、ODBC標準に基づいてデータ型が変換されます。詳細は、Microsoft社や様々なサード・パーティから入手できる、ODBC APIリファレンスのドキュメントを参照してください。次のサイトに、Microsoft社のODBC APIリファレンスのドキュメントがあります。
https://msdn.microsoft.com/en-us/library/ms714562(VS.85).aspx
TimesTen Cacheを使用する場合は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』の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」を参照してください。 |
ANSI SQLデータ型
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 下位互換性のためにサポートされているデータ型
| データ型 | 説明 |
|---|---|
|
|
長さのバイト数(文字数)が デフォルトは1バイトです。
長さが0(ゼロ)の空の文字列を列に挿入すると、SQLの
|
|
|
必要なバイト数は2* 長さが0(ゼロ)の空の文字列を列に挿入すると、SQLの
|
|
|
必要なバイト数は2* 長さが0(ゼロ)の空の文字列を列に挿入すると、SQLの 空白埋め比較セマンティクスが使用されます。 |
|
|
最大長のバイト数(文字数)が
長さが0(ゼロ)の空の文字列を列に挿入すると、SQLの 空白埋め比較セマンティクスが使用されます。 |
文字データ型
CHAR
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
NCHARデータ型は、2バイトのUnicode文字の固定長文字列です。NCHARデータ型は、Unicodeの空白文字U+0020 SPACEを使用して指定した長さまで調整されます。空白埋め比較セマンティクスが使用されます。
ノート:
NCHAR型を使用すると、長さが0(ゼロ)の文字列はNULLとして解釈されます。TT_NCHAR型を使用すると、長さが0(ゼロ)の文字列は、NULL以外の有効な値となります。NCHARとTT_NCHARの両方で、空白埋め比較セマンティクスが使用されます。TT_NCHAR型は下位互換用にサポートされています。
NCHARデータ型はUTF-16としてエンコードされます。
次の例では、表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データ型は、可変長文字列を指定します。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)に適用されます。
ノート:
-
VARCHARデータ型は、使用しないでください。VARCHAR2を使用してください。これら2つの型は現在同じ意味で使用されていますが、VARCHARデータ型は、別のセマンティクスを使用する別のデータ型として再定義される可能性があります。 -
VARCHAR2型を使用すると、長さが0(ゼロ)の文字列はNULLとして解釈されます。TT_VARCHAR型を使用すると、長さが0(ゼロ)の文字列は、NULL以外の有効な値となります。VARCHAR2では非空白埋め比較セマンティクスが使用されます。TT_VARCHARでは空白埋め比較セマンティクスが使用されます。TT_VARCHAR型は下位互換用にサポートされています。
次の例では、表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
NVARCHAR2データ型は、2バイトのUnicode文字の可変長文字列です。NVARCHAR2列を定義する場合は、文字の最大数を定義します。各値は指定したとおりに格納されます。この値が列の最大長を超えることはできません。
ノート:
NVARCHAR2型を使用すると、長さが0(ゼロ)の文字列はNULLとして解釈されます。TT_NVARCHAR型を使用すると、長さが0(ゼロ)の文字列は、NULL以外の有効な値となります。NVARCHAR2では非空白埋め比較セマンティクスが使用されます。TT_NVARCHARでは空白埋め比較セマンティクスが使用されます。TT_NVARCHAR型は下位互換用にサポートされています。
NVARCHAR2データ型は、UTF-16としてエンコードされます。
次の例では、表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
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
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
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
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
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_TINYINTinstead 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
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データ型およびVARBINARYデータ型
BINARYデータ型は、長さがnバイトの固定長のバイナリ値(nの値の範囲は1から8300バイト)です。BINARYデータ型にはnバイトの記憶域が必要です。データは後続の0(ゼロ)を使用してその列の最大長まで調整されます。ゼロ埋め比較セマンティクスが使用されます。
VARBINARYデータ型は、最大長がnバイトの可変長のバイナリ値です。このnの値の範囲は、1から4,194,304 (222)バイトまでです。
次の例では表を作成し、2つの列(データ型BINARYで定義されるcol1とデータ型VARBINARYで定義されるcol2)を定義します。次に、各列にバイナリ・データが挿入されます。BINARY値では、右側にゼロが埋め込まれることに注意してください。
ノート:
TimesTenで16進リテラルをバイナリ・データとして指定する方法の詳細は、「定数」のHexadecimalLiteralについての説明を参照してください。
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データ型
LOBデータ型は、TimesTen Scaleoutではサポートされていません。
ラージ・オブジェクト(LOB)データ型では、テキスト、イメージ、ビデオ、空間データなどの、サイズの大きい非構造化データを格納できます。LOBには、BLOB、CLOBおよびNCLOBデータ型があります。
LOBデータ型の列では、データの挿入や更新を行うことができます。更新操作では、EMPTY_CLOBまたはEMPTY_BLOBを使用してLOB値をNULL、つまり空の値に設定したり、LOB全体を新しいデータに置き換えることができます。別のLOB値でLOB値を更新できます。LOB列が含まれている行を削除すると、LOB値も削除されます。
LOBデータ型のセマンティクスは、次のSQLセマンティクスと似ています。
-
BLOBデータ型はSQLVARBINARYセマンティクスを使用します。 -
CLOBデータ型はSQLVARCHAR2セマンティクスを使用します。 -
NCLOBデータ型はSQLNVARCHAR2セマンティクスを使用します。
次の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全般に関する詳細情報も示します。
BLOB
バイナリLOB(BLOB)データ型は、構造化されていないバイナリ・ラージ・オブジェクトを格納するために使用します。BLOBデータの最大サイズは16MBです。
ノート:
TimesTenで16進リテラルをバイナリ・データとして割り当てる方法の詳細は、「定数」のHexadecimalLiteralの説明を参照してください。
列で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」を参照してください。
CLOB
キャラクタ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」を参照してください。
NCLOB
各国語キャラクタ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は、空のLOBとは意味が異なります。
-
NULLのLOBはNULLの値を持つため、NULLのLOBをリクエストするとNULLが返されます。 -
空のLOBは、
EMPTY_CLOBまたはEMPTY_BLOB関数により初期化されます。これらの関数はLOBを初期化して、長さが0(ゼロ)のNULL以外の値にします。EMPTY_CLOBまたはEMPTY_BLOB関数を使用して、NULL値不可列でLOBを初期化することもできます。
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データ型
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値に変換する必要があります。
日時データ型
日時データ型には次のものがあります。
TIMESTAMP
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
TT_DATE値の書式はYYYY-MM-DDで、範囲は1753-01-01(西暦1753年1月1日)から9999-12-31(西暦9999年12月31日)です。TT_DATEデータ型では4バイトの記憶域が必要です。
TimesTenの時間隔
この項の内容は次のとおりです。
DATEデータ型およびTIMEデータ型の使用
この項では、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 |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
|
+ (加算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
|
|
- (減算) |
|
|
|
|
|
|
|
* (乗算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
/ (除算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
TT_DATE |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
|
+ (加算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
|
|
- (減算) |
|
|
|
|
|
|
|
* (乗算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
/ (除算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
TIMESTAMP |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
|
+ (加算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
|
|
- (減算) |
|
|
|
|
|
|
|
* (乗算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
/ (除算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
TT_TIMESTAMP |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
|
+ (加算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
|
|
- (減算) |
|
|
|
|
|
|
|
* (乗算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
/ (除算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
NUMERIC |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
|
+ (加算) |
|
|
|
|
該当なし |
サポートなし |
|
- (減算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
該当なし |
サポートなし |
|
* (乗算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
該当なし |
|
|
/ (除算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
該当なし |
サポートなし |
|
INTERVAL |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
|
+ (加算) |
|
|
|
|
サポートなし |
|
|
- (減算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
|
* (乗算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
サポートなし |
|
/ (除算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
サポートなし |
ノート:
時間隔データ型は、完結した式の最終結果に使用することはできません。この時間隔の結果から必要な要素を抽出するには、EXTRACT関数を使用する必要があります。
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を使用してください。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値の入出力を処理します。
INFおよびNAN
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の値のみ挿入できます。
InfおよびNaN(浮動小数点の条件)の選択
浮動小数点の条件によって、式が無限大であるか、演算での未定義の結果(NaN(非数))であるかが判別されます。
次の構文を考えてみます。
Expression IS [NOT] {NAN|INFINITE}
Expressionは、数値データ型、または暗黙的に数値データ型に変換可能なデータ型に解決される必要があります。
次の表に、浮動小数点の条件を示します。
| 条件 | 操作 | 例 |
|---|---|---|
|
|
|
SELECT * FROM bfdemo WHERE id IS NOT NAN; ID, ID2 < INF, 50 > 1 row found. |
|
|
|
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およびNaNを含む式
-
浮動小数点値を含む式では、
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が戻されます。
次のような場合に、オーバーフローが発生します。
-
算術演算時、積算の結果の値がその型で使用できる最大値より大きい場合に、オーバーフローが発生することがあります。詳細は、「式」を参照してください。
-
集計関数の使用時に、複数の数値の合計が結果の型で使用できる最大値を超えると、オーバーフローが発生することがあります。
-
型変換時に、たとえば
TT_INTEGER値がTT_SMALLINT値に変換されると、オーバーフローが発生することがあります。
次のように、英数字または数値データ型では、切捨てによってエラーまたは警告が発生する場合があります。
-
文字データで、文字列がターゲット型には長すぎるために切り捨てられると、エラーが発生します。
NCHAR型およびNVARCHAR2型では、Unicode文字境界で常に切捨てが行われます。NCHARデータ型では、シングルバイト値(Unicode文字の半分)には意味がなく、使用できません。 -
数値データで、数値の小数部から後続の0(ゼロ)以外の数字が削除されると、警告が発生します。