ヘッダーをスキップ
Oracle® Databaseアドバンスト・アプリケーション開発者ガイド
11gリリース2 (11.2)
B56259-09
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

1 データベース・アプリケーションにおけるSQLデータ型の使用

この章では、データベース・アプリケーションにおけるSQLデータ型の使用方法について説明します。

内容は次のとおりです。


参照:

  • PL/SQLデータ型の詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。

  • 抽象データ型(ADT)の詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。

  • ADTの詳細は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。

    ADTはデータ構造体と、データを操作するサブプログラムから構成されます。静的データ・ディクショナリ・ビュー*_OBJECTSでは、ADEのOBJECT_TYPETYPEです。静的データ・ディクショナリ・ビュー*_TYPESでは、ADEのTYPECODEOBJECTです。


SQLデータ型の概要

データ型は、ある限定されたプロパティの集合を、表の列に挿入できる、あるいはサブプログラムのパラメータに渡すことのできる値と対応付けます。このプロパティの集合によって、Oracle Databaseはあるデータ型の値を別のデータ型の値とは異なるものとして扱うようになります。たとえば、Oracle Databaseは、NUMBERデータ型の値は加算できますが、RAWデータ型の値は加算できません。

Oracle Databaseには、多数のデータ型と、データ型として使用できるユーザー定義型の複数のカテゴリが用意されています。

Oracleプリコンパイラでは、埋込みSQLプログラム内の他のデータ型が認識されます。このようなデータ型は外部データ型と呼ばれ、ホスト変数に関連付けられています。Oracle Databaseの組込みデータ型、Oracle提供のデータ型およびユーザー定義のデータ型を外部データ型と混同しないでください。


参照:

  • SQLデータ型の詳細情報は、『Oracle Database SQL言語リファレンス』を参照してください。

  • SQLデータ型(Oracleデータ型とも呼ばれます)の追加の概要は、『Oracle Database概要』を参照してください。


文字データの表現

表1-1に、英数字データを格納するSQLデータ型の概要を示します。

表1-1 SQL文字データ型

データ型 格納される値

CHAR

固定長文字リテラル

NCHAR

固定長Unicode文字リテラル

VARCHAR2

可変長文字リテラル

NVARCHAR2

可変長Unicode文字リテラル

CLOB

最大(4 GB - 1) * (DBMS_LOB.GETCHUNKSIZEから取得した値)のシングルバイトおよびマルチバイト文字列

NCLOB

最大(4 GB - 1) *(DBMS_LOB.GETCHUNKSIZEから取得した値)のシングルバイトおよびマルチバイトUnicode文字列

LONG

最大2 GB - 1の可変長文字データ。下位互換性のためだけに提供されています。


クライアント/サーバー・アプリケーションで、クライアント側の文字セットがサーバー側と異なる場合、Oracle DatabaseはCHARVARCHAR2およびLONGデータをデータベース文字セット(NLS_LANGUAGEパラメータで決定)からユーザー・セッション用に定義した文字セットに自動的に変換します。

内容は次のとおりです。


参照:

  • CHARVARCHAR2、NCHARおよびNVARCHAR2データ型の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

  • CLOBおよびNCLOBデータ型の詳細は、「ラージ・オブジェクト(LOB)」を参照してください。

  • LONGデータ型の詳細は、「LONGおよびLONG RAWデータ型」を参照してください。


バイト数または文字数としての列の長さの指定

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として指定します。


参照:

  • SQLデータ型NCHARおよびNVARCHAR2の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

  • SQLデータ型NCHARおよびNVARCHAR2の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。


CHARデータ型およびVARCHAR2データ型間の選択

