この章では、データベース・アプリケーションにおけるSQLデータ型の使用方法について説明します。
内容は次のとおりです。
関連項目:
|
データ型は、ある限定されたプロパティの集合を、表の列、あるいはサブプログラムの引数に使用できる値と対応付けます。このプロパティの集合によって、Oracle Databaseはあるデータ型の値を別のデータ型の値とは異なるものとして扱うようになります。たとえば、Oracle Databaseは、NUMBER
データ型の値は加算できますが、RAW
データ型の値は加算できません。
Oracle Databaseには、多数の組込みデータ型と、データ型として使用できるユーザー定義型の複数のカテゴリが用意されています。
Oracleプリコンパイラでは、埋込みSQLプログラム内の他のデータ型が認識されます。このようなデータ型は外部データ型と呼ばれ、ホスト変数に関連付けられています。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
データ型は、既存のアプリケーションとの下位互換性を保つためにのみ提供されています。
関連項目:
|
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
として指定します。
関連項目:
|
表の文字数字データを格納する列にどのデータ型を使用するかを決めるには、次の相違点を考慮してください。
使用領域
データをより効率的に格納するには、VARCHAR2
データ型を使用します。CHAR
データ型ではすべての列値に空白を埋め込み、固定列長に達するまでの後続空白を格納しますが、VARCHAR2
データ型では空白を追加しません。
比較セマンティクス
比較セマンティクスでANSI互換性が必要な場合(文字列の比較において後続空白が重要でない(比較対象としない)場合)は、CHAR
データ型を使用します。文字列の比較において後続空白が重要である(比較対象とする)場合は、VARCHAR2
データ型を使用します。
将来の互換性
CHAR
データ型およびVARCHAR2
データ型は、完全なサポートが保証されています。現在、VARCHAR
データ型はVARCHAR2
データ型と同義であるとみなされるため、将来も使用できる予定です。
アプリケーションがOracle Databaseとのインタフェースを提供する場合は、クライアント側とサーバー側にキャラクタ・セットがあります。データベース・キャラクタ・セットとユーザー・セッション用に定義されているキャラクタ・セットが異なる場合、Oracle DatabaseではNLS_LANGUAGE
パラメータを使用して、CHAR
、VARCHAR2
および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データ型NUMBER
、BINARY_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 |
関連項目:
|
浮動小数点数形式は、浮動小数点数の構成要素の表記方法を指定するものです。表記方法の選択により、形式が表す値の範囲および精度が決定されます。定義上、範囲とは形式で表すことができる最小値から最大値までの間隔であり、精度とは仮数の桁数です。
浮動小数点の値の形式は、無限精度も無限範囲もサポートしていません。数値を表すのは有限値のビットであり、形式で表すことができるのは有限値の値のみです。指定された形式で使用できるよりも高い精度を使用する浮動小数点数は丸められます。
浮動小数点数は、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進形式を使用する浮動小数点数の値は、次に示す算式によって決まります。
(-1)s 2E (b0 b1 b2 ... bp-1)
表3-1に、算式の構成要素を示します。
表3-1 2進形式の浮動小数点数の構成要素
構成要素 | 指定 |
---|---|
|
0または1 |
|
|
|
0または1。ビットの連続は、基数2の数値を表します(表3-2を参照)。 |
仮数の先頭のビットb0は、非正規の数値(後述)の場合を除いて、(1)に設定する必要があります。したがって、先頭のビットは実際には格納されないため、この形式では精度としてNビットを指定しますが、格納されるのはN-1ビットになります。
注意: IEEE 754仕様では、拡張単精度および拡張倍精度形式も定義されていますが、これらはOracle Databaseではサポートされていません。 |
これらの形式のパラメータを表3-2に示します。
形式の記憶域パラメータを表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』から引用されています。
関連項目:
|
表3-5に、IEEE 754が表現できる特殊な数値を示します。
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
自体とも順序付けることはできません。
データベースで使用する場合、ネイティブ浮動小数点データ型の特殊な値は、次のように動作します。
Oracle Databaseでは、浮動小数点データ型が関係する操作について、次の比較演算子が定義されています。
等しい
等しくない
より大きい
以上
より小さい
以下
不規則
特殊なケース:
比較では、ゼロの符号は無視されます(-0
は、+0
より小さいとはみなされず、等しいとみなされます)。
Oracle Databaseでは、NaN
はそれ自体に等しくなります。NaN
は、それ自体を除くすべての値より大きくなります。つまり、x
がNaN
の場合を除いて、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に示す値が生成されます。
Oracle Databaseでは、ネイティブ浮動小数点データ型のサポートは、次のクライアント・インタフェースに実装されています。
SQL
PL/SQL
OCIおよび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
は、Oracle Database OBJECT
型の属性としてサポートされています。
Pro*C/C++では、列データ型BINARY_FLOAT
およびBINARY_DOUBLE
を使用して、ネイティブFLOAT
データ型およびネイティブDOUBLE
データ型がサポートされています。これらのデータ型は、Oracle Database NUMBER
データ型と同じ方法で使用できます。ネイティブC/C++データ型FLOAT
およびDOUBLE
を、それぞれBINARY_FLOAT
およびBINARY_DOUBLE
データ型にバインドできます。そのためには、アプリケーションのコンパイル時に、Pro*C/C++プリコンパイラ・コマンドライン・オプションNATIVE_TYPES
をY
(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
値を切り捨て比較することによって、それらが同じ日を参照しているかどうかを判断できます。また、TRUNC
をGROUP BY
句とともに使用して、日計の作成もできます。
算術演算子(+
や-
など)。たとえば、SYSDATE-7
は現在のシステム日付の7日前を指します。
INTERVAL
データ型。独自の計算を実行するのではなくデータ型日付算術を実行する場合の定数を表すことができます。たとえば、DATE
値にINTERVAL
定数を加算または減算したり、2つのDATE
値を減算して結果をINTERVAL
と比較できます。
比較演算子(>
、<
、=
、BETWEEN
など)。
Oracle Databaseには、日時データ型間で変換できるように複数の有用な関数が用意されています。有効な関数の例を次に示します。
EXTRACT
。日時値または間隔値の式から指定の日時フィールドの値を抽出して戻します。
NUMTODSINTERVAL
。NUMBER
または暗黙的にNUMBER
値に変換できる式を、INTERVAL
DAY
TO
SECOND
リテラルに変換します。
NUMTOYMINTERVAL
。NUMBER
または暗黙的にNUMBER
値に変換できる式を、INTERVAL
YEAR
TO
MONTH
リテラルに変換します。
TO_DATE
。文字データをDATE
データ型に変換します。
TO_CHAR
。DATE
データを文字データに変換します。
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言語リファレンス』を参照してください。 |
この項の内容は次のとおりです。
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は、次の用途にあったORDAudio
、ORDDoc
、ORDImage
、ORDImageSignature
、ORDVideo
およびSI_StillImage
オブジェクト型とメソッドを提供します。
マルチメディア・データからのメタデータと属性の抽出
Oracle Multimedia、Webサーバー、ファイル・システムおよび他のサーバーからのマルチメディア・データの取得および管理
イメージ・データの操作の実行
関連項目: Oracle Multimediaの型の詳細は、『Oracle Multimediaリファレンス』を参照してください。 |
Oracle Databaseでは、大量のデータを表現するために複数のデータ型を提供しています。これらのデータ型は、ラージ・オブジェクト(LOB)の一般的なカテゴリでグループ化されます。表3-7に、様々なLOBを示します。
表3-7 ラージ・オブジェクト・データ型
データ型 | 名前 | 説明 |
---|---|---|
イメージ、ビデオ、他のマルチメディア・データなど、大量のバイナリ・データを表します。 |
||
大量の文字データを表します。 |
||
各国語キャラクタ・セット形式で大量の文字データを表します。 |
||
オブジェクトをオペレーティング・システム・ファイル内のデータベース・ファイル外または表領域外に格納します。 |
BLOB
、CLOB
または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
列の制限より少なくなっています。
関連項目:
|
全文検索を行うには、低レベルのコードを作成するのではなく、Oracle Textを使用します。Oracle Textを使用すると、検索データが特別な索引に格納され、演算子およびPL/SQLパッケージを使用して検索データを問い合せることができます。このテクノロジによって、表、ファイルまたはURLのデータを使用する独自の検索エンジンの作成、および検索ロジックとリレーショナル問合せの結合が可能になります。この方法では、XPath表記法を使用してXMLデータを検索することもできます。
関連項目: 詳細は、『Oracle Textアプリケーション開発者ガイド』を参照してください。 |
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を処理できます。
EXTRACT
。VARCHAR2
XPath文字列を適用し、XMLフラグメントを含むXMLType
インスタンスを戻します。
SYS_XMLAGG
。式で表されるXML文書またはフラグメントをすべて集計し、1つのXML文書を生成します。
SYS_XMLGEN
。データベースの特定の行および列に評価される式を取り、XML文書を含むXMLType
型のインスタンスを戻します。
UPDATEXML
。XMLType
インスタンスと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
を戻します。
関連項目:
|
いくつかの言語では、実行時にデータ型を変更したり、プログラムに変数の型を確認させることができます。たとえば、C言語にはunion
キーワードおよびvoid *
ポインタがあり、Javaにはtypeof
演算子およびNumber
などのラッパー型があります。Oracle Databaseでは、すべての型のデータを保持できる変数および列を作成することができ、データ値をテストして基礎となる表現を判断できます。たとえば、表の単一の列で、数値、文字列およびオブジェクトをそれぞれ別の行に表現できます。
SYS
.ANYDATA
組込みオブジェクト・タイプを使用すると、すべてのスカラー型またはオブジェクト・タイプの値を表現できます。SYS
.ANYDATA
には、任意の型のスカラー値を受け取り、スカラーまたはオブジェクトに戻すメソッドがあります。同様に、SYS
.ANYDATASET
組込みオブジェクト・タイプを使用すると、すべてのコレクション型の値を表現できます。型に関する情報を処理および確認するには、例3-4のようにDBMS_TYPES
パッケージを使用します。OCIを使用するときは、OCIType
、OCIAnyData
およびOCIAnyDataSet
インタフェースを使用します。
関連項目:
|
例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>
Oracle Database内の表の列は、ANSI/ISOデータ型、DB2データ型およびSQL/DSデータ型を使用して定義できます。Oracle Databaseはそのようなデータ型を内部的に変換して、Oracle Databaseデータ型にします。
表3-8に、ANSIデータ型の変換を示します。ANSI/ISOデータ型のNUMERIC
、DECIMAL
およびDEC
は、固定小数点数のみを指定できます。これらのデータ型に対して、s
のデフォルトは0です。
表3-8 ANSIデータ型からOracle Databaseデータ型への変換
ANSI SQLデータ型 | Oracle Databaseデータ型 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
表3-9に、SQL/DSデータ型とDB2データ型の変換を示します。
表3-9 SQL/DSデータ型およびDB2データ型のOracle Databaseデータ型への変換
DB2データ型またはSQL/DSデータ型 | Oracle Databaseデータ型 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IBM社の製品SQL/DSとDB2のTIME
、GRAPHIC
、VARGRAPHIC
および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>
解決方法:
取引記号、指値、株価の変動額を示す属性を含むデータ型を作成します。
SQL> CREATE OR REPLACE TYPE ticker AS OBJECT 2 (symbol VARCHAR2(20), 3 price NUMBER, 4 change NUMBER); 5 / Type created. SQL>
データ型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>
次のように、データベース列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
列に有効な条件式が格納されるようになります。
この表に、投資家名、電子メール・アドレス、特定の価格で投資家が関心を持っている株式を表す条件式を移入します。次に例を示します。
SQL> INSERT INTO traders (name, email, interest) 2 VALUES ('Vishu', 'vishu@example.com', 'symbol = ''ABC'' AND price > 25'); 1 row created. SQL>
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値は、次の理由からアプリケーション開発に重要です。
1行にアクセスする最も高速な方法です。
表への行の格納方法を確認できます。
表の行の一意識別子です。
関連項目:
|
内容は次のとおりです。
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
は、ほとんどのプラットフォームでは6バイトです。制限付きROWIDは、それぞれ次のデータを含みます。
データ・ファイル識別子
ブロック識別子
行識別子
制限付きROWID
疑似列は18文字の文字列形式で、16進数でコード化された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
を使用します。たとえば、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; }
一部の表の行は、物理的または永続的でないアドレス、あるいは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は、あるデータ型のデータを処理する箇所で、別のデータ型のデータを受け入れる場合があります。一般には、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
, ...)
expression1
とexpression2
、および後に続くデータ型は、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は、割当て変換規則を使用して、割当て先の変数にこの値を割り当てようとします。
動的パフォーマンス・ビュー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 データ型ファミリ
ファミリ | データ型 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ARGnデータ型
ビューV$SQLFN_METADATA
の中でARG
n
は、戻り値がn番目の引数のデータ型と同じ関数のデータ型です。次に例を示します。
MAX
関数は、その最初の引数のデータ型を持つ値を戻すため、MAX
関数のデータ型はARG1
です。
DECODE
関数は、その3番目の引数のデータ型を持つ値を戻すため、DECODE
関数のデータ型は、ARG3
です。
EXPRデータ型
ビューV$SQLFN_ARG_METADATA
の中では、EXPR
が任意の式を持つ引数のデータ型です。式は、単一の値、または値と単一の値を持つSQL関数の組合せから構成されています。