ヘッダーをスキップ
Oracle Databaseアドバンスト・アプリケーション開発者ガイド
11gリリース1(11.1)
E05687-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

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

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

内容は次のとおりです。


関連項目:

  • オブジェクト型、VARRAY、ネストした表などの複合型の詳細は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。

  • LOBデータ型の詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。

  • PL/SQLデータ型の詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。多くのSQLデータ型は、PL/SQLの場合と同じか、または類似しています。


SQLデータ型の概要

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

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

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


関連項目:

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

  • Oracle Databaseによる組込みデータ型またはユーザー定義型との間の変換方法など、外部データ型の詳細は、『Pro*COBOLプログラマーズ・ガイド』および『Pro*C/C++プログラマーズ・ガイド』を参照してください。

  • Oracle Database組込みデータ型の詳細は、『Oracle Database概要』を参照してください。


文字データの表現

内容は次のとおりです。

文字データ型の概要

次のSQLデータ型を使用して英数字データを格納できます。

  • CHARデータ型およびNCHARデータ型は、固定長文字リテラルを格納します。

  • VARCHAR2データ型およびNVARCHAR2データ型は、可変長文字リテラルを格納します。

  • NCHARデータ型およびNVARCHAR2データ型は、Unicode文字データのみを格納します。

  • CLOBデータ型およびNCLOBデータ型は、最大(4GB - 1) * (DBMS_LOB.GETCHUNKSIZEから取得した値)のシングルバイト文字列およびマルチバイト文字列を格納します。

  • LONGデータ型は、最大2GBを含む可変長文字列を格納します。ただし、多くの制限があります。このデータ型は、既存のアプリケーションとの下位互換性を保つためにのみ提供されています。通常、新しいアプリケーションで大量の文字データを格納するには、CLOBデータ型およびNCLOBデータ型を使用し、大量のバイナリ・データを格納するには、BLOBデータ型およびBFILEデータ型を使用します。

  • LONG RAWデータ型は、最大2GBのRAWデータを格納するという点を除いて、RAWデータ型と類似しています。LONG RAWデータ型は、既存のアプリケーションとの下位互換性を保つためにのみ提供されています。


関連項目:

  • LOBデータ型の詳細、およびLONGデータ型からLOBデータ型への移行の詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。

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


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

CHAR列およびVARCHAR2列の長さは、バイト数または文字数として指定できます。NCHAR列およびNVARCHAR2列の長さは、必ず文字単位で指定し、1つの文字が複数バイトで構成される場合にUnicodeデータを格納するために適した長さにします。

次のリストに、列の長さを指定する際の考慮事項を示します。

  • id VARCHAR2(32 BYTE)

    id列に格納されるのは、32バイト以内のシングルバイト・データのみです。

  • name VARCHAR2(32 CHAR)

    name列には、データベース・キャラクタ・セットによるデータが格納されます。データベース・キャラクタ・セットにマルチバイト・キャラクタが含まれる場合は、32バイトを超えても32文字まで格納できます。

  • biography NVARCHAR2(2000)

    biography列では、Unicodeで表現可能な任意の言語による2000文字を表すことができます。エンコーディングは各国語キャラクタ・セットに応じて異なりますが、データベース・キャラクタ・セットがシングルバイトの場合も、列にはマルチバイト値を格納できます。

  • comment VARCHAR2(2000)

    commentが2000バイトとして表されるか2000文字として表されるかは、初期化パラメータNLS_LENGTH_SEMANTICSによって決まります。

マルチバイトのデータベース文字コード体系を使用する場合は、文字データ型の列を持つ表のために必要となる領域を慎重に検討してください。データベースの文字コード体系がシングルバイトである場合、1つの列内のバイト数と文字数は同じです。ただし、マルチバイトの場合は、通常このような対応はありません。1つの文字は、マルチバイト・コード体系と、シフトイン/シフトアウト制御コードの有無に応じて、1バイトで構成される場合と、複数バイトで構成される場合があります。バッファのオーバーフローを回避するため、データベース・キャラクタ・セットと異なるUnicodeエンコーディングを使用する可能性がある場合、データをNCHARまたはNVARCHAR2として指定します。


関連項目:

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

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


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

表の文字数字データを格納する列にどのデータ型を使用するかを決めるには、次の相違点を考慮してください。

  • 使用領域

    データをより効率的に格納するには、VARCHAR2データ型を使用します。CHARデータ型ではすべての列値に空白を埋め込み、固定列長に達するまでの後続空白を格納しますが、VARCHAR2データ型では空白を追加しません。

  • 比較セマンティクス

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

  • 将来の互換性

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

アプリケーションがOracle Databaseとのインタフェースを提供する場合は、クライアント側とサーバー側にキャラクタ・セットがあります。データベース・キャラクタ・セットとユーザー・セッション用に定義されているキャラクタ・セットが異なる場合、Oracle DatabaseではNLS_LANGUAGEパラメータを使用して、CHARVARCHAR2およびLONGデータを前者から後者に自動的に変換します。

Oracle Databaseで文字データの比較に使用される比較セマンティクスは、『Oracle Database SQL言語リファレンス』を参照してください。Oracle Databaseでは、CHAR列に格納されている値には空白を埋めますが、VARCHAR2列に格納された値にはこれを行わないため、VARCHAR2列に格納されている値が占有する領域は、CHAR列に格納された場合より少なくなる可能性があります。このため、VARCHAR2列のある大規模な表の全表スキャンでは、CHAR列に同じデータが格納されている表の全表スキャンより、読み込むデータ・ブロックが少なくなる可能性があります。アプリケーションが文字データを含む大規模な表に対して全表スキャンを行う場合、CHAR列よりVARCHAR2列にデータを格納することによってパフォーマンスを改善できる可能性が高くなります。

使用するデータ型を決定するときに考慮する必要がある要因は、パフォーマンスのみではありません。Oracle Databaseは、各データ型の値を比較するために異なるセマンティクスを使用します。アプリケーションがこれらの比較セマンティクスの相違に敏感な場合、特定のデータ型を選択した方がよい場合があります。たとえば、文字値の比較で、Oracle Databaseに後続空白を無視させる場合は、これらの値はCHAR列に格納する必要があります。


関連項目:

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

SQL文における文字リテラルの使用

多くのSQL文、関数、式および条件では、文字リテラル値が必要です。SQL文における文字リテラルの使用の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

数値データの表現

内容は次のとおりです。

数値データ型の概要

SQLデータ型NUMBERBINARY_FLOAT、およびBINARY_DOUBLEは数値データを格納します。

NUMBERデータ型は、実数を固定小数点形式または浮動小数点形式で格納するために使用します。このデータ型を使用している数値は、様々なOracle Databaseプラットフォーム間で移植性があることが保証され、最大で10進数38桁の精度を提供します。1 x 10-130〜9.99 x10125の正と負の数値および0(ゼロ)を、NUMBER列に格納できます。

