この章では、データベース・アプリケーションにおけるSQLデータ型の使用方法について説明します。
内容は次のとおりです。
参照:
|
データ型は、ある限定されたプロパティの集合を、表の列に挿入できる、あるいはサブプログラムのパラメータに渡すことのできる値と対応付けます。このプロパティの集合によって、Oracle Databaseはあるデータ型の値を別のデータ型の値とは異なるものとして扱うようになります。たとえば、Oracle Databaseは、NUMBER
データ型の値は加算できますが、RAW
データ型の値は加算できません。
Oracle Databaseには、多数のデータ型と、データ型として使用できるユーザー定義型の複数のカテゴリが用意されています。
Oracleプリコンパイラでは、埋込みSQLプログラム内の他のデータ型が認識されます。このようなデータ型は外部データ型と呼ばれ、ホスト変数に関連付けられています。Oracle Databaseの組込みデータ型、Oracle提供のデータ型およびユーザー定義のデータ型を外部データ型と混同しないでください。
参照:
|
表1-1に、英数字データを格納するSQLデータ型の概要を示します。
表1-1 SQL文字データ型
データ型 | 格納される値 |
---|---|
固定長文字リテラル |
|
固定長Unicode文字リテラル |
|
可変長文字リテラル |
|
可変長Unicode文字リテラル |
|
|
最大(4 GB - 1) * ( |
|
最大(4 GB - 1) *( |
|
最大2 GB - 1の可変長文字データ。下位互換性のためだけに提供されています。 |
クライアント/サーバー・アプリケーションで、クライアント側の文字セットがサーバー側と異なる場合、Oracle DatabaseはCHAR
、VARCHAR2
およびLONG
データをデータベース文字セット(NLS_LANGUAGE
パラメータで決定)からユーザー・セッション用に定義した文字セットに自動的に変換します。
CHAR
列およびVARCHAR2
列の長さは、バイト数または文字数として指定できます。NCHAR
列およびNVARCHAR2
列の長さは、必ず文字単位で指定し、1つの文字が複数バイトで構成される場合にUnicode文字リテラルを格納するために適した長さにします。次の表は、一部の列の長さの指定とその意味をまとめたものです。
列の長さの指定 | 意味 |
---|---|
id VARCHAR2(32 BYTE) |
id 列には最高32個のシングルバイト文字が含まれます。 |
name VARCHAR2(32 CHAR) |
name 列には、最高32文字のデータベース・キャラクタ・セットが格納されます。データベース・キャラクタ・セットにマルチバイト・キャラクタが含まれる場合は、32バイトを超えても32文字まで格納できます。 |
biography NVARCHAR2(2000) |
biography 列には、Unicodeで表現可能な任意の言語による最高2000文字を格納できます。エンコーディングは、各国語キャラクタ・セットによって異なります。データベース・キャラクタ・セットがシングルバイトの場合も、列にはマルチバイト値を格納できます。 |
comment VARCHAR2(2000) |
comment 列には、初期化パラメータNLS_LENGTH_SEMANTICS の値に応じて、最高2000バイトまたは文字を格納できます。 |
マルチバイトのデータベース文字コード体系を使用する場合は、文字データ型の列を持つ表のために必要となる領域を慎重に検討してください。データベースの文字コード体系がシングルバイトである場合、1つの列内のバイト数と文字数は同じです。ただし、マルチバイトの場合は、通常このような対応はありません。1つの文字は、マルチバイト・コード体系と、シフトイン/シフトアウト制御コードの有無に応じて、1バイトで構成される場合と、複数バイトで構成される場合があります。バッファのオーバーフローを回避するため、データベース・キャラクタ・セットと異なるUnicodeエンコーディングを使用する可能性がある場合、データをNCHAR
またはNVARCHAR2
として指定します。
参照:
|
表の英数字データを格納する列のデータ型を選択する場合、次を考慮してください。
使用領域
Oracle Databaseでは、CHAR
列に格納されている値には空白を埋めますが、VARCHAR2
列に格納された値にはこれを行いません。そのため、VARCHAR2
列の方がCHAR
列よりもより効率的に領域を使用します。
パフォーマンス
空白を埋める違いのため、VARCHAR2
列のある大規模な表の全表スキャンでは、CHAR
列に同じデータが格納されている表の全表スキャンより、読み込むデータ・ブロックが少なくなる可能性があります。アプリケーションが文字データを含む大規模な表に対して全表スキャンを行う場合、CHAR
列よりVARCHAR2
列にデータを格納することによってパフォーマンスを改善できる可能性が高くなります。
比較セマンティクス
比較セマンティクスでANSI互換性が必要な場合は、CHAR
データ型を使用します。文字列の比較において後続空白が重要である場合は、VARCHAR2
データ型を使用します。
参照: これらのデータ型の比較セマンティクスの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
将来の互換性
CHAR
データ型およびVARCHAR2
データ型は、完全なサポートが保証されています。現在、VARCHAR
データ型はVARCHAR2
データ型と同義であるとみなされるため、将来も使用できる予定です。
数値データを格納するSQLデータ型は、NUMBER
、BINARY_FLOAT
およびBINARY_DOUBLE
です。
NUMBER
データ型は、実数を固定小数点形式または浮動小数点形式で格納します。NUMBER
は、最大で10進数38桁の精度を提供します。NUMBER
列には、1 x 10-130から9.99 x10125の正と負の数値および0(ゼロ)を格納できます。すべてのOracle DatabaseプラットフォームはNUMBER
値をサポートします。
BINARY_FLOAT
データ型およびBINARY_DOUBLE
データ型は、それぞれ単精度(32ビット)IEEE 754形式、および倍精度(64ビット)IEEE 754形式で、浮動小数点データを格納します。高精度の値は、BINARY_FLOAT
およびBINARY_DOUBLE
として格納するほうが、NUMBER
として格納するよりも必要とする領域は少なくなります。浮動小数点データの算術演算は通常、BINARY_FLOAT
およびBINARY_DOUBLE
値のほうが、NUMBER
値よりも高速です。
Oracle Databaseでサポートされているクライアント・インタフェースでは、BINARY_FLOAT
データ型およびBINARY_DOUBLE
値の算術演算は、ハードウェアのベンダーが提供する固有の命令セットによって実行されます。ネイティブ浮動小数点データ型という用語は、データ型BINARY_FLOAT
およびBINARY_DOUBLE
、およびサポートされているクライアント・インタフェースで実装されているこれらの型すべてを指します。
ネイティブ浮動小数点データ型は、電気電子技術者協会(IEEE)の2進浮動小数点演算についての規格であるIEEE規格754-1985(IEEE754)に実質的に準拠しています。詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
内容は次のとおりです。
参照:
|
2進値符号
符号付き指数
仮数
基数
浮動小数点数の値は、次の式で表されます。
(-1)sign.significand.baseexponent
たとえば、4.31という値は次のように表されます。
(-1)0.431.10-2
この表現の構成要素は、次のとおりです。
構成要素の名前 | 構成要素の値 |
---|---|
符号 | 0 |
仮数 | 431 |
基数 | 10 |
指数 | -2 |
浮動小数点数形式は、浮動小数点数の構成要素の表記方法を指定し、それにより、形式が表す値の範囲および精度が決定されます。範囲とは最小値から最大値までの間隔であり、精度とは仮数の桁数です。範囲と精度のどちらも有限です。指定された形式よりも高い精度の浮動小数点数は丸められます。
数値を丸める方法は、10進または2進のいずれかが可能な、形式の基数によって決まります。10進の形式に格納された数値は、最も近い10進の桁に丸められます(例: 1000、10または0.01)。2進の形式に格納された数値は、最も近い2進の桁に丸められます(例: 1024、512または1/64)。
NUMBER
の値は、10進の形式で格納されます。10進の桁への丸めを必要とする計算の場合は、NUMBER
データ型を使用してください。
ネイティブ浮動小数点の値は、2進の形式で格納されます。
内容は次のとおりです。
2進形式を使用する浮動小数点数の値は、次に示す算式によって決まります。
(-1)sign 2E (bit0 bit1 bit2 ... bitp-1)
表1-2に、算式の構成要素を示します。
表1-2 浮動小数点2進形式の構成要素
構成要素 | 構成要素の値 |
---|---|
|
0または1 |
|
単精度(32ビット)データ型の場合、-126以上127以下の整数です。 倍精度(64ビット)データ型の場合、-1022以上1023以下の整数です。 |
|
0または1(ビットの連続は基数2の数値を表します)。 |
|
単精度データ型の場合、24。 倍精度データ型の場合、53。 |
仮数の先頭のビットb0は、非正規の数値(後述)の場合を除いて、(1)に設定する必要があります。したがって、先頭のビットは実際には格納されないため、2進形式では精度としてnビットを指定しますが、格納されるのはn-1ビットになります。IEEE 754標準は、単精度および倍精度データ型のインメモリー形式を定義します。表1-3に概要を示します。
表1-3 2進形式の記憶域パラメータの概要
データ型 | 符号ビット | 指数ビット | 仮数ビット | ビット数合計 |
---|---|---|---|---|
単精度 |
1 |
8 |
24(23が格納されます) |
32 |
倍精度 |
1 |
11 |
53(52が格納されます) |
64 |
注意: IEEE 754標準で定義されている拡張単精度および拡張倍精度形式は、Oracle Databaseではサポートされていません。 |
仮数の先頭ビットが設定されている場合、正規化されていると呼ばれます。IEEE 754標準では非正規化数(subnormal numbers、denormal numbers)という、小さすぎて正規化された仮数で表せない数値を定義します。非正規化数の仮数を正規化すると、指数が大きくなりすぎます。非正規数では、条件がx-y==0.0(浮動小数点減算を使用)、結果がx==y、というプロパティが保持されます。IEEE 754形式では、非正規の値がサポートされています。
表1-4に、IEEE 754の単精度と倍精度形式およびOracle Database NUMBER
の範囲と精度を示します。範囲の制限は、正数として表しますが、この制限は負数の絶対値にも適用されます(ここで使用される「数値e指数」という表記法は、数値*10指数という意味です)。
表1-4 浮動小数点データ型の範囲および精度
範囲および精度 | 単精度32ビット脚注1 | 倍精度64ビット1 | Oracle Database NUMBERデータ型 |
---|---|---|---|
正の最大正規数 |
3.40282347e+38 |
1.7976931348623157e+308 |
< 1.0e126 |
正の最小正規数 |
1.17549435e-38 |
2.2250738585072014e-308 |
1.0e-130 |
正の最大非正規数 |
1.17549421e-38 |
2.2250738585072009e-308 |
適用なし |
正の最小非正規数 |
1.40129846e-45 |
4.9406564584124654e-324 |
適用なし |
精度(10進数) |
6 - 9 |
15 - 17 |
38 - 40 |
脚注1これらの数値は『IEEE Numerical Computation Guide』から引用されています。
参照:
|
表1-5に、IEEE 754標準がサポートする特殊な数値を示します。
表1-5に示す各値は、NaN
を除き、特殊なビット・パターンで表現されます。NaN
は未定義の演算の結果であり、多数のビット・パターンで表されます。ビット・パターンには、符号ビット・セットを含むものも含まないものもありますが、符号ビットに意味はありません。
IEEE 754標準では、quiet NaN
(ほとんどの演算への伝播時に追加の例外が発生しない)とsignalling NaN
(発生する)が区別されます。IEEE 754標準では、例外が有効および無効の場合の動作が指定されています。
Oracle Databaseでは、例外の有効化は許可されません。Oracle Databaseの動作は、IEEE 754標準で指定されている、例外が無効化されている場合の動作になります。特に、Oracle Databaseではquietとsignalling NaN
は区別されません。Oracle Call Interface(OCI)を使用して、Oracle DatabaseからNaN
値を取得できますが、取得されるNaN
値がsignallingかquietかは、クライアント・プラットフォームによって決まり、Oracle Databaseの制御外です。
IEEE 754標準は次の特殊な値のクラスを定義します。
ゼロ
非正規
正規
無限大
NaN
NaN
を除き、このリストの各クラスの値は、小さい方から順に示されています(符号は考慮していません)。IEEE 754では、NaN
は、他の特殊な値のクラスともNaN自体とも順序付けることはできません。
Oracle Databaseの場合
NaN
はすべてquietです。
すべての非NaN
value < NaN
任意のNaN
== 他のNaN
NaN
はすべて同じビット・パターンに変換されます。
-0は+0に変換されます。
参照: 浮動小数点条件の詳細は、『Oracle Database SQL言語リファレンス』を参照してください(浮動小数点条件では、式が無限か、または演算の未定義の結果(非数値(NaN ))かを判断します)。 |
Oracle Databaseでは、ネイティブ浮動小数点データについて、次の比較演算子が定義されています。
等しい
等しくない
より大きい
以上
より小さい
以下
不規則
比較では、ゼロの符号は無視されます(-0
は、+0
と等しいとみなされます)。
Oracle Databaseでは、ネイティブ浮動小数点データ型について、次の算術演算子が定義されています。
乗算
除算
加算
減算
剰余
平方根
演算の結果を丸めるために使用されるモードを定義できます。演算が実行されると、例外が発生することがあります。例外を無効化することもできます。
従来、Javaでは、浮動小数点算術に厳密な再現性が求められていました。IEEE 754にはこの要件はありません。このため、演算(算術を含む)の結果を、演算のオペランドが使用するよりも大きい範囲を使用する格納先に格納できます。
倍精度乗算の結果は、拡張倍精度格納先での計算に使用できます。しかし、計算結果は、格納先が単精度または倍精度であるかのように丸められます。結果の範囲(指数のビット数)としては、より高精度(拡張倍精度)の格納先でサポートされている範囲が使用できます。ただし、二重丸め誤差(結果の最下位ビットが不正)が発生する可能性があります。
この問題は、IA-32およびIA-64命令セット・アーキテクチャを実装するハードウェアで、倍精度乗算および除算を実行した場合のみ発生します。したがって、この例を除き、これらのデータ型に対する算術をプラットフォームを渡って再現できます。計算の結果がNaN
の場合、すべてのプラットフォームでIS NAN
がTRUEの値が作成されます。ただし、すべてのプラットフォームで同じビット・パターンを使用する必要はありません。
Oracle Databaseでは、浮動小数点と他のデータ型(10進数精度を使用する文字列形式など)の間で変換を行う関数が定義されています(変換中に精度が失われることがあります)。次に例を示します。
TO_BINARY_DOUBLE
(『Oracle Database SQL言語リファレンス』を参照)
TO_BINARY_FLOAT
(『Oracle Database SQL言語リファレンス』を参照)
TO_CHAR
(『Oracle Database SQL言語リファレンス』を参照)
TO_NUMBER
(『Oracle Database SQL言語リファレンス』を参照)
Oracle Databaseでは、変換時に例外が発生する可能性があります。IEEE 754標準では、次の例外が定義されています。
無効
不正確
ゼロ除算
アンダーフロー
オーバーフロー
Oracle Databaseでは、ネイティブ浮動小数点データ型に対して、これらの例外は発生しません。例外が発生する操作では、通常、表1-6に示す値が生成されます。
Oracle Databaseは、ネイティブ浮動小数点データ型を次のクライアント・インタフェースでサポートします。
SQL
PL/SQL
Oracle Call Interface(OCI)
Oracle C++ Call Interface(OCCI)
Pro*C/C++
JDBC
内容は次のとおりです。
OCI APIでは、IEEE 754の単精度および倍精度のネイティブ浮動小数点データ型が実装されており、それぞれのデータ型はSQLT_BFLOAT
およびSQLT_BDOUBLE
です。これらのデータ型とSQLデータ型BINARY_FLOAT
およびBINARY_DOUBLE
との変換は、Cデータ型FLOAT
およびDOUBLE
に対してIEEE 754標準を実装するプラットフォームで正確に行われます。
参照: 『Oracle Call Interfaceプログラマーズ・ガイド』 |
Oracle Databaseでは、SQLデータ型BINARY_FLOAT
およびBINARY_DOUBLE
は、ADTの属性としてサポートされています。
Pro*C/C++では、列データ型BINARY_FLOAT
およびBINARY_DOUBLE
を使用して、ネイティブFLOAT
データ型およびネイティブDOUBLE
データ型がサポートされています。これらのデータ型は、Oracle Database NUMBER
データ型と同じ方法で使用できます。FLOAT
およびDOUBLE
を、それぞれBINARY_FLOAT
およびBINARY_DOUBLE
データ型にバインドできます。そのためには、アプリケーションのコンパイル時に、Pro*C/C++プリコンパイラ・コマンドライン・オプションNATIVE_TYPES
をY
(yes)に設定します。
Oracle Databaseでは、日時(datetime)データを、独自の内部形式で、世紀、年、月、日、時間、分および秒に対応する7バイトのフィールドに格納します。
表1-7に、SQL日時データ型の概要を示します。日時データ型の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
表1-7 SQL日時データ型
日付タイプ | 使用方法 |
---|---|
|
ある時点(日時)の値を表に格納するために使用します。たとえば、ジョブの日付に使用します。 |
|
小数秒を含む正確な日付の値を格納するために使用します。たとえば、発生順序を決定するために比較する必要があるイベントの時間に使用します。 |
|
複数の地域にまたがって収集または調整する必要がある日時の値を格納するために使用します。 |
|
タイムゾーンが重要でない場合に日時の値を格納するために使用します。たとえば、テレビ会議のスケジュールを立てるアプリケーションでは、各参加者は自分のタイムゾーンで開始時間および終了時間を確認します。 クライアント・システムのタイムゾーンを使用して日時を表示する必要がある2層アプリケーションに適しています。通常、3層アプリケーションでこのデータ型を使用するのは不適切です。これは、Webブラウザに表示されるデータがブラウザのタイムゾーンではなくWebサーバーのタイムゾーンによって書式化されるためです。Webサーバーはデータベース・クライアントであるため、ローカル時間が使用されます。 |
|
年および月のみが重要な場合に、2つの日時の値の違いを格納するために使用します。たとえば、アラームを18か月後の日付に設定したり、特定の日付から6か月経過したことを確認できます。 |
|
2つの日時の値の正確な違いを格納するために使用します。たとえば、アラームを36時間後に設定したり、レースの開始から終了までの時間を記録できます。長い時間を高精度で表すには、日の部分に大きな値を使用します。 |
内容は次のとおりです。
参照: Oracle Database内部日時タイプの詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。 |
現在の日付および時刻を表示する最も簡単な方法は次のとおりです。
SELECT SYSDATE FROM DUAL
このコマンドは、現在の日付および時刻を、初期化パラメータNLS_DATE_FORMATによって異なる、デフォルトの日付書式で表示します。
Oracle Databaseのデフォルトの標準日付書式はDD-MON-RR
です。RR
日時書式要素を使用すると、年の末尾2桁のみを指定して20世紀の日付を21世紀に格納できます。たとえば、DD-MON-YY
日付書式の13-NOV-54
は、1950年から2049年に発行された問合せでは1954年を指しますが、2050年から2099年に発行される問合せでは2054年を指します。
SYSDATE
をデフォルト以外の書式で表示するには、TO_CHAR
関数を日付書式モデルを指定して使用します。
例1-1では、TO_CHAR
を書式モデルを指定して使用して、SYSDATE
を、デフォルト以外の書式で、BCまたはAD修飾子付きで表示します(デフォルトではSYSDATE
は修飾子なしで表示されます)。
例1-1 デフォルト以外の書式での現在の日付および時刻の表示
SELECT TO_CHAR(SYSDATE, 'DD-MON-YYYY BC') NOW FROM DUAL;
結果:
NOW ----------------------- 18-MAR-2009 AD 1 row selected.
参照:
|
Oracle Databaseでは日付は常にデフォルトの日付書式(初期化パラメータNLS_DATE_FORMAT
で設定)で格納されますが、TO_CHARおよびTO_DATE関数を、それぞれ日時書式モデルを指定して使用すると、デフォルト以外の書式で日付を表示および
挿入できます。
例1-2では、DATE
列を含む表を作成し、デフォルト以外の書式で指定した日付を挿入します。日付は最初のSELECT
文で示すように、デフォルトの書式で格納されます。2番目のSELECT
文は日付をデフォルト以外の書式で表示します。
例1-2 デフォルト以外の書式での日付の挿入および表示
DROP TABLE dates;
CREATE TABLE dates (d DATE);
INSERT INTO dates VALUES (TO_DATE('OCT 27, 1998', 'MON DD, YYYY'));
SELECT d FROM dates;
結果:
D --------- 27-OCT-98 1 row selected. SELECT TO_CHAR(d, 'YYYY-MON-DD') D FROM dates;
結果:
D
--------------------
1998-OCT-27
1 row selected.
参照:
|
Oracle Databaseでは時刻は常にHH24:MI
:SS
のような24時間形式で格納されますが、TO_CHARおよびTO_DATE関数を、それぞれ日時書式モデルを指定して使用すると、デフォルト以外の書式で時刻を
表示および
挿入できます。
DATE
列では
デフォルトの時刻は12:00:00 A.M.(真夜中)です。
デフォルトの時刻は、時刻部分に何も指定されなかった、または値が切捨てられたという理由のどちらの場合でも、時刻部分のない列の値に適用されます。
デフォルトの日付は、日付部分に何も指定されなかった場合、列の値に適用されます。
例1-3では、DATE
列を含む表を作成し、デフォルト以外の書式で指定した3つの日付を挿入します。1つは日付および時刻部分があり、1つは時刻部分がなく、もう1つは日付部分がありません。最初のSELECT
文は現在の日付を示します。2番目のSELECT
文は、日付および時刻部分の両方を含む、デフォルト以外の書式で3つの日付を表示します。
例1-3 デフォルト以外の書式での日付および時刻の挿入および表示
DROP TABLE birthdays; CREATE TABLE birthdays (name VARCHAR2(20), day DATE); INSERT INTO birthdays (name, day) VALUES ('Annie', TO_DATE('13-NOV-92 10:56 A.M.','DD-MON-RR HH:MI A.M.') ); INSERT INTO birthdays (name, day) VALUES ('Bobby', TO_DATE('5-APR-02','DD-MON-RR') ); INSERT INTO birthdays (name, day) VALUES ('Cindy', TO_DATE('8:25 P.M.','HH:MI A.M.') );
現在の日付を表示します。
SELECT SYSDATE FROM DUAL;
結果:
SYSDATE
---------
05-NOV-10
1 row selected.
格納された日時の値の日付および時刻部分の両方を表示します。
SELECT name, TO_CHAR(day, 'Mon DD, RRRR') DAY, TO_CHAR(day, 'HH:MI A.M.') TIME FROM birthdays;
結果:
NAME DAY TIME -------------------- --------------------- ---------- Annie Nov 13, 1992 10:56 A.M. Bobby Apr 05, 2002 12:00 A.M. Cindy Nov 01, 2010 08:25 P.M. 3 rows selected.
日時の値に算術演算を実行できます。そのような演算の結果は、『Oracle Database SQL言語リファレンス』 に記載のルールによって決定されます。
SQLには、日時の式に使用できる多くの日時関数があります。たとえば、関数ADD_MONTHS
は、指定した日付から指定した月数である日付を戻します。日時関数のすべてのリストは、『Oracle Database SQL言語リファレンス』を参照してください。
表1-8に、日時データ型間で変換を行うSQLファンクションの概要を示します。
表1-8 日時データ型のSQL変換関数
関数 | 変換元 | 変換先 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
内容は次のとおりです。
MDSYS.SDO_GEOMETRYデータ型などの機能を使用して、地理情報システム(GIS)または空間データを表すことができます。オブジェクト・リレーショナル・モデルまたはリレーショナル・モデルを使用して、データベースにデータを格納できます。PL/SQLパッケージのセットを使用して、データを操作および問い合せることができます。
参照: Oracle Spatial機能の詳細は、『Oracle Spatial開発者ガイド』を参照してください。 |
Oracle Multimediaを使用すると、Oracle Databaseで他の企業情報と統合された方法でイメージ、オーディオ、ビデオまたは他の異機種メディア・データを格納、管理および取得できます。Oracle Multimediaにより、Oracle Databaseの信頼性、可用性およびデータ管理が従来型、インターネット、E-Commerceおよびマルチメディア・アプリケーションのマルチメディア・コンテンツへと拡張されます。
この種のマルチメディア・データをBLOB
値またはBFILE
値としてデータベースに格納したり、Webサーバーまたはその他のサーバーに外部的に格納する場合、Oracle Multimediaを使用して、オブジェクト・リレーショナル・モデルまたはリレーショナル・モデルのいずれかでデータにアクセスし、一連のADTを使用してデータを操作および問い合せることができます。
Oracle Multimediaは、次の用途にあったORDAudio
、ORDDoc
、ORDImage
、ORDImageSignature
、ORDVideo
およびSI_StillImage
ADT(メソッドを含む)を提供します。
マルチメディア・データからのメタデータと属性の抽出
Oracle Multimedia、Webサーバー、ファイル・システムおよび他のサーバーからのマルチメディア・データの取得および管理
イメージ・データの操作の実行
参照: Oracle Multimediaの詳細は、『Oracle Multimediaリファレンス』を参照してください。 |
大量のデータを表現するために、Oracle Databaseでは次のものが提供されています。
LONGおよびLONG RAWデータ型(下位互換性のため)
ラージ・オブジェクト(LOB)は大量のデータを格納するためのデータ型です(LOBの最大サイズはデータベースの構成方法により異なります)。LOBにデータを格納することで、アプリケーションでデータを効果的にアクセスし操作することができます。
表1-9に、LOBの概要を示します。
表1-9 ラージ・オブジェクト(LOB)
データ型 | 説明 |
---|---|
さまざまな種類のバイナリ形式のデータを格納します。 通常、イメージ、音声および映像などのマルチメディア・データに使用されます。 |
|
文字列データをデータベース・キャラクタ・セット形式で格納します。 データベース・キャラクタ・セットのみを使用する大量の文字列またはドキュメントに使用されます。 |
|
各国語キャラクタ・セット形式で文字列データを格納します。 各国語キャラクタ・セットの大量の文字列またはドキュメントに使用されます。 |
|
バイナリ・ファイルをホストのオペレーティング・システム・ファイル・システム内のデータベース外に格納します。アプリケーションは イメージ・データなど、アプリケーションが操作しない静的データに使用されます。 あらゆる種類のデータ(つまりオペレーティング・システム・ファイル)は |
BLOB
、CLOB
またはNCLOB
型のインスタンスは一時的(アプリケーションのスコープ内で宣言される)か、または永続的(データベースで作成および格納される)のいずれも可能です。
参照:
|
LONG
列には最大2 GB - 1バイトの可変長文字列が格納されます。LONG
列にはVARCHAR2
列の多くの特性があります。LONG
列を使用して長いテキスト文字列を格納できます。LONG
値の長さはコンピュータの使用可能なメモリの量により制限されることがあります。LONG
データ型の制限を含む詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
LONG
RAW
データ型(およびRAW
データ型)は、Oracle Databaseによって、異なるシステム間でデータを移動するときに明示的に変換されないデータを格納します。これらのデータ型は、2進データおよびバイト列のために用意されています。たとえば、LONG
RAW
を使用して、図形データ、音声データ、文書データおよび2進データの配列を格納できます。解析方法は使用方法によって異なります。RAW
データには索引を付けることができますが、LONG
RAW
データには索引を付けることができません。RAW
データ型およびLONG
RAW
データ型の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
全文検索を行うには、低レベルのコードを作成するのではなく、Oracle Textを使用します。Oracle Textを使用すると、検索データが特別な索引に格納され、演算子およびPL/SQLパッケージを使用して検索データを問い合せることができます。このテクノロジによって、表、ファイルまたはURLのデータを使用する独自の検索エンジンの作成、および検索ロジックとリレーショナル問合せの結合が可能になります。この方法では、XPath表記法を使用してXMLデータを検索することもできます。
参照: Oracle Textの詳細は、『Oracle Textアプリケーション開発者ガイド』を参照してください。 |
XML形式のファイルとして格納されている情報がある場合、またはADTをXML形式で格納する場合、Oracle提供のXMLType
型を使用できます。
表にXMLType
列を作成する場合、次の方法でXMLデータを格納できます。
CLOB
列に
バイナリXMLとして(内部的にはCLOB
として格納)
オブジェクト・リレーショナルに
XMLType
にはW3C XPath式を使用してXMLデータにアクセス、抽出および問い合わせるメンバー関数があります(『Oracle XML DB開発者ガイド』を参照)。また、OracleはXMLドキュメントの全体または一部を操作または戻すSQL XML関数(『Oracle Database SQL言語リファレンス』を参照)および次のPL/SQLパッケージ(『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照)を提供しています。
DBMS_XMLDOM
、XMLTypeオブジェクトのアクセス用
DBMS_XMLGEN
、SQL問合せの結果の正規XML形式への変換用
DBMS_XMLINDEX
、非同期索引作成の実装用
DBMS_XMLPARSER
、XMLドキュメントのコンテンツと構造へのアクセス用
DBMS_XMLQUERY
、データベースからXMLType
への機能用
DBMS_XMLSAVE
、XMLからデータベース型への機能用
DBMS_XMLSCHEMA
、XMLスキーマの管理用
DBMS_XMLSTORE
、XMLデータのリレーショナル表への格納用
DBMS_XMLTRANSLATIONS
、さまざまな言語で検索または表示できるための文字列の変換用
参照:
|
いくつかの言語では、実行時にデータ型を変更したり、プログラムに変数の型を確認させることができます。たとえば、C言語にはunion
キーワードおよびvoid*
ポインタがあり、Javaにはtypeof
演算子およびNumber
などのラッパー型があります。
Oracle Databaseでは、すべての型のデータを保持できる変数および列を作成することができ、その値をテストして基礎となる表現を判断できます。たとえば、表の単一の列で、数値、文字列およびオブジェクトをそれぞれ別の行に表現できます。
Oracleが提供するSYS
.ANYDATA
ADTを使用すると、すべてのスカラー型またはADTの値を表現できます。SYS
.ANYDATA
には、任意の型のスカラー値を受け取り、スカラーまたはオブジェクトに戻すメソッドがあります。同様に、Oracleが提供するSYS
.ANYDATASET
ADTを使用すると、すべてのコレクション型の値を表現できます。これらのADTの詳細は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。
型の情報を確認および操作するには、例1-4
に示すDBMS_TYPESパッケージを使用します。このパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
OCIを使用するときは、OCIAnyData
およびOCIAnyDataSet
インタフェースを使用します。『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。
例1-4 SYS.ANYDATA列の情報へのアクセス
CREATE OR REPLACE TYPE employee_type AS OBJECT (empno NUMBER, ename VARCHAR2(10)); / DROP TABLE mytab; CREATE TABLE mytab (id NUMBER, data SYS.ANYDATA); INSERT INTO mytab (id, data) VALUES (1, SYS.ANYDATA.ConvertNumber(5)); INSERT INTO mytab (id, data) VALUES (2, SYS.ANYDATA.ConvertObject(Employee_type(5555, 'john'))); CREATE OR REPLACE PROCEDURE p IS CURSOR cur IS SELECT id, data FROM mytab; v_id mytab.id%TYPE; v_data mytab.data%TYPE; v_type SYS.ANYTYPE; v_typecode PLS_INTEGER; v_typename VARCHAR2(60); v_dummy PLS_INTEGER; v_n NUMBER; v_employee employee_type; non_null_anytype_for_NUMBER exception; unknown_typename exception; BEGIN OPEN cur; LOOP FETCH cur INTO v_id, v_data; EXIT WHEN cur%NOTFOUND; /* typecode signifies type represented by v_data. GetType also produces a value of type SYS.ANYTYPE with methods you can call to find precision and scale of a number, length of a string, and so on. */ v_typecode := v_data.GetType (v_type /* OUT */); /* Compare typecode to DBMS_TYPES constants to determine type of data and decide how to display it. */ CASE v_typecode WHEN DBMS_TYPES.TYPECODE_NUMBER THEN IF v_type IS NOT NULL THEN -- This condition should never happen. RAISE non_null_anytype_for_NUMBER; END IF; -- For each type, there is a Get method. v_dummy := v_data.GetNUMBER (v_n /* OUT */); DBMS_OUTPUT.PUT_LINE (TO_CHAR(v_id) || ': NUMBER = ' || TO_CHAR(v_n) ); WHEN DBMS_TYPES.TYPECODE_OBJECT THEN v_typename := v_data.GetTypeName(); IF v_typename NOT IN ('HR.EMPLOYEE_TYPE') THEN RAISE unknown_typename; END IF; v_dummy := v_data.GetObject (v_employee /* OUT */); DBMS_OUTPUT.PUT_LINE (TO_CHAR(v_id) || ': user-defined type = ' || v_typename || ' ( ' || v_employee.empno || ', ' || v_employee.ename || ' )' ); END CASE; END LOOP; CLOSE cur; EXCEPTION WHEN non_null_anytype_for_NUMBER THEN RAISE_Application_Error (-20000, 'Paradox: the return AnyType instance FROM GetType ' || 'should be NULL for all but user-defined types'); WHEN unknown_typename THEN RAISE_Application_Error( -20000, 'Unknown user-defined type ' || v_typename || ' - program written to handle only HR.EMPLOYEE_TYPE'); END; / SELECT t.data.gettypename() AS "Type Name" FROM mytab t;
結果:
Type Name -------------------------------------------------------------------------------- SYS.NUMBER HR.EMPLOYEE_TYPE 2 rows selected.
表およびクラスタを作成するSQL文は、ANSIデータ型と、IBM社の製品SQL/DSおよびDB2のデータ型を使用できます(次の段落の注意を除く)。Oracle DatabaseはANSIまたはIBMデータ型を対応するOracleデータ型に変換し、Oracleデータ型を列データ型の名前として記録し、列データをOracleデータ型で格納します。変換の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
注意: SQL文ではSQL/DSおよびDB2のTIME 、GRAPHIC 、VARGRAPHIC およびLONG VARGRAPHIC データ型を使用できません。対応するOracleデータ型がないからです。 |
Oracle Expression Filter(ルール・マネージャの機能)により、条件式をデータベース表の1つまたは複数の列に格納、索引作成および評価できます。Oracle Expression Filterは、格納された式を受信データと比較し、目的の行を識別します。
シナリオ: 各行に株式取引の口座名義人のデータが含まれる表を作成しました。各投資家が関心を持っている株式の情報を条件式として格納する列を定義しようとしています。
DROP TABLE traders; CREATE TABLE traders ( name VARCHAR2(10), email VARCHAR2(20), interest VARCHAR2(30) );
解決方法:
取引記号、指値、株価の変動額を示す属性を含むデータ型を作成します。
CREATE OR REPLACE TYPE ticker AS OBJECT ( symbol VARCHAR2(20), price NUMBER, change NUMBER ); /
データ型ticker
に基づいて属性セットを作成します。
BEGIN DBMS_EXPFIL.DROP_ATTRIBUTE_SET (attr_set => 'ticker'); END; / BEGIN DBMS_EXPFIL.CREATE_ATTRIBUTE_SET (attr_set => 'ticker', from_type => 'YES'); END; /
次のように、列trader
.interest
に格納された式セットに属性セットを関連付けます。
BEGIN DBMS_EXPFIL.ASSIGN_ATTRIBUTE_SET (attr_set => 'ticker', expr_tab => 'traders', expr_col => 'interest'); END; /
このコードによって、interest
列に有効な条件式が格納されるようになります。
この表に、投資家名、電子メール・アドレス、特定の価格で投資家が関心を持っている株式を表す条件式を移入します。次に例を示します。
INSERT INTO traders (name, email, interest) VALUES ('Vishu', 'vishu@example.com', 'symbol = ''ABC'' AND price > 25');
EVALUATE
演算子を使用して、指定したデータ項目をTRUE
と評価する条件式を識別します。たとえば、次の問合せでは、株価(symbol='ABC', price=31, change=5.2)
に関心を持っている投資家が戻されます。
SELECT name, email FROM traders WHERE EVALUATE ( interest, 'symbol=>''ABC'', price=>31, change=>5.2' ) = 1;
結果:
NAME EMAIL ---------- -------------------- Vishu vishu@example.com 1 row selected.
ヒント: 問合せを高速化するには、interest 列にOracle Expression Filter索引を作成します。 |
参照: Oracle Expression Filterを使用したアプリケーションの開発の詳細は、『Oracle Databaseルール・マネージャおよび式フィルタ開発者ガイド』を参照してください。 |
行にアクセスするには、そのアドレス、または行を一意に識別するROWIDを使用するのが最も高速な方法です。同じデータ・ブロック内の異なる行は、これらが異なるクラスタ化表にある場合のみ、同じROWIDを持つことができます。行が1データ・ブロックよりも長い場合、ROWIDによって最初の行断片が識別されます。
ROWIDを確認するには、疑似列ROWID
を問い合せます。この値は、行のアドレスを表す文字列です。この文字列のデータ型はROWID
またはUROWID
です。
注意: ハイブリッド列圧縮(HCC)で圧縮された表の行を更新すると、行のROWID が変更されます。特定のOracleストレージ・システムの機能であるHCCの詳細は、『Oracle Database概要』を参照してください。 |
内容は次のとおりです。
参照: ROWID疑似列の詳細は、『Oracle Database SQL言語リファレンス』 を参照してください。 |
Oracle Databaseデータベース内の各表はROWID
という名前の疑似列を持っています。これはSELECT
リスト、またはWHERE
句に含まれる問合せで使用できます。
例1-5では、ROWID
データ型の列を持つ表を作成し、INSERT
文でROWID
擬似列を問い合せることでROWIDを移入し、表示します。表のROWID列により、格納方法が表示されます。
例1-5 ROWID擬似列の問合せ
DROP TABLE t_tab; -- in case it exists CREATE TABLE t_tab (col1 ROWID); INSERT INTO t_tab (col1) SELECT ROWID FROM employees WHERE employee_id > 199;
問合せ:
SELECT employee_id, rowid
FROM employees
WHERE employee_id > 199;
ROWID
は異なりますが、次に類似した結果が得られます。
EMPLOYEE_ID ROWID
----------- ------------------
200 AAAPeSAAFAAAABTAAC
201 AAAPeSAAFAAAABTAAD
202 AAAPeSAAFAAAABTAAE
203 AAAPeSAAFAAAABTAAF
204 AAAPeSAAFAAAABTAAG
205 AAAPeSAAFAAAABTAAH
206 AAAPeSAAFAAAABTAAI
7 rows selected.
問合せ:
SELECT * FROM t_tab;
COL1
は異なりますが、次に類似した結果が得られます。
COL1 ------------------ AAAPeSAAFAAAABTAAC AAAPeSAAFAAAABTAAD AAAPeSAAFAAAABTAAE AAAPeSAAFAAAABTAAF AAAPeSAAFAAAABTAAG AAAPeSAAFAAAABTAAH AAAPeSAAFAAAABTAAI 7 rows selected.
Oracle Databaseにより生成されたヒープ構成表では、ROWID
疑似列の値のデータ型はROWID
です。内部的に、このデータ型は、データベース・サーバーが行にアクセスするために必要な情報を保持する構造体です。この構造体の形式は、制限付き形式、拡張形式、および外部バイナリ形式のいずれかです。
内容は次のとおりです。
制限付き内部形式のROWID構造体は、次のコンポーネントを含みます。
データファイル識別子
ブロック識別子
行識別子
ほとんどのプラットフォームでは、構造体のサイズは6バイトです。
データベース・サーバーにより、ROWID
疑似列は18文字の文字列で、16進数でコード化された各コンポーネントとともに、クライアント・アプリケーションに戻されます。
拡張内部形式のROWID構造体は、制限付き形式と同じコンポーネントとデータとデータ・オブジェクト番号を含みます。これによりデータベース・セグメントが識別されます。ほとんどのプラットフォームでは、この構造体のサイズは10バイトです。
データベース・サーバーにより、ROWID
疑似列の値は、18文字の文字列形式で、各コンポーネントをbase 64にエンコードして、クライアント・アプリケーションに戻されます。たとえば、文字列AAAA8mAALAAAAQkAAA
は、4つの部分からなる形式OOOOOOFFFBBBBBBRRR
の拡張ROWID
のコンポーネントをbase 64にエンコードしたものを表します。
拡張ROWIDの内容をアクセスおよび解析するには、DBMS_ROWID
パッケージを使用します。『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
一部のクライアント・アプリケーションでは、バイナリ内部形式のROWID
構造体を使用します。たとえば、OCIおよび一部のプリコンパイラ・アプリケーションでは、バインドまたは定義のコールで3GL構造体に対してROWID
データ型をマップできます。
バイナリ内部形式では、ROWID
構造体のサイズは、拡張および制限付きROWIDのサイズと同じです。制限付きROWIDの場合、オブジェクト番号は未使用フィールドに格納されています。
拡張バイナリROWID
の形式は、Cのstruct
で表すと、次のようになります。
struct riddef { ub4 ridobjnum; /* data obj#--this field is unused in restricted ROWIDs */ ub2 ridfilenum; ub1 filler; ub4 ridblocknum; ub2 ridslotnum; }
外部表(Oracle Databaseにより生成されていない)または索引構成表では、ROWID
擬似列の値はUROWID
データ型になります。このデータ型にはユニバーサルROWID(UROWID)が格納されます。
外部表のUROWID(ゲートウェイを介してアクセスされるDB2表など)は外部ROWIDと呼ばれます。
索引構成表のUROWI(表の行は索引リーフに格納されますが、これは移動できます)は論理ROWIDと呼ばれます。Oracle Databaseでは、論理ROWIDは表の主キーに基づいて作成されます。主キーが変更されていない場合、論理ROWIDは変更されません。
表にUROWIDを格納するには、表に対してUROWID
データ型の列を定義し、その列にROWID
疑似列の値を取り出します。
一般には、あるデータ型の値を別のデータ型の変数または列に割り当てる、または別のデータ型の値を使用して式を作成することはできません。しかし、Oracle Databaseでは、あるデータ型のデータが予想される箇所で、別のデータ型のデータを受け入れ、受け入れたデータを予想されるデータ型に自動的に変換する場合があります。これは暗黙的データ変換と呼ばれます。
内容は次のとおりです。
参照: データ型変換の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
variable := expression
expression
のデータ型がvariable
と異なる場合、Oracle Databaseはexpression
のデータ型をvariable
のデータ型に変換しようとします。どのような場合に可能かは、『Oracle Database SQL言語リファレンス』を参照してください。
文字からNUMBER
への変換は、文字列が有効な数字を表している場合にのみ正常に行われます。文字からDATE
への変換は、文字列がセッションのデフォルト日付書式に合致している場合にのみ正常に行われます(デフォルト日付書式の詳細は、「現在の日付および時刻の表示」を参照してください)。
例
test_package
、パブリック変数var1
およびtable1_tab
が次のように宣言されています。
CREATE OR REPLACE PACKAGE test_package AS var1 CHAR(5); END; / DROP TABLE table1_tab; CREATE TABLE table1_tab (col1 NUMBER);
次の代入について説明します。
variable := expression
expression
のデータ型は、variable
のデータ型と同じか、そのデータ型に暗黙的に変換可能である必要があります。たとえば、次の代入では、Oracle Databaseによって0がvar1
のデータ型(CHAR(5)
)に自動的に変換されます。
var1 := 0;
次の文について説明します。
INSERT INTO table1_tab (col1) VALUES (expression)
expression
のデータ型は、col1
のデータ型と同じか、そのデータ型に暗黙的に変換可能である必要があります。たとえば、次の文では、Oracle Databaseによって文字列'19'がcol1
のデータ型(NUMBER
)に自動的に変換されます。
INSERT INTO table1_tab (col1) VALUES ('19')
次の文について説明します。
UPDATE table1_tab SET column = expression
expression
のデータ型は、column
のデータ型と同じか、そのデータ型に暗黙的に変換可能である必要があります。たとえば、次の文では、Oracle Databaseによって文字列'30'がcol1
のデータ型(NUMBER
)に自動的に変換されます。
UPDATE table1_tab SET col1 = '30';
次の文について説明します。
SELECT column INTO variable FROM table1_tab
column
のデータ型は、variable
のデータ型と同じか、そのデータ型に変換可能である必要があります。たとえば、次の文では、Oracle Databaseによって、col1
から選択された値(30)がvar1
のデータ型(CHAR(5)
)に自動的に変換されます。
SELECT col1 INTO var1 FROM table1_tab WHERE col1 = 30;
式の評価では、Oracle Databaseは割当ての場合と同じ変換を自動的に行うことができます。ターゲット・データ型は、式の内容により決定されます。たとえば、式が算術演算子のオペランドである場合、Oracle Databaseは、式の値をNUMBER
に変換しようとします。式が文字列関数のオペランドである場合、Oracle Databaseは、式の値をVARCHAR2
に変換しようとします。
次のような割当ての場合、
variable := expression
Oracle Databaseでは、式変換規則を使用して、最初にexpression
を評価します。評価が正常に行われると、結果は単一のデータ型の単一の値となり、その後、Oracle Databaseは、割当て変換規則を使用して、variable
にこの値を割り当てようとします。
動的パフォーマンス・ビューV$SQLFN_METADATA
には、SQL演算子と関数のメタデータが含まれます。V$SQLFN_METADATA
の各関数に対し、動的パフォーマンス・ビューV$SQLFN_ARG_METADATA
には、それぞれの関数の引数に関するメタデータの1行が含まれます。関数の引数が反復可能な場合(関数LEAST
およびGREATEST
内など)、V$SQLFN_ARG_METADATA
には、それぞれの反復引数向けに1行のみが含まれます。FUNCID
でこれらの2つのビューを結合できます。
これらのビューによって、サード・パーティ・ツールは、アプリケーション・レイヤーでメタデータをメンテナンスすることなくSQL関数を活用できます。
内容は次のとおりです。
参照:
|
ビューV$SQLFN_METADATA
の中で列DATATYPE
は、関数のデータ型(つまり、関数が戻すデータ型)です。このデータ型は、Oracleデータ型、データ型ファミリ(「データ型ファミリ」を参照)、またはARG
n
のいずれかです。ARG
n
は、関数のn番目の引数のデータ型です。次に例を示します。
MAX
関数(『Oracle Database SQL言語リファレンス』を参照)は、その最初の引数のデータ型を持つ値を戻すため、MAX
関数はデータ型ARG1
を戻します。
DECODE
関数(『Oracle Database SQL言語リファレンス』を参照)は、その3番目の引数のデータ型を持つ値を戻すため、DECODE
関数のデータ型は、ARG3
です。
ビューV$SQLFN_METADATA
の中では、DISP_TYPE
が任意の式を持つ引数のデータ型です。式は、単一の値、または値と単一の値を持つSQL関数の組合せから構成されています。
通常、SQL関数の引数には、データ型ファミリの任意のデータ型を含めることができます。表1-11に、データ型ファミリとそのメンバーのデータ型を示します。