表の英数字データを格納する列のデータ型を選択する場合、次を考慮してください。

  • 使用領域

    Oracle Databaseでは、CHAR列に格納されている値には空白を埋めますが、VARCHAR2列に格納された値にはこれを行いません。そのため、VARCHAR2列の方がCHAR列よりもより効率的に領域を使用します。

  • パフォーマンス

    空白を埋める違いのため、VARCHAR2列のある大規模な表の全表スキャンでは、CHAR列に同じデータが格納されている表の全表スキャンより、読み込むデータ・ブロックが少なくなる可能性があります。アプリケーションが文字データを含む大規模な表に対して全表スキャンを行う場合、CHAR列よりVARCHAR2列にデータを格納することによってパフォーマンスを改善できる可能性が高くなります。

  • 比較セマンティクス

    比較セマンティクスでANSI互換性が必要な場合は、CHARデータ型を使用します。文字列の比較において後続空白が重要である場合は、VARCHAR2データ型を使用します。


    参照:

    これらのデータ型の比較セマンティクスの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

  • 将来の互換性

    CHARデータ型およびVARCHAR2データ型は、完全なサポートが保証されています。現在、VARCHARデータ型はVARCHAR2データ型と同義であるとみなされるため、将来も使用できる予定です。

数値データの表現

数値データを格納するSQLデータ型は、NUMBERBINARY_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言語リファレンス』を参照してください。

内容は次のとおりです。


参照:

  • NUMBERデータ型の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

  • BINARY_FLOATおよびBINARY_DOUBLEデータ型の詳細は、『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進形式

2進形式を使用する浮動小数点数の値は、次に示す算式によって決まります。

(-1)sign 2E (bit0 bit1 bit2 ... bitp-1)

表1-2に、算式の構成要素を示します。

表1-2 浮動小数点2進形式の構成要素

構成要素 構成要素の値

sign

0または1

E (指数)

単精度(32ビット)データ型の場合、-126以上127以下の整数です。

倍精度(64ビット)データ型の場合、-1022以上1023以下の整数です。

biti

0または1(ビットの連続は基数2の数値を表します)。

p (精度)

単精度データ型の場合、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』から引用されています。


参照:

  • 数値のリテラル表現の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

  • 浮動小数点形式の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

  • 浮動小数点条件の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。


ネイティブ浮動小数点形式の特殊な数値

表1-5に、IEEE 754標準がサポートする特殊な数値を示します。

表1-5 ネイティブ浮動小数点形式の特殊な数値

意味

+INF

正の無限大

-INF

負の無限大

NaN

非数

+0

正のゼロ

-0

負のゼロ


表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に変換されます。

  • IEEE 754例外は発生しません。


参照:

浮動小数点条件の詳細は、『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に示す値が生成されます。

表1-6 例外により生成される値

例外

アンダーフロー

0

オーバーフロー

-INF+INF

無効な演算

NaN

ゼロ除算

-INF+INFNaN

不正確

任意の値: 端数処理が実行されました。


ネイティブ浮動小数点データ型のクライアント・インタフェース

Oracle Databaseは、ネイティブ浮動小数点データ型を次のクライアント・インタフェースでサポートします。

  • SQL

  • PL/SQL

  • Oracle Call Interface(OCI)

  • Oracle C++ Call Interface(OCCI)

  • Pro*C/C++

  • JDBC

内容は次のとおりです。

OCIのネイティブ浮動小数点データ型SQLT_BFLOATおよびSQLT_BDOUBLE

OCI APIでは、IEEE 754の単精度および倍精度のネイティブ浮動小数点データ型が実装されており、それぞれのデータ型はSQLT_BFLOATおよびSQLT_BDOUBLEです。これらのデータ型とSQLデータ型BINARY_FLOATおよびBINARY_DOUBLEとの変換は、Cデータ型FLOATおよびDOUBLEに対してIEEE 754標準を実装するプラットフォームで正確に行われます。


参照:

『Oracle Call Interfaceプログラマーズ・ガイド』

ADTでサポートされるネイティブ浮動小数点データ型

Oracle Databaseでは、SQLデータ型BINARY_FLOATおよびBINARY_DOUBLEは、ADTの属性としてサポートされています。