BINARY_FLOATデータ型およびBINARY_DOUBLEデータ型は、それぞれ32ビットIEEE 754形式、および倍精度64ビットIEEE 754形式で、浮動小数点データを格納します。浮動小数点データの算術演算は通常、Oracle Database NUMBERデータ型の場合と比較して、BINARY_FLOATおよびBINARY_DOUBLEデータ型で行うほうが、より高速です。また、高精度の値は、BINARY_FLOATおよびBINARY_DOUBLEとして格納するほうが、必要とする領域は少なくなります。

Oracle Databaseでサポートされているクライアント・インタフェースでは、BINARY_FLOATデータ型およびBINARY_DOUBLEデータ型の算術演算は、ハードウェアのベンダーが提供するシステム固有の命令セットによって実行されます。ネイティブ浮動小数点データ型という用語は、BINARY_FLOATおよびBINARY_DOUBLEを含むデータ型、およびサポートされているクライアント・インタフェースで実装されているこれらの型すべてを指します。

浮動小数点記数法は、コンピュータ・システムで数値を表現および操作する一般的な方法です。浮動小数点数は、次の構成要素で表現されます。

  • 2進値符号

  • 符号付き指数

  • 仮数

  • 基数

浮動小数点の値は、次の算式に示すように仮数と指数乗した基数との積に符号が付いたものです。

(-1)sign . significand . base exponent

たとえば、4.31という数は次のように表されます。

(-1)0 . 431 . 10 -2

この表現の構成要素は、次のとおりです。

構成要素の名前 構成要素の値
符号 0
仮数 431
基数 10
指数 -2


関連項目:

  • NUMBERデータ型の内部形式の詳細は、『Oracle Database概要』を参照してください。

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

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


浮動小数点数形式

浮動小数点数形式は、浮動小数点数の構成要素の表記方法を指定するものです。表記方法の選択により、形式が表す値の範囲および精度が決定されます。定義上、範囲とは形式で表すことができる最小値から最大値までの間隔であり、精度とは仮数の桁数です。

浮動小数点の値の形式は、無限精度も無限範囲もサポートしていません。数値を表すのは有限値のビットであり、形式で表すことができるのは有限値の値のみです。指定された形式で使用できるよりも高い精度を使用する浮動小数点数は丸められます。

浮動小数点数は、IEEE 754標準に準拠した2進法、またはOracle Database NUMBERなどの10進法で表すことができます。基数は、数値を丸める方法など、形式の多くのプロパティに影響します。

Oracle Database NUMBERのような10進の浮動小数点数形式の場合、最も近い10進の桁に丸められます(例: 1000、10または0.01)。IEEE 754形式では、浮動小数点の値に2進形式が使用され、数値は最も近い2進の桁に丸められます(1024、512または1/64など)。

データベースでサポートされているネイティブ浮動小数点データ型は、最も近い2進の桁に丸められるため、10進の桁への丸めを必要とするアプリケーションには適していません。浮動小数点データに10進の桁への丸めを必要とするアプリケーションの場合は、Oracle Database NUMBERデータ型を使用してください。

内容は次のとおりです。

浮動小数点2進形式の使用

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

(-1)s 2E (b0 b1 b2 ... bp-1)

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

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

構成要素 指定

s

0または1

E

Emin以上Emax以下の整数(表3-2を参照)

bi

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


仮数の先頭のビットb0は、非正規の数値(後述)の場合を除いて、(1)に設定する必要があります。したがって、先頭のビットは実際には格納されないため、この形式では精度としてNビットを指定しますが、格納されるのはN-1ビットになります。


注意:

IEEE 754仕様では、拡張単精度および拡張倍精度形式も定義されていますが、これらはOracle Databaseではサポートされていません。

これらの形式のパラメータを表3-2に示します。

表3-2 2進形式のパラメータの概要

パラメータ 単精度(32ビット) 倍精度(64ビット)

p

24

53

Emin

-126

-1022

Emax

+127

+1023


形式の記憶域パラメータを表3-3に示します。単精度および倍精度データ型のメモリー内形式は、IEEE 754で指定されます。

表3-3 2進形式の記憶域パラメータの概要

データ型 符号ビット 指数ビット 仮数ビット ビット数合計

単精度

1

8

24(23が格納されます)

32

倍精度

1

11

53(52が格納されます)

64


仮数の先頭ビットが設定されている場合、仮数は正規化されます。IEEE 754では、仮数の暗黙的な先頭ビットが表せない小さい数値を、非正規として定義します。暗黙的な先頭ビットを設定して正規化すると、指数が大きくなりすぎて、数値が非常に小さくなります。IEEE 754形式では、非正規の値がサポートされています。非正規の値では、条件がx - y == 0.0(浮動小数点減算を使用)、結果がx == y、というプロパティが保持されます。

表3-4に、IEEE 754標準で必須の形式、およびOracle Database NUMBERで必須の形式の範囲と精度を示します。範囲の制限は、正数に置き換えて表します。この制限は、負数の絶対値にも適用されます。(ここで使用される「数値e指数」という表記法は、指数乗した10を乗算した数値を表します。数値.10 指数。)

表3-4 IEEE 754形式の範囲および精度

範囲および精度 単精度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言語リファレンス』を参照してください。


ネイティブ浮動小数点形式を使用した特殊な数値の表現

表3-5に、IEEE 754が表現できる特殊な数値を示します。

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

意味

+INF

正の無限大

-INF

負の無限大

NaN

非数

+0

正のゼロ

-0

負のゼロ


NaNは、未定義の演算の結果を表します。IEEE 754には、NaNを表すビット・パターンが多数あります。ビット・パターンでは、符号ビット・セットを使用して、または使用せずにNaNを表すことができます。IEEE 754では、signalling NaNとquiet NaNが区別されます。

IEEE 754では、例外が有効および無効の場合の動作が指定されています。Oracle Databaseでは、例外の有効化は許可されません。データベースの動作は、IEEE 754で指定されている、例外が無効化されている場合の動作になります。特に、Oracle Databaseではsignalling NaNとquiet NaNは区別されません。OCIを使用するプログラマは、Oracle DatabaseからNaN値を取得する可能性があります。取得されるNaN値がsignalling NaNかquiet NaNかは、クライアント・プラットフォームによって決まり、Oracle Databaseの制御外のものです。

IEEE 754では、どちらのNaNタイプのビット・パターンも定義していません。正の無限大、負の無限大、正のゼロおよび負のゼロはそれぞれ、特定のビット・パターンで表現されます。

符号を無視すると値には次のクラスがあり、NaNを除く各クラスは小さい方から順に示されています。

  • ゼロ

  • 非正規

  • 正規

  • 無限大

  • NaN

IEEE 754では、NaNは、他の特殊な値のクラスともNaN自体とも順序付けることはできません。

データベースで使用する場合、ネイティブ浮動小数点データ型の特殊な値は、次のように動作します。

  • NaNはすべてquietです。

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

  • NaNの順序は次のとおりです。

    すべての非NaN < NaN

    任意のNaN == 他のNaN

  • -0は+0に変換されます。

  • NaNはすべて同じビット・パターンに変換されます。


    関連項目:

    NaNと他の値との比較の詳細は、「ネイティブ浮動小数点データ型の比較演算子」を参照してください。