ネイティブ浮動小数点データ型のPro*C/C++サポート

Pro*C/C++では、列データ型BINARY_FLOATおよびBINARY_DOUBLEを使用して、ネイティブFLOATデータ型およびネイティブDOUBLEデータ型がサポートされています。これらのデータ型は、Oracle Database NUMBERデータ型と同じ方法で使用できます。FLOATおよびDOUBLEを、それぞれBINARY_FLOATおよびBINARY_DOUBLEデータ型にバインドできます。そのためには、アプリケーションのコンパイル時に、Pro*C/C++プリコンパイラ・コマンドライン・オプションNATIVE_TYPESY(yes)に設定します。

日時データの表現

Oracle Databaseでは、日時(datetime)データを、独自の内部形式で、世紀、年、月、日、時間、分および秒に対応する7バイトのフィールドに格納します。

表1-7に、SQL日時データ型の概要を示します。日時データ型の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

表1-7 SQL日時データ型

日付タイプ 使用方法

DATE

ある時点(日時)の値を表に格納するために使用します。たとえば、ジョブの日付に使用します。

TIMESTAMP

小数秒を含む正確な日付の値を格納するために使用します。たとえば、発生順序を決定するために比較する必要があるイベントの時間に使用します。

TIMESTAMP WITH TIME ZONE

複数の地域にまたがって収集または調整する必要がある日時の値を格納するために使用します。

TIMESTAMP WITH LOCAL TIME ZONE

タイムゾーンが重要でない場合に日時の値を格納するために使用します。たとえば、テレビ会議のスケジュールを立てるアプリケーションでは、各参加者は自分のタイムゾーンで開始時間および終了時間を確認します。

クライアント・システムのタイムゾーンを使用して日時を表示する必要がある2層アプリケーションに適しています。通常、3層アプリケーションでこのデータ型を使用するのは不適切です。これは、Webブラウザに表示されるデータがブラウザのタイムゾーンではなくWebサーバーのタイムゾーンによって書式化されるためです。Webサーバーはデータベース・クライアントであるため、ローカル時間が使用されます。

INTERVAL YEAR TO MONTH

年および月のみが重要な場合に、2つの日時の値の違いを格納するために使用します。たとえば、アラームを18か月後の日付に設定したり、特定の日付から6か月経過したことを確認できます。

INTERVAL DAY TO SECOND

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.

ヒント:

SYSDATEを使用するコードをテストするときに、SYSDATEを定数に設定できるのは便利です。これには初期化パラメータFIXED_DATEを使用します(『Oracle Databaseリファレンス』を参照)。


参照:

  • SYSDATEの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

  • NLS_DATE_FORMATの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

  • TO_CHARの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

  • 日時書式モデルの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

  • RR日時書式要素の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。


デフォルト以外の書式での日付の表示および挿入

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.

注意:

YY日時書式要素を使用して現在の世紀の年を表示する場合は注意します。たとえば、21世紀では、書式DD-MON-YY31-DEC-92は2092年の12月31日です( 推察のとおり、1992年12月31日ではありません)。年の末尾2桁のみを指定して20世紀の日付を21世紀に格納するには、RR日時書式要素を使用します(デフォルト)。


参照:

  • NLS_DATE_FORMATの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

  • TO_CHARの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

  • TO_DATEの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

  • 日時書式モデルの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

  • RR日時書式要素の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。


デフォルト以外の書式での時刻の表示および挿入

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変換関数

関数 変換元 変換先

NUMTODSINTERVAL

NUMBER

INTERVAL DAY TO SECOND

NUMTOYMINTERVAL

NUMBER

INTERVAL DAY TO MONTH

TO_CHAR

DATE

TIMESTAMP

TIMESTAMP WITH TIME ZONE

TIMESTAMP WITH LOCAL TIME ZONE

INTERVAL DAY TO SECOND

INTERVAL YEAR TO MONTH

VARCHAR2

TO_DATE

CHAR

VARCHAR2