ネイティブ浮動小数点データ型の比較演算子

Oracle Databaseでは、浮動小数点データ型が関係する操作について、次の比較演算子が定義されています。

  • 等しい

  • 等しくない

  • より大きい

  • 以上

  • より小さい

  • 以下

  • 不規則

特殊なケース:

  • 比較では、ゼロの符号は無視されます(-0は、+0より小さいとはみなされず、等しいとみなされます)。

  • Oracle Databaseでは、NaNはそれ自体に等しくなります。NaNは、それ自体を除くすべての値より大きくなります。つまり、xNaNの場合を除いて、NaN == NaNおよびNaN > xになります。


    関連項目:

    特殊な値の比較結果、順序付けおよびその他の動作の詳細は、「ネイティブ浮動小数点形式を使用した特殊な数値の表現」を参照してください。

ネイティブ浮動小数点データ型を使用した算術演算

Oracle Databaseでは、次の算術演算子が用意されています。

  • 乗算

  • 除算

  • 加算

  • 減算

  • 剰余

  • 平方根

演算の結果を丸めるために使用されるモードを定義できます。演算が実行されると、例外が発生することがあります。例外を無効化することもできます。

従来、Javaでは、浮動小数点算術に厳密な再現性が求められていました。IEEE 754にはこの要件はありません。このため、演算(算術を含む)の結果を、演算のオペランドが使用するよりも大きい範囲を使用する格納先に格納できます。

倍精度乗算の結果は、拡張倍精度格納先での計算に使用できます。この場合、計算結果は、格納先が単精度または倍精度であるかのように丸められます。結果の範囲(指数のビット数)としては、より高精度(拡張倍精度)の格納先でサポートされている範囲が使用できます。このため、二重丸め誤差(結果の最下位ビットが不正)が発生する可能性があります。

この問題は、IA-32およびIA-64命令セット・アーキテクチャを実装するハードウェアで、倍精度乗算および除算を実行した場合のみ発生します。したがって、この例外が発生した場合、これらのデータ型に対する算術をプラットフォームを渡って再現できます。計算の結果がNaNの場合、すべてのプラットフォームでIS NANがTRUEの値が作成されます。ただし、すべてのプラットフォームで同じビット・パターンを使用する必要はありません。

ネイティブ浮動小数点データ型の変換関数

Oracle Databaseでは、浮動小数点と他の形式(10進数精度を使用する文字列形式など)の間で変換を行う関数が定義されています(変換中に精度が失われることがあります)。たとえば、次の関数を使用できます。

  • TO_BINARY_DOUBLE。float型からdouble型、decimal型(文字列)からdouble型およびfloatまたはdouble型から整数値のdouble型への変換を実行します。

  • TO_BINARY_FLOAT。double型からfloat型、decimal型(文字列)からfloat型およびfloatまたはdouble型から整数値のfloat型への変換を実行します。

  • TO_CHAR。floatまたはdouble型からdecimal型(文字列)への変換を実行します。

  • TO_NUMBER。float、doubleまたはstring型からnumber型への変換を実行します。

Oracle Databaseでは、変換時に例外が発生する可能性があります。IEEE 754仕様では、次の例外が定義されています。

  • 無効

  • 不正確

  • ゼロ除算

  • アンダーフロー

  • オーバーフロー

Oracle Databaseでは、ネイティブ浮動小数点データ型に対して、これらの例外は発生しません。例外が発生する状況では、通常、表3-6に示す値が生成されます。

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

例外

アンダーフロー

0

オーバーフロー

-INF+INF

無効な演算

NaN

ゼロ除算

-INF+INFNaN

不正確

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


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

Oracle Databaseでは、ネイティブ浮動小数点データ型のサポートは、次のクライアント・インタフェースに実装されています。

  • SQL

  • PL/SQL

  • OCIおよび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プログラマーズ・ガイド』

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

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

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

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

日時データの表現

内容は次のとおりです。

日時データ型の概要

Oracle Databaseでは、次の日時データ型がサポートされています。

  • DATE

    DATEデータ型は、時間の値(日時)を表に格納するために使用します。DATEデータ型は、世紀、年、月、日、時間、分および秒を格納します。

  • TIMESTAMP

    TIMESTAMPデータ型は、小数秒を含む正確な値を格納するために使用します。たとえば、2つのイベントのどちらが最初に発生するかを決定する必要があるアプリケーションでは、TIMESTAMPを使用します。ジョブの時間を指定するアプリケーションでは、DATEを使用します。

  • TIMESTAMP WITH TIME ZONE

    TIMESTAMP WITH TIME ZONEもタイムゾーン情報を格納できるため、特に、複数の地域にまたがって収集または調整する必要がある日付情報の記録に適しています。

  • TIME STAMP WITH LOCAL TIME ZONE

    TIMESTAMP WITH LOCAL TIME ZONE値は、タイムゾーンが重要でない場合に使用します。たとえば、テレビ会議のスケジュールを立てるアプリケーションで使用できます。これらのテレビ会議では、各参加者がローカルのタイムゾーンで開始時間および終了時間を確認します。

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

  • INTERVAL DAY TO SECOND

    INTERVAL DAY TO SECONDデータ型は、2つの日時値の正確な違いを表すために使用します。たとえば、この値を使用して、アラームを36時間後に設定したり、レースの開始から終了までの時間を記録できます。長い時間を高精度で表すには、日の部分に大きな値を使用します。

  • INTERVAL YEAR TO MONTH

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

Oracle Databaseは独自の内部形式で日付を格納します。日付データは、それぞれ7バイトの固定長フィールドに格納され、それぞれのバイトは、世紀、年、月、日、時間、分および秒に対応します。


関連項目:

Oracle Databaseの内部日付書式の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。

現在の日付および時刻の表示

システム日付および時刻に戻すには、SQL関数SYSDATEを使用します。FIXED_DATE初期化パラメータを使用すると、SYSDATEを定数に設定できるため、テスト時に便利です。

デフォルトでは、SYSDATEはBCまたはAD修飾子なしで出力されます。BCを書式文字列に付けると、例3-1のように適切な修飾子付きで日付を出力できます。

例3-1 ADまたはBC修飾子を使用した現在の日付および時刻の表示

SQL> SELECT TO_CHAR(SYSDATE, 'DD-MON-YYYY BC') NOW FROM DUAL;

NOW
--------------
27-SEP-2007 AD

1 row selected.

SQL>

日付の入出力に対するOracle Databaseのデフォルトの標準日付書式は、DD-MON-RRです。RR日時書式要素を使用すると、年の末尾2桁のみを指定して20世紀の日付を21世紀に格納できます。たとえば、'13-NOV-54'という書式は、1950年〜2049年に発行された問合せでは1954年を指しますが、2050〜2099年に発行される問合せでは2054年を指します。


関連項目:

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

デフォルトの日付書式の変更

デフォルトの日付書式を変更するには、次の方法があります。

  • インスタンス全体で変更するには、NLS_DATE_FORMATパラメータを使用します。

  • セッションで変更するには、ALTER SESSION文を使用します。

現行のデフォルト日付書式以外の日付を入力するには、例3-2のように書式マスク付きTO_DATE関数を使用します。

例3-2 デフォルトの日付書式の変更

SQL> SELECT TO_CHAR(TO_DATE('27-OCT-98', 'DD-MON-RR'), 'YYYY') "Year"
  2    FROM DUAL;

Year
----
1998

1 row selected.

SQL>

DD-MON-YYのような日付書式を使用する場合は注意が必要です。YYは、現世紀の年を示します。たとえば、31-DEC-92は、1992年ではなく2092年12月31日を示します。現世紀以外の年を示す場合は、デフォルトでRRなど、異なる書式マスクを使用してください。


関連項目:

ユリウス暦日付については、『Oracle Database概要』を参照してください。Oracle Databaseのユリウス暦は、他の日付アルゴリズムで生成されたユリウス暦と互換性がない場合があります。

デフォルトの時刻書式の変更

時刻は、HH24:MI:SSのように24時間形式で格納されます。

デフォルトでは、時刻部分に何も指定しない場合、またはDATE列を切り捨てる場合、DATE列内の時刻は12:00:00 A.M.(真夜中)となります。

時刻のみの入力では、日付部分は現在の月の最初の日が想定されます。日付の時刻部分を入力するには、例3-3のように、時刻部分を示す書式マスク付きのTO_DATE関数を使用します。

例3-3 デフォルトの時刻書式の変更

SQL> DROP TABLE birthdays;
DROP TABLE birthdays
           *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL>
SQL> CREATE TABLE birthdays (name VARCHAR2(20), day DATE);

Table created.

SQL>
SQL> INSERT INTO birthdays (name, day)
  2    VALUES ('ANNIE',
  3            TO_DATE('13-NOV-92 10:56 A.M.','DD-MON-YY HH:MI A.M.')
  4           );

1 row created.

SQL>

日時データ型を使用した算術演算

Oracle Databaseでは、日付算術に有効な多数の機能が提供されるため、1日の秒数、1か月の日数などを独自に計算する必要はありません。有効な機能の例を次に示します。

  • ADD_MONTHS関数。日付に指定した月数を加算して戻します。

  • SYSDATE関数。データベースが常駐するオペレーティング・システムに設定されている現在の日時を戻します。

  • SYSTIMESTAMP関数。データベースが常駐するシステムのシステム日付(小数秒とタイムゾーンを含む)を戻します。

  • TRUNC関数。DATE値に適用した場合は、時刻部分を切り捨てるため、その日の1番始め(真夜中)を表します。2つのDATE値を切り捨て比較することによって、それらが同じ日を参照しているかどうかを判断できます。また、TRUNCGROUP BY句とともに使用して、日計の作成もできます。

  • 算術演算子(+-など)。たとえば、SYSDATE-7は現在のシステム日付の7日前を指します。

  • INTERVALデータ型。独自の計算を実行するのではなくデータ型日付算術を実行する場合の定数を表すことができます。たとえば、DATE値にINTERVAL定数を加算または減算したり、2つのDATE値を減算して結果をINTERVALと比較できます。

  • 比較演算子(><=BETWEENなど)。

日時データ型間の変換

Oracle Databaseには、日時データ型間で変換できるように複数の有用な関数が用意されています。有効な関数の例を次に示します。

  • EXTRACT。日時値または間隔値の式から指定の日時フィールドの値を抽出して戻します。

  • NUMTODSINTERVALNUMBERまたは暗黙的にNUMBER値に変換できる式を、INTERVAL DAY TO SECONDリテラルに変換します。

  • NUMTOYMINTERVALNUMBERまたは暗黙的にNUMBER値に変換できる式を、INTERVAL YEAR TO MONTHリテラルに変換します。

  • TO_DATE。文字データをDATEデータ型に変換します。

  • TO_CHARDATEデータを文字データに変換します。

  • TO_DSINTERVAL。文字列をINTERVAL DAY TO SECOND値に変換します。

  • TO_TIMESTAMP。文字データをTIMESTAMPデータ型の値に変換します。

  • TO_TIMESTAMP_TZ。文字データをTIMESTAMP WITH TIME ZONEデータ型の値に変換します。

  • TO_YMINTERVAL。文字列をINTERVAL YEAR TO MONTH型に変換します。


    関連項目:

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

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

TIMESTAMP WITH TIME ZONE値およびTIMESTAMP WITH LOCAL TIME ZONE値は常に正規化された書式で格納されるため、タイムゾーンのオフセットを考慮することなくエクスポート、インポートおよび比較ができます。DATE値およびTIMESTAMP値は対応付けられたタイムゾーンを格納しないため、ソース・データベースとターゲット・データベース間のタイムゾーンの違いを考慮して調整する必要があります。

特殊なデータの表現

この項の内容は次のとおりです。

地理データの表現

MDSYS.SDO_GEOMETRYデータ型などの機能を使用して、地理情報システム(GIS)または空間データを表すことができます。オブジェクト・リレーショナル・モデルまたはリレーショナル・モデルを使用して、データベースにデータを格納できます。PL/SQLパッケージのセットを使用して、データを操作および問い合せることができます。


関連項目:

MDSYS.SDO_GEOMETRYの使用方法は、『Oracle Spatial開発者ガイド』を参照してください。

マルチメディア・データの表現

Oracle Multimediaを使用すると、Oracle Databaseで他の企業情報と統合された方法でイメージ、オーディオ、ビデオまたは他の異機種メディア・データを格納、管理および取得できます。Oracle Multimediaにより、Oracle Databaseの信頼性、可用性およびデータ管理が従来型、インターネット、E-Commerceおよびマルチメディア・アプリケーションのマルチメディア・コンテンツへと拡張されます。

この種のマルチメディア・データをBLOB値またはBFILE値としてデータベースに格納したり、Webサーバーまたはその他のサーバーに外部的に格納する場合、Oracle Multimediaを使用して、オブジェクト・リレーショナル・モデルまたはリレーショナル・モデルのいずれかでデータにアクセスし、一連のオブジェクト型を使用してデータを操作および問い合せることができます。

Oracle Multimediaは、次の用途にあったORDAudioORDDocORDImageORDImageSignatureORDVideoおよびSI_StillImageオブジェクト型とメソッドを提供します。

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

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

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


関連項目:

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

大量のデータの表現

Oracle Databaseでは、大量のデータを表現するために複数のデータ型を提供しています。これらのデータ型は、ラージ・オブジェクト(LOB)の一般的なカテゴリでグループ化されます。表3-7に、様々なLOBを示します。

表3-7 ラージ・オブジェクト・データ型

データ型 名前 説明

BLOB

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

イメージ、ビデオ、他のマルチメディア・データなど、大量のバイナリ・データを表します。

CLOB

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