NCHAR

NVARCHAR2

DATE

TO_DSINTERVAL

CHAR

VARCHAR2

NCHAR

NVARCHAR2

INTERVAL DAY TO SECOND

TO_TIMESTAMP

CHAR

VARCHAR2

NCHAR

NVARCHAR2

TIMESTAMP

TO_TIMESTAMP_TZ

CHAR

VARCHAR2

NCHAR

NVARCHAR2

TIMESTAMP WITH TIME ZONE

TO_YMINTERVAL

CHAR

VARCHAR2

NCHAR

NVARCHAR2

INTERVAL DAY TO MONTH


日時データ型のインポートおよびエクスポート

TIMESTAMP WITH TIME ZONEおよび TIMESTAMP WITH LOCAL TIME ZONE値はデータベースに正規化された書式で格納されるため、タイムゾーンのオフセットを考慮することなく、インポート、エクスポートおよび比較ができます。

DATEおよびTIMESTAMP値はデータベースでタイムゾーンを格納しないため、ソース・データベースとターゲット・データベース間のタイムゾーンの違いを考慮して調整する必要があります。

特殊なデータの表現

内容は次のとおりです。

地理データの表現

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は、次の用途にあったORDAudioORDDocORDImageORDImageSignatureORDVideoおよびSI_StillImageADT(メソッドを含む)を提供します。

  • マルチメディア・データからのメタデータと属性の抽出

  • Oracle Multimedia、Webサーバー、ファイル・システムおよび他のサーバーからのマルチメディア・データの取得および管理

  • イメージ・データの操作の実行


参照:

Oracle Multimediaの詳細は、『Oracle Multimediaリファレンス』を参照してください。

大量のデータの表現

大量のデータを表現するために、Oracle Databaseでは次のものが提供されています。

ラージ・オブジェクト(LOB)

ラージ・オブジェクト(LOB)は大量のデータを格納するためのデータ型です(LOBの最大サイズはデータベースの構成方法により異なります)。LOBにデータを格納することで、アプリケーションでデータを効果的にアクセスし操作することができます。

表1-9に、LOBの概要を示します。

表1-9 ラージ・オブジェクト(LOB)

データ型 説明

BLOB

バイナリ・ラージ・オブジェクト

さまざまな種類のバイナリ形式のデータを格納します。

通常、イメージ、音声および映像などのマルチメディア・データに使用されます。

CLOB

キャラクタ・ラージ・オブジェクト

文字列データをデータベース・キャラクタ・セット形式で格納します。

データベース・キャラクタ・セットのみを使用する大量の文字列またはドキュメントに使用されます。

NCLOB

各国語キャラクタ・ラージ・オブジェクト

各国語キャラクタ・セット形式で文字列データを格納します。

各国語キャラクタ・セットの大量の文字列またはドキュメントに使用されます。

BFILE

外部ラージ・オブジェクト

バイナリ・ファイルをホストのオペレーティング・システム・ファイル・システム内のデータベース外に格納します。アプリケーションはBFILEに対し読取り専用のアクセス権を持ちます。

イメージ・データなど、アプリケーションが操作しない静的データに使用されます。

あらゆる種類のデータ(つまりオペレーティング・システム・ファイル)はBFILEに格納できます。たとえば、キャラクタ・データをBFILEに格納し、キャラクタ・セットを指定してBFILEデータをCLOBにロードします。


BLOBCLOBまたはNCLOB型のインスタンスは一時的(アプリケーションのスコープ内で宣言される)か、または永続的(データベースで作成および格納される)のいずれも可能です。


参照:

  • LOBのその他の一般的な情報は、『Oracle Database SQL言語リファレンス』を参照してください。

  • アプリケーション開発でのLOBの使用の詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。


LONGおよびLONG RAWデータ型


注意:

OracleではLONGおよびLONG RAWデータ型を下位互換性のためにサポートしますが、LONG列をLOB列に、LONG RAW列をBLOB列に変換することを強くお薦めします。

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データの表現

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、さまざまな言語で検索または表示できるための文字列の変換用