大量の文字データを表します。CLOBデータ型は、データベース・キャラクタ・セットを使用して格納されます。Oracle Databaseには、最大4,000バイトのCLOBVARCHAR2としてインラインで格納されます。この長さを超えるCLOBは、Oracle Databaseで行から移動されます。

NCLOB

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

各国語キャラクタ・セット形式で大量の文字データを表します。

BFILE

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

オブジェクトをオペレーティング・システム・ファイル内のデータベース・ファイル外または表領域外に格納します。BFILEデータ型は読取り専用で、他のLOBデータ型は読取り/書込み可能です。BFILEオブジェクトは、外部LOBと呼ばれることもあります。


BLOBCLOBまたはNCLOBデータ型のインスタンスは、通常のLOBインスタンスまたは一時LOBインスタンスとして存在します。通常のインスタンスと一時インスタンスは、次の点が異なります。

  • 一時LOBインスタンスは、アプリケーションのスコープ内で宣言されます。

  • 通常のLOBインスタンスは、データベースで作成および格納されます。

宣言、解放、作成およびコミットの例外については、通常のLOBインスタンスおよび一時LOBインスタンスでの操作は同じように実行されます。

RAWデータ型およびLONG RAWデータ型は、Oracle Databaseによって解析されない(異なるシステム間でデータを移動するときに変換されない)データを格納します。これらのデータ型は、2進データおよびバイト列のために用意されています。たとえば、LONG RAWは、図形データ、音声データ、文書データおよび2進データの配列に格納できます。解析方法は使用方法によって異なります。

Oracle Net、Export UtilityおよびImport Utilityは、RAWデータまたはLONG RAWデータの送信中は文字変換を行いません。Oracle DatabaseでRAWデータまたはLONG RAWデータとCHARデータ間の変換を自動的に行う場合(INSERT文で文字としてRAWデータを入力する場合など)に、データは、RAWデータの4ビットごとのビット・パターンを表した、1つの16進文字として表現されます。たとえば、ビット11001011の1バイトのRAWデータは、CBとして表示され、入力されます。

LONG RAWデータには索引を付けることができませんが、RAWデータには索引を付けることができます。以前のリリースでは、LONGおよびLONG RAWデータ型は、通常は大量のデータを格納するために使用されていました。新規に開発する場合、これらのデータ型を使用することはお薦めしません。これらのデータ型をアプリケーションで引き続き使用する場合は、LOB型を使用するようにアプリケーションを移行してください。LONG RAW列をバイナリLOB(BLOB)列に変換し、LONG列を文字LOB(CLOBまたはNCLOB)列に変換することをお薦めします。LOB列の制限は、LONG列およびLONG RAW列の制限より少なくなっています。


関連項目:

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

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


検索可能なテキストの表現

全文検索を行うには、低レベルのコードを作成するのではなく、Oracle Textを使用します。Oracle Textを使用すると、検索データが特別な索引に格納され、演算子およびPL/SQLパッケージを使用して検索データを問い合せることができます。このテクノロジによって、表、ファイルまたはURLのデータを使用する独自の検索エンジンの作成、および検索ロジックとリレーショナル問合せの結合が可能になります。この方法では、XPath表記法を使用してXMLデータを検索することもできます。


関連項目:

詳細は、『Oracle Textアプリケーション開発者ガイド』を参照してください。

XMLの表現

XML形式のファイルとして格納されている情報がある場合、またはオブジェクト型を取り、XMLとして格納する場合、XMLType組込み型を使用します。

XMLType列には、データがCLOBまたはバイナリXMLとして格納されます。XMLTypeコンストラクタは、任意のデータ型の既存のオブジェクトをXMLオブジェクトに変換できます。

XMLオブジェクトがデータベース内に入ると、問合せを使用してオブジェクトを検索し(XML XPath表記法を使用する)、データの全体または一部を抽出できます。

既存のリレーショナル・データからXML出力を生成し、リレーショナル表および列にまたがってXML文書を分割することもできます。次のパッケージを使用して、XMLデータをリレーショナル表に、またはリレーショナル表から転送できます。

  • DBMS_XMLQUERY。データベースからXMLTypeへの転送機能を提供します。

  • DBMS_XMLGEN。SQL問合せの結果を標準のXML形式に変換します。

  • DBMS_XMLSAVE。XMLからデータベース型への転送機能を提供します。

次のSQL関数を使用してXMLを処理できます。

  • EXTRACTVARCHAR2 XPath文字列を適用し、XMLフラグメントを含むXMLTypeインスタンスを戻します。

  • SYS_XMLAGG。式で表されるXML文書またはフラグメントをすべて集計し、1つのXML文書を生成します。

  • SYS_XMLGEN。データベースの特定の行および列に評価される式を取り、XML文書を含むXMLType型のインスタンスを戻します。

  • UPDATEXMLXMLTypeインスタンスとXPath値のペアを引数として取り、更新された値とともにXMLTypeインスタンスを戻します。

  • XMLAGG。XMLフラグメントのコレクションを取り、集計されたXML文書を戻します。

  • XMLCOLATTVAL。XMLフラグメントを作成し、作成後のXMLを各XMLフラグメントの名前列に属性値が含まれるように拡張します。

  • XMLCONCAT。入力として一連のXMLTypeインスタンスを取り、各行の一連の要素を連結し、連結後の一連の要素を戻します。

  • XMLELEMENT。識別子の要素名、要素の属性のオプションのコレクションおよび要素のコンテンツを構成する引数を取ります。

  • XMLFOREST。各引数パラメータをXMLに変換し、変換後の引数の連結結果であるXMLフラグメントを戻します。

  • XMLSEQUENCE。入力としてXMLTypeインスタンスを取ってXMLTypeでトップレベル・ノードのVARRAYを戻すか、入力としてREFCURSORインスタンス(およびオプションでXMLFormatオブジェクトのインスタンス)を取り、カーソルの行ごとにXML文書をXMLSequence型として戻します。

    XMLTRANSFORM。引数としてXMLTypeインスタンスとXSLスタイルシートを取り、そのスタイルシートをインスタンスに適用してXMLTypeを戻します。


関連項目:

  • XMLTypeデータ型の詳細は、『Oracle XML DB開発者ガイド』を参照してください。

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

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


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

いくつかの言語では、実行時にデータ型を変更したり、プログラムに変数の型を確認させることができます。たとえば、C言語にはunionキーワードおよびvoid *ポインタがあり、Javaにはtypeof演算子およびNumberなどのラッパー型があります。Oracle Databaseでは、すべての型のデータを保持できる変数および列を作成することができ、データ値をテストして基礎となる表現を判断できます。たとえば、表の単一の列で、数値、文字列およびオブジェクトをそれぞれ別の行に表現できます。

SYS.ANYDATA組込みオブジェクト・タイプを使用すると、すべてのスカラー型またはオブジェクト・タイプの値を表現できます。SYS.ANYDATAには、任意の型のスカラー値を受け取り、スカラーまたはオブジェクトに戻すメソッドがあります。同様に、SYS.ANYDATASET組込みオブジェクト・タイプを使用すると、すべてのコレクション型の値を表現できます。型に関する情報を処理および確認するには、例3-4のようにDBMS_TYPESパッケージを使用します。OCIを使用するときは、OCITypeOCIAnyDataおよびOCIAnyDataSetインタフェースを使用します。


関連項目:

  • DBMS_TYPESパッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

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

  • OCIインタフェースの詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。


例3-4 SYS.ANYDATA列の情報へのアクセス

SQL> CREATE OR REPLACE TYPE employee_type AS
  2    OBJECT (empno NUMBER, ename VARCHAR2(10));
  3  /

Type created.

SQL> CREATE TABLE mytab (id NUMBER, data SYS.ANYDATA);

Table created.

SQL> INSERT INTO mytab
  2    VALUES (1, SYS.ANYDATA.ConvertNumber(5));

1 row created.

SQL> INSERT INTO mytab
  2    VALUES (2, SYS.ANYDATA.ConvertObject(Employee_type(5555, 'john')));

1 row created.

SQL>
SQL> CREATE OR REPLACE PROCEDURE p IS
  2    CURSOR cur IS SELECT id, data FROM mytab;
  3    v_id                        mytab.id%TYPE;
  4    v_data                      mytab.data%TYPE;
  5    v_type                      SYS.ANYTYPE;
  6    v_typecode                  PLS_INTEGER;
  7    v_typename                  VARCHAR2(60);
  8    v_dummy                     PLS_INTEGER;
  9    v_n                         NUMBER;
 10    v_employee                  employee_type;
 11    non_null_anytype_for_NUMBER exception;
 12    unknown_typename            exception;
 13  BEGIN
 14    OPEN cur;
 15    LOOP
 16      FETCH cur INTO v_id, v_data;
 17      EXIT WHEN cur%NOTFOUND;
 18
 19      /* typecode signifies type represented by v_data.
 20         GetType also produces a value of type SYS.ANYTYPE with methods you
 21         can call to find precision and scale of a number, length of a
 22         string, and so on. */
 23
 24      v_typecode := v_data.GetType (v_type /* OUT */);
 25
 26     /* Compare typecode to DBMS_TYPES constants to determine type of data
 27        and decide how to display it. */
 28
 29      CASE v_typecode
 30        WHEN DBMS_TYPES.TYPECODE_NUMBER THEN
 31          IF v_type IS NOT NULL THEN  -- This condition should never happen.
 32            RAISE non_null_anytype_for_NUMBER;
 33          END IF;
 34
 35          -- For each type, there is a Get method.
 36          v_dummy := v_data.GetNUMBER (v_n /* OUT */);
 37          DBMS_OUTPUT.PUT_LINE
 38            (TO_CHAR(v_id) || ': NUMBER = ' || TO_CHAR(v_n) );
 39
 40        WHEN DBMS_TYPES.TYPECODE_OBJECT THEN
 41          v_typename := v_data.GetTypeName();
 42          IF v_typename NOT IN ('HR.EMPLOYEE_TYPE') THEN
 43             RAISE unknown_typename;
 44          END IF;
 45          v_dummy := v_data.GetObject (v_employee /* OUT */);
 46          DBMS_OUTPUT.PUT_LINE
 47            (TO_CHAR(v_id) || ': user-defined type = ' || v_typename ||
 48              ' ( ' || v_employee.empno || ', ' || v_employee.ename || ' )' );
 49      END CASE;
 50    END LOOP;
 51    CLOSE cur;
 52  EXCEPTION
 53    WHEN non_null_anytype_for_NUMBER THEN
 54      RAISE_Application_Error (-20000,
 55        'Paradox: the return AnyType instance FROM GetType ' ||
 56        'should be NULL for all but user-defined types');
 57    WHEN unknown_typename THEN
 58      RAISE_Application_Error( -20000, 'Unknown user-defined type ' ||
 59        v_typename || ' - program written to handle only HR.EMPLOYEE_TYPE');
 60  END;
 61  /

Procedure created.

SQL> SELECT t.data.gettypename() AS "Type Name" FROM mytab t;

Type Name
--------------------------------------------------------------------------------
SYS.NUMBER
HR.EMPLOYEE_TYPE

2 rows selected.

SQL>

ANSI/ISOデータ型、DB2データ型およびSQL/DSデータ型によるデータの表現

Oracle Database内の表の列は、ANSI/ISOデータ型、DB2データ型およびSQL/DSデータ型を使用して定義できます。Oracle Databaseはそのようなデータ型を内部的に変換して、Oracle Databaseデータ型にします。

表3-8に、ANSIデータ型の変換を示します。ANSI/ISOデータ型のNUMERICDECIMALおよびDECは、固定小数点数のみを指定できます。これらのデータ型に対して、sのデフォルトは0です。

表3-8 ANSIデータ型からOracle Databaseデータ型への変換

ANSI SQLデータ型 Oracle Databaseデータ型

CHARACTER (n)

CHAR (n)

CHAR (n)

NUMERIC (p,s)

DECIMAL (p,s)

DEC (p,s)

NUMBER (p,s)

INTEGER

INT

SMALLINT

NUMBER(38)

FLOAT (p)

FLOAT (p)

REAL

FLOAT (63)

DOUBLE PRECISION

FLOAT (126)

CHARACTER VARYING(n)

CHAR VARYING(n)

VARCHAR2 (n)

TIMESTAMP

TIMESTAMP

TIMESTAMP WITH TIME ZONE

TIMESTAMP WITH TIME ZONE


表3-9に、SQL/DSデータ型とDB2データ型の変換を示します。

表3-9 SQL/DSデータ型およびDB2データ型のOracle Databaseデータ型への変換

DB2データ型またはSQL/DSデータ型 Oracle Databaseデータ型

CHARACTER (n)

CHAR (n)

VARCHAR (n)

VARCHAR2 (n)

LONG VARCHAR

LONG

DECIMAL (p,s)

NUMBER ( p,s)

INTEGER

SMALLINT

NUMBER(38)

FLOAT (p)

FLOAT (p)

DATE

DATE

TIMESTAMP

TIMESTAMP


IBM社の製品SQL/DSとDB2のTIMEGRAPHICVARGRAPHICおよびLONG VARGRAPHICデータ型には、対応するOracle Databaseデータ型がないため使用できません。

条件式のデータとしての表現

Oracle Expression Filterの機能により、条件式をデータとしてデータベースに格納できます。Oracle Expression Filterは、VARCHAR2列に制約を設定して、格納された値が有効なSQL WHERE句の式になるようにするメカニズムを提供します。このメカニズムでは、条件式で参照できる属性のセットも識別されます。

シナリオ: 各行に株式取引の口座名義人のデータが含まれる表を作成しました。各投資家が関心を持っている株式の情報を条件式として格納する列を定義しようとしています。

SQL> DROP TABLE traders;
DROP TABLE traders
           *
ERROR at line 1:
ORA-00942: table or view does not exist