参照:

  • Oracle XML DBの詳細と、それを使用してXMLデータをデータベースに格納、生成、操作、管理および問合せする方法は、『Oracle XML DB開発者ガイド』を参照してください。

  • XMLを使用したクライアント側プログラミングの詳細は、『Oracle XML Developer's Kitプログラマーズ・ガイド』を参照してください。


動的に型指定されたデータの表現

いくつかの言語では、実行時にデータ型を変更したり、プログラムに変数の型を確認させることができます。たとえば、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.

ANSI、DB2およびSQL/DSデータの表現

表およびクラスタを作成するSQL文は、ANSIデータ型と、IBM社の製品SQL/DSおよびDB2のデータ型を使用できます(次の段落の注意を除く)。Oracle DatabaseはANSIまたはIBMデータ型を対応するOracleデータ型に変換し、Oracleデータ型を列データ型の名前として記録し、列データをOracleデータ型で格納します。変換の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。


注意:

SQL文ではSQL/DSおよびDB2のTIMEGRAPHICVARGRAPHICおよび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)
);

解決方法:

  1. 取引記号、指値、株価の変動額を示す属性を含むデータ型を作成します。

    CREATE OR REPLACE TYPE ticker AS OBJECT (
      symbol VARCHAR2(20),
      price  NUMBER,
      change NUMBER
    );
    /
    
  2. データ型tickerに基づいて属性セットを作成します。

    BEGIN
      DBMS_EXPFIL.DROP_ATTRIBUTE_SET (attr_set  => 'ticker');
    END;
    /
    BEGIN
      DBMS_EXPFIL.CREATE_ATTRIBUTE_SET
      (attr_set  => 'ticker',
      from_type => 'YES');
    END;
    /
    
  3. 次のように、列trader.interestに格納された式セットに属性セットを関連付けます。

    BEGIN
      DBMS_EXPFIL.ASSIGN_ATTRIBUTE_SET
      (attr_set => 'ticker',
      expr_tab => 'traders',
      expr_col => 'interest');
      END;
    /
    

    このコードによって、interest列に有効な条件式が格納されるようになります。

  4. この表に、投資家名、電子メール・アドレス、特定の価格で投資家が関心を持っている株式を表す条件式を移入します。次に例を示します。

    INSERT INTO traders (name, email, interest)
    VALUES ('Vishu', 'vishu@example.com', 'symbol = ''ABC'' AND price > 25');
    
  5. 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言語リファレンス』を参照してください。

ROWID疑似列の問合せ

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.

ROWIDデータ型

Oracle Databaseにより生成されたヒープ構成表では、ROWID疑似列の値のデータ型はROWIDです。内部的に、このデータ型は、データベース・サーバーが行にアクセスするために必要な情報を保持する構造体です。この構造体の形式は、制限付き形式、拡張形式、および外部バイナリ形式のいずれかです。


注意:

ROWID型の列(例1-5col1など)を作成しても、その値が有効なROWIDであるという保証はありません。

内容は次のとおりです。

制限付き内部ROWID形式

制限付き内部形式のROWID構造体は、次のコンポーネントを含みます。

  • データファイル識別子

  • ブロック識別子

  • 行識別子

ほとんどのプラットフォームでは、構造体のサイズは6バイトです。

データベース・サーバーにより、ROWID疑似列は18文字の文字列で、16進数でコード化された各コンポーネントとともに、クライアント・アプリケーションに戻されます。

拡張内部ROWID形式

拡張内部形式のROWID構造体は、制限付き形式と同じコンポーネントとデータとデータ・オブジェクト番号を含みます。これによりデータベース・セグメントが識別されます。ほとんどのプラットフォームでは、この構造体のサイズは10バイトです。