SQL> CREATE TABLE traders
  2    (name     VARCHAR2(10),
  3     email    VARCHAR2(20),
  4     interest VARCHAR2(30));

Table created.

SQL>

解決方法:

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

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

    SQL> BEGIN
      2    DBMS_EXPFIL.DROP_ATTRIBUTE_SET (attr_set  => 'ticker');
      3  END;
      4  /
    
    PL/SQL procedure successfully completed.
    
    SQL> BEGIN
      2    DBMS_EXPFIL.CREATE_ATTRIBUTE_SET
      3      (attr_set  => 'ticker',
      4       from_type => 'YES');
      5  END;
      6  /
    
    PL/SQL procedure successfully completed.
    
    SQL>
    
  3. 次のように、データベース列trader.interestに格納された式セットに属性セットを関連付けます。

    SQL> BEGIN
      2    DBMS_EXPFIL.ASSIGN_ATTRIBUTE_SET
      3      (attr_set => 'ticker',
      4       expr_tab => 'traders',
      5       expr_col => 'interest');
      6  END;
      7  /
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

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

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

    SQL> INSERT INTO traders (name, email, interest)
      2    VALUES ('Vishu', 'vishu@example.com', 'symbol = ''ABC'' AND price > 25');
    
    1 row created.
    
    SQL>
    
  5. EVALUATE演算子を使用して、指定したデータ項目をTRUEと評価する条件式を識別します。たとえば、次の問合せでは、株価(symbol='ABC', price=31, change=5.2)に関心を持っている投資家が戻されます。

    SQL> SELECT name, email
      2    FROM traders
      3      WHERE EVALUATE (interest,
      4                      'symbol=>''ABC'',
      5                      price=>31,
      6                      change=>5.2'
      7                     ) = 1;
    
    NAME       EMAIL
    ---------- --------------------
    Vishu      vishu@example.com
    
    1 row selected.
    
    SQL>
    

    このタイプの問合せを高速化するには、interest列にOracle Expression Filter索引を作成できます。


    関連項目:

    Oracle Expression Filterの詳細は、『Oracle Databaseルール・マネージャおよび式フィルタ開発者ガイド』を参照してください。

アドレスによる行の識別

データベース表の各行は、ROWIDと呼ばれるアドレスを持っています。疑似列ROWIDを問い合せると、行アドレスを確認できます。この疑似列の値は、各行のアドレスを表す文字列です。これらの文字列のデータ型はROWIDまたはUROWIDです。また、ROWIDデータ型の実際の列を含む表およびクラスタを作成することもできます。Oracle Databaseでは、この種の列の値が有効なROWIDであるという保証はありません。

ROWID値は、次の理由からアプリケーション開発に重要です。


関連項目:

  • ROWID疑似列およびROWIDデータ型の概要は、『Oracle Database概要』を参照してください。

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


内容は次のとおりです。

ROWID疑似列の問合せ

Oracle Databaseデータベース内の各表は、ROWIDという名前の疑似列を持っています。問合せのSELECTリストまたはWHERE句でROWID擬似列を使用できます。

擬似列はデータベースに格納されないため、値の挿入、更新または削除を行うことはできません。

行が長すぎて単一のデータ・ブロックに格納できない場合、ROWIDによって最初の行断片が識別されます。通常、ROWIDは一意ですが、同じデータ・ブロック内に存在し、異なるクラスタ化表に存在する行の場合、異なる行が同じROWIDを持つ可能性があります。

例3-5では、問合せのSELECTリストでROWID擬似列が使用されています。

例3-5 ROWID擬似列の問合せ

SQL> CREATE TABLE t_tab (col1 ROWID);

Table created.

SQL> INSERT INTO t_tab
  2    SELECT ROWID
  3      FROM employees
  4        WHERE employee_id > 199;

7 rows created.

SQL> SELECT employee_id, rowid
  2    FROM employees
  3      WHERE employee_id > 199;

EMPLOYEE_ID ROWID
----------- ------------------
        200 AAAPeSAAFAAAABTAAC
        201 AAAPeSAAFAAAABTAAD
        202 AAAPeSAAFAAAABTAAE
        203 AAAPeSAAFAAAABTAAF
        204 AAAPeSAAFAAAABTAAG
        205 AAAPeSAAFAAAABTAAH
        206 AAAPeSAAFAAAABTAAI

7 rows selected.

SQL> SELECT * FROM t_tab;

COL1
------------------
AAAPeSAAFAAAABTAAC
AAAPeSAAFAAAABTAAD
AAAPeSAAFAAAABTAAE
AAAPeSAAFAAAABTAAF
AAAPeSAAFAAAABTAAG
AAAPeSAAFAAAABTAAH
AAAPeSAAFAAAABTAAI

7 rows selected.

ROWIDデータ型へのアクセス

索引構成表でも外部表でもない表の場合、ROWID疑似列の値のデータ型はROWIDです。このデータ型には、拡張形式と制限付き形式があります。

内容は次のとおりです。

制限付きROWID

内部的に、ROWIDは、データベース・サーバーが行にアクセスするために必要な情報を保持する構造体です。制限付きの内部ROWIDは、ほとんどのプラットフォームでは6バイトです。制限付きROWIDは、それぞれ次のデータを含みます。

  • データ・ファイル識別子

  • ブロック識別子

  • 行識別子

制限付きROWID疑似列は18文字の文字列形式で、16進数でコード化されたROWIDのデータ・ブロック、行およびデータ・ファイル・コンポーネントとともにクライアント・アプリケーションに戻されます。

拡張ROWID

拡張ROWIDデータ型は、制限付きROWIDのデータとデータ・オブジェクト番号を含みます。データ・オブジェクト番号は、各データベース・セグメントに割り当てられる識別番号です。拡張内部ROWIDは、ほとんどのプラットフォームでは10バイトです。

拡張ROWID疑似列のデータは、18文字の文字列形式(たとえば、AAAA8mAALAAAAQkAAA)でクライアント・アプリケーションに戻されます。この文字列は、4つの部分からなる形式、OOOOOOFFFBBBBBBRRRの拡張ROWIDのコンポーネントをbase 64にエンコードしたものを表します。拡張ROWIDを直接使用することはできません。パッケージDBMS_ROWIDを使用すると、拡張ROWIDの内容を解析できます。このパッケージのファンクションは、制限付きROWIDから直接使用可能な情報を抽出し、拡張ROWID固有の情報とともに提供します。


関連項目:

DBMS_ROWIDパッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

外部バイナリROWID

一部のクライアント・アプリケーションでは、バイナリ形式のROWIDを使用します。たとえば、OCIおよび一部のプリコンパイラ・アプリケーションでは、バインドまたは定義のコールで3GL構造体に対してROWIDデータ型をマップできます。バイナリROWIDのサイズは、拡張および制限付きROWIDのサイズと同じです。拡張ROWID に関する情報は、制限付きROWID構造体の未使用フィールドに入っています。

拡張バイナリROWIDの形式は、Cの構造体で表すと、次のようになります。

struct riddef {
    ub4    ridobjnum; /* data obj#--this field is 
                         unused in restricted ROWIDs */
    ub2    ridfilenum;
    ub1    filler;
    ub4    ridblocknum;
    ub2    ridslotnum;
}

UROWIDデータ型へのアクセス

一部の表の行は、物理的または永続的でないアドレス、あるいはOracle Databaseで生成されたものではないアドレスを持っています。たとえば、索引構成表の行アドレスは索引リーフに格納されますが、これは移動できます。Oracle Databaseでは、この種の表は論理ROWIDと呼ばれる論理行ID付きで提供されます。ゲートウェイを介してアクセスされるDB2の表のような外部表のROWIDは、標準Oracle Database ROWIDではありません。Oracle Databaseでは、外部表とともに外部ROWIDと呼ばれる識別子が提供されます。Oracle Databaseでは、索引構成表と外部表のアドレスはユニバーサルROWID(UROWID)を使用して格納されます。どちらのタイプのUROWIDも、ヒープ構成表の物理ROWIDと同様にROWID疑似列に格納されます。Oracle Databaseでは、論理ROWIDは表の主キーに基づいて作成されます。主キーに変更がないかぎり、論理ROWIDは変更されません。索引構成表のROWID疑似列は、UROWIDデータ型です。この疑似列には、ヒープ構成表のROWID疑似列と同様に(SELECT ROWID文を使用して)アクセスできます。索引構成表のROWIDを格納する場合には、表に対してUROWID型の列を定義し、その列にROWID疑似列の値を取り出します。

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

Oracle Databaseは、あるデータ型のデータを処理する箇所で、別のデータ型のデータを受け入れる場合があります。一般には、1つの式に異なるデータ型の値を含めることはできません。しかし、Oracle Databaseでは、各種SQL関数によって、データを必要なデータ型に自動的に変換できます。


関連項目:

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

内容は次のとおりです。

代入中のデータ変換

Oracle Databaseが、代入する値のデータ型を代入先のデータ型に変換できる場合、代入のデータ型変換は正常に行われます。

次のリストの例では、test_package、パブリック変数var1およびtable1_tabが次のように宣言されています。

SQL> DROP TABLE table1_tab;
DROP TABLE table1_tab
           *
ERROR at line 1:
ORA-00942: table or view does not exist

SQL> CREATE OR REPLACE PACKAGE test_package AS
  2    var1 CHAR(5);
  3  END;
  4  /

Package created.

SQL> CREATE TABLE table1_tab (col1 NUMBER);

Table created.

SQL>
  • variable := expression

    expressionのデータ型は、variableのデータ型と同じか、そのデータ型に変換可能である必要があります。たとえば、次に示す代入では、指定されているデータがストアド・サブプログラム本体内で自動的に変換されます。

    var1 := 0;
    
  • INSERT INTO table1_tab VALUES (expression1, expression2, ...)

    expression1expression2、および後に続くデータ型は、table1_tab中の対応する列のデータ型と同じか、またはそのデータ型に変換可能である必要があります。たとえば、table1_tabに対して発行された次のINSERT文では、指定されているデータが自動的に変換されます。

    INSERT INTO table1_tab VALUES ('19');
    
  • UPDATE table1_tab SET column = expression

    expressionのデータ型は、columnのデータ型と同じか、またはそのデータ型に変換可能である必要があります。たとえば、table1_tabに対して発行された次のUPDATE文では、指定されているデータが自動的に変換されます。

    UPDATE table1_tab SET col1 = '30';
    
  • SELECT column INTO variable FROM table1_tab

    columnのデータ型は、variableのデータ型と同じか、またはそのデータ型に変換可能である必要があります。たとえば、Oracle Databaseでは、表から選択されたデータは、次の文の変数に代入される前に、自動的に変換されます。

    SELECT Col1 INTO Var1 FROM Table1_tab WHERE Col1 = 30;
    

式の評価中のデータ型変換

式の評価では、Oracle Databaseは割当ての場合と同じ変換を自動的に行うことができます。式は、その内容に基づいて特定の型に変換されます。たとえば、算術演算子へのオペランドはNUMBERに変換され、文字列関数へのオペランドはVARCHAR2に変換されます。

Oracle Databaseは、次のような変換を自動的に行うことができます。

  • VARCHAR2またはCHARからNUMBER

  • VARCHAR2またはCHARからDATE

文字列が有効な数値を表している場合にのみ、CHARからNUMBERへの変換が正常に行われます。文字列がNLS_DATE_FORMAT初期化パラメータで指定されたセッションのデフォルト形式を満たす場合にのみ、CHARからDATEへの変換が正常に行われます。

一般的な式は次のとおりです。

  • 次のような単純式

    commission + '500'
    
  • 次のようなブール式

    bonus > salary / '10'
    
  • 次のようなサブプログラム・コール

    MOD (counter, '2')
    
  • 次のようなWHERE句の条件

    WHERE hiredate = TO_DATE('1997-01-01','yyyy-mm-dd')
    
  • 次のようなWHERE句の条件

    WHERE rowid = 'AAAAaoAATAAAADAAA'
    

通常、割当て変換規則が適用されないところでデータ型変換が必要になると、Oracle Databaseは、式評価規則を使用します。

次のような割当ての場合、

variable := expression

Oracle Databaseは、式変換規則を最初に使用して、expressionを評価します。expressionは単純な式でも複雑な式でもかまいません。評価が正常に行われると、結果として単一の値およびデータ型が戻されます。その後、Oracle Databaseは、割当て変換規則を使用して、割当て先の変数にこの値を割り当てようとします。

SQL組込み関数のメタデータ

動的パフォーマンス・ビューV$SQLFN_METADATA(一般的なメタデータを持つ)およびV$SQLFN_ARG_METADATA(引数に関するメタデータを持つ)を使用して、SQL組込み関数のメタデータを表示できます。FUNCID列でこれらのビューを結合できます。V$SQLFN_ARG_METADATAは、LEASTおよびGREATESTのような無制限の引数を持つ関数に対しては、それぞれの反復引数向けに1行のみを含みます。

これらのビューによって、サード・パーティ・ツールは、アプリケーション・レイヤーでメタデータをメンテナンスすることなくSQL組込み関数を活用できます。


関連項目:

動的パフォーマンス・ビューV$SQLFN_METADATAおよびV$SQLFN_ARG_METADATAの詳細は、『Oracle Databaseリファレンス』を参照してください。

通常、SQL組込み関数の引数には、データ型ファミリの任意のデータ型を含めることができます。表3-10は、どのデータ型がどのファミリに属しているかを示します。

表3-10 データ型ファミリ

ファミリ データ型

STRING

CHARACTER


VARCHAR2


CLOB


NCHAR


NVARCHAR2


NCLOB

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


ARGnデータ型

ビューV$SQLFN_METADATAの中でARGnは、戻り値がn番目の引数のデータ型と同じ関数のデータ型です。次に例を示します。

EXPRデータ型

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

表3-11 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