データベース・サーバーにより、ROWID疑似列の値は、18文字の文字列形式で、各コンポーネントをbase 64にエンコードして、クライアント・アプリケーションに戻されます。たとえば、文字列AAAA8mAALAAAAQkAAAは、4つの部分からなる形式OOOOOOFFFBBBBBBRRRの拡張ROWIDのコンポーネントをbase 64にエンコードしたものを表します。

拡張ROWIDの内容をアクセスおよび解析するには、DBMS_ROWIDパッケージを使用します。『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

外部バイナリ内部ROWID形式

一部のクライアント・アプリケーションでは、バイナリ内部形式の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;
}

UROWIDデータ型

外部表(Oracle Databaseにより生成されていない)または索引構成表では、ROWID擬似列の値はUROWIDデータ型になります。このデータ型にはユニバーサルROWID(UROWID)が格納されます。

外部表のUROWID(ゲートウェイを介してアクセスされるDB2表など)は外部ROWIDと呼ばれます。

索引構成表のUROWI(表の行は索引リーフに格納されますが、これは移動できます)は論理ROWIDと呼ばれます。Oracle Databaseでは、論理ROWIDは表の主キーに基づいて作成されます。主キーが変更されていない場合、論理ROWIDは変更されません。

表にUROWIDを格納するには、表に対してUROWIDデータ型の列を定義し、その列にROWID疑似列の値を取り出します。

Oracle Databaseによるデータ型の変換方法

一般には、あるデータ型の値を別のデータ型の変数または列に割り当てる、または別のデータ型の値を使用して式を作成することはできません。しかし、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にこの値を割り当てようとします。

SQL演算子と関数のメタデータ

動的パフォーマンス・ビュー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の詳細は、『Oracle Databaseリファレンス』を参照してください。

  • V$SQLFN_ARG_METADATAの詳細は、『Oracle Databaseリファレンス』を参照してください。


ARGnデータ型

ビューV$SQLFN_METADATAの中で列DATATYPEは、関数のデータ型(つまり、関数が戻すデータ型)です。このデータ型は、Oracleデータ型、データ型ファミリ(「データ型ファミリ」を参照)、またはARGnのいずれかです。ARGnは、関数のn番目の引数のデータ型です。次に例を示します。

  • MAX関数(『Oracle Database SQL言語リファレンス』を参照)は、その最初の引数のデータ型を持つ値を戻すため、MAX関数はデータ型ARG1を戻します。

  • DECODE関数(『Oracle Database SQL言語リファレンス』を参照)は、その3番目の引数のデータ型を持つ値を戻すため、DECODE関数のデータ型は、ARG3です。

DISP_TYPEデータ型

ビューV$SQLFN_METADATAの中では、DISP_TYPEが任意の式を持つ引数のデータ型です。式は、単一の値、または値と単一の値を持つSQL関数の組合せから構成されています。

表1-10 SQL関数の表示タイプ

表示タイプ 説明

NORMAL

FUNC(A,B,...)

LEAST(A,B,C)

ARITHMETIC

A FUNC B)

A+B

PARENTHESIS

FUNC()

SYS_GUID()

RELOP

A FUNC B

A IN B

CASE_LIKE

CASE文またはDECODEデコード


NOPAREN

FUNC

SYSDATE


データ型ファミリ

通常、SQL関数の引数には、データ型ファミリの任意のデータ型を含めることができます。表1-11に、データ型ファミリとそのメンバーのデータ型を示します。

表1-11 データ型ファミリ

ファミリ データ型

STRING

CHARACTER


VARCHAR2


CLOB


NCHAR


NVARCHAR2


NCLOB


LONG

NUMERIC

NUMBER


BINARY_FLOAT


BINARY_DOUBLE

DATETYPE

DATE


TIMESTAMP


TIMESTAMP WITH TIME ZONE


TIMESTAMP WITH LOCAL TIME ZONE


INTERVAL YEAR TO MONTH


INTERVAL DAY TO SECOND

BINARY

BLOB


RAW


LONGRAW