O
O
r
r
a
a
c
c
l
l
e
e
D
D
a
a
t
t
a
a
b
b
a
a
s
s
e
e
1
1
0
0
g
g
の
の
新
新
し
し
い
い
S
S
Q
Q
L
L
性
性
能
能
:
:
正
正
規
規
表
表
現
現
、
、
ネ
ネ
イ
イ
テ
テ
ィ
ィ
ブ
ブ
値
値
、
、
L
L
O
O
B
B
パ
パ
フ
フ
ォ
ォ
ー
ー
マ
マ
ン
ン
ス
ス
お
お
よ
よ
び
び
そ
そ
の
の
他
他
の
の
機
機
能
能
Geoff Lee, Oracle Corporation Peter Linsley, Oracle Corporation Jonathan Gennick, O'Reilly & Associates
概要
Oracle の SQL エンジンは、すべての Oracle Detabase アプリケーションの基盤です。Oracle SQL はたえず進化を続け、ま すます高度化するデータベース・アプリケーションの増加による拡大する要求に応え、新しい標準ベースのコンピュー ティング・アーキテクチャ、API およびネットワーク・プロトコルの使用を可能にします。
Oracle Database 10g にはいくつかの新しい SQL 機能が導入されており、このことが、Oracle の実装を、最も広く採用され る耐久性のあるコンピューティング・スタンダードの 1 つとしています。このホワイト・ペーパーでは、Oracle Database 10g で SQL に新たに導入された正規表現、ネイティブ値、LOB パフォーマンス、その他の新しい機能および拡張機能に ついて、紹介していきます。新たに組み込まれたこれらの SQL 性能は、高パフォーマンスかつスケーラブルなライフ・ サイエンス、ビジネス・インテリジェンス、コンテンツ管理、E-Business、その他のデータベース・アプリケーションの 開発には欠くことのできない要素です。 以降の項では、次の各項目を詳しく取り上げます。
• Oracle Database 10g の、SQL に対する IEEE/POSIX 標準ネイティブ正規表現サポートの導入。この導入により、デー タベース内のテキストの検索および操作機能を大幅に刷新しています。正規表現は、厳密に書式化されていない自由 形式のテキストを扱う場合、特に役に立ちます。
• IEEE 754 Standard for Binary Floating-Point Arithmetic(バイナリ浮動小数点演算の IEEE754 標準規格)に基づいた、Oracle Database 10g の新しいネイティブ浮動小数点データ型。このデータ型の採用により、XML 標準および Java 標準全般に おける浮動小数点処理パフォーマンスが格段に向上するとともに、必要な記憶領域が大幅に減少します。
• LOB データ型のパフォーマンスの改善。Oracle Database 10g では、非構造データを処理できるよう、スタック全体(SQL レイヤーおよびその API)を通して LOB データ型のパフォーマンスが大幅に改善されています。
さらに、LOB のサイズ制限は、以前の 4 ギガバイトをはるかに上回るテラバイト単位に拡張されました。
• コレクション型の様々な拡張機能。これらの拡張機能により、多様な ANSI SQL 標準 Multiset 型操作と、XML、Java、 ビジネス・インテリジェンスおよび空間データ管理の各アプリケーションで広く使用されるネスト構造データの柔軟 な格納オプションが提供されます。
Oracle Regular Expression
正規表現は、テキスト内の一定のパターンを識別する効果的な方法です。識別するテキストをパターンで表現しますが、 これには、3 文字の単語といった単純なものから、電子メール・アドレスなどの複雑なものまで使用できます。 正規表現を使用したパターン一致は、あらゆるタイプの文字列操作に適用できます。Web アプリケーションでは、中間 層との間で送受信するデータを検証、解析、操作、書式化する際に正規表現による検索が幅広く活用されています。 また、驚くほど多くの中間層処理で、この文字列処理が利用されています。生物情報工学では、この機能を DNA やプロ テイン・シーケンスの識別に役立てています。一方、言語学者は、自然言語の調査に正規表現を使用します。メール・サー バーでの潜在的なスパマーの識別など、サーバー構成はしばしば正規表現の形式で構成されます。おそらく、スパマー自 身も、インターネット・ベースのデータ・ストアから被害者の電子メール・アドレスを簡単に収集するために、正規表現 を使用しているはずです。プロトコル標準や言語標準の多くが、正規表現をフィルタおよび検証の際の構成要素として受 け入れます。つまり、正規表現がもたらす機能性を有効に活用できないアプリケーションなど想像できないということで す。Oracle Regular Expression では、従来に比べさらに複雑なパターンを表現できる高度なメタキャラクタ・セットを提供しま す。これらはすべて、SQL および PL/SQL で使用可能なデータベースに対しネイティブで、既存のソリューションが持っ ていた制限が取り払われています。この機能を活用することで、アプリケーションがより効果的に実行されるようになる だけでなく、データ・フローが改善され、アプリケーション環境がより堅牢になります。
データ・フローの改善
中間層のテクノロジではこれまでも正規表現による検索機能が活用されてきましたが、バックエンド・データベースでの サポートは、非常に有用であるにもかかわらず、しばしば見過ごされてきました。Oracle Regular Expression の導入によっ て、データベース内での文字列操作機能が向上し、任意の層で正規表現ベースの文字列操作を実行できるフレキシビリ ティがもたらされ、データベースがインターネットにより近いものとなります。
Oracle Regular Expression は、データの更新や選択、画面表示のための書式化など、様々なデータ操作シナリオで使用でき ます。次の項では、これらのシナリオについて、データ・フローの観点から説明します。 データベースからクライアントへ Web アプリケーションでは、データベースからのデータをフィルタし、画面表示用に書式化する必要があるため、正規 表現は特に有用です。たとえば、あるアプリケーションが、XXXXXXXXXX の書式の 10 桁数字として CHAR(10)列に 保存されている電話番号を選択するとします。エンド・ユーザーの画面に表示する際は、この列を(XXX)XXX-XXXX という書式に変換する必要があります。この処理が中間層で行われる場合は、同じデータへアクセスする他のクライアン トはその書式化のロジックをコピーする必要があります。DBA(データベース管理者)が SQL*Plus を通じて表を問い合 せる場合などでは、ディスクに保存されている以外の書式で表示するには、独自の書式化操作を適用する必要があります。 ただし、これを行うには、データを使用するすべてのクライアントが、データベース内で電話番号がどのように保存され ているかに関する情報を保持していなければなりません。クライアントでこのような可能性がある場合、バックエンドの
正規表現は、クライアントで必要な行の結果セットをフィルタしたり、絞り込むために使用されることがよくあります。 LIKE 条件を有効にする正規表現(REGEXP_LIKE)を使用すると、このフィルタ処理をデータベース内のデータに対し 直接実行できます。結果として、ネットワーク・フローが最小限に抑えられ、同時に、データの取得作業がデータベース の管理下で、まさにその作業に最適な場所において実行されます。このように、複雑なロジックがデータに近い場所で実 行されることにより、エンド・ユーザーが必要としないデータはデータベースから取り出されず、クライアント側の処理 が減少するため、環境がより安定します。 データベースの更新 Oracle Database 10g では、正規表現の形式で更新を実行できます。これまでは、最も簡単な方法でも、まず問合せセット を選択し、クライアント内で正規表現ベースの更新を実行してから、その結果をデータベースに書き込む必要がありまし た。Oracle Database 10g では、これらの操作をすべて単一の Update 文で実行できます。この方法では、データはデータベー スから取り出されないため、ネットワークの通信量が減少する、セキュリティが強化される、パフォーマンスが向上する などの利点があります。 クライアントからデータベースへ クライアントからデータベースへのデータ・フローでは、主に、格納するデータの検証と書式化で正規表現が活用されま す。 たとえば、クレジット・カードや電子メール・アドレスが一定のパターンと一致するかどうかを検証したり、ユーザーが 入力した電話番号をデータベースでの格納に適した書式に変換するとします。データベースからクライアントへのデー タ・フローと同様、こうした操作は中間層で行うこともできますが、その場合、このロジックにアクセスできるのは中間 層のクライアントのみになります。 列のデータに必要な書式を正規表現で表す場合、その正規表現自体がデータのプロパティなので、クライアント・ロジッ クで具体化させる必要がありません。正規表現の形式で列の制約を定義することで、データのソース元が外部のクライア ントか内部の PL/SQL ルーチンかにかかわりなく、一定のパターンに一致するデータのみが表に取り込まれるようになり、 データベースを保護できます。
前述したこれらのシナリオを考えるとき、Oracle Regular Expression と SQL の組合せが、アプリケーション内の文字列操 作とパターン一致の実行方法を劇的に変える、非常に強力な機能であることがわかります。
Oracle Regular Expression の主な機能
ほとんどの正規表現実装は、ある程度、POSIX 標準に規定されている基本正規表現および拡張正規表現(BRE および ERE) の動作に基づいています。これらは、しばしば、UNIX スタイルの正規表現と呼ばれます。この標準には拡張の余地が多 くあり、ほとんどの正規表現実装はこれを活用しているため、一般に、各実装は互いに異なっています。
Oracle Regular Expression が POSIX ERE 定義を基礎としているのは、この非互換性のためです。このことによって、同じ 標準に準拠する実装での Oracle Regular Expression の動作が保証されます。
インタフェース
Oracle Regular Expression は、SQL および PL/SQL のいずれでも使用可能な次のインタフェースによって実装されます。
SQL 関数 説明 REGEXP_LIKE パターンと一致するかどうかを判定 REGEXP_SUBSTR パターンと一致させる対象の文字列を決定 REGEXP_INSTR 一致が起こった文字列内の位置を判定 REGEXP_REPLACE パターンを検索および置換 有効な引数および構文の詳細は、『SQL リファレンス』の「条件」および「関数」を参照してください。 メタキャラクタ サポートされている全メタキャラクタのリストは、『SQL リファレンス』の付録 C を参照してください。ここでは参照 用に一覧してあるだけで、詳細は説明していません。 構文 説明 分類 . 任意の文字に一致 ドット(Dot) a? 「a」が 0 回または 1 回一致 数量子(Quantifier) a* 「a」が 0 回または複数回一致 数量子(Quantifier) a+ 「a」が 1 回または複数回一致 数量子(Quantifier)
a|b 「a」または「b」に一致 代替(Alternation)
a{m} 「a」が m 回一致 数量子(Quantifier)
a{m,} 「a」が最低 m 回一致 数量子(Quantifier)
a{m,n} 「a」が m 回と n 回の間で一致 数量子(Quantifier)
[abc] 「a」、「b」、「c」のいずれかに一致 ブラケット表現(Bracket Expression)
(…) 式をグループ化 副次式(Subexpression)
\n n 番目の副次式に一致 後方参照(Backreference)
[:cc:] ブラケット表現内の文字クラスに一致 文字クラス(Character Class) [.ce.] ブラケット表現内の照合要素に一致 照合要素(Collation Element) [=ec=] ブラケット表現内の等価クラスに一致 等価クラス(Equivalence Class)
ロケール・サポート
ロケール・サポートとは、所定のプロパティ(キャラクタ・セット、言語、地域およびソート順序)のもとでの正規表現 の動作のことです。正規表現はテキストのマッチングを行うためのものですが、テキストは常に英語とは限りません。
Oracle Regular Expression によるパターン一致では、セッション環境から定義される、基礎にあるロケールが考慮されます。 これは、大文字小文字の区別やアクセントによる区別を行うかどうか、文字が一定範囲内にあることを考慮するかどうか、 どの照合要素を有効とするかなどの、パターン一致機能のあらゆる側面に影響します。たとえば、ドット(.)が現行の キャラクタ・セットでの 1 文字を検出し、データの 1 バイトを検出するわけではないことからもわかるように、エンジン は完全に文字依存です。
Oracle での正規表現の使用
関数の概要この項では、Oracle Regular Expression サポートを提供する関数と、その簡単な使用例を紹介します。
関数はすべて同様の形式を持ち、CHAR、VARCHAR2、CLOB、NCHAR、NVARCHAR および NCLOB の各データ型を サポートします。 REGEXP_LIKE REGEXP_LIKE 条件は、他の REGEXP 関数とは少し異なり、ある文字列内でパターンが一致したかどうかを示すブール 値のみを返します。どのような一致がどこであったかについての詳細は返しません。一致オプションが唯一のオプション 引数で、位置および一致内容はここでは扱われません。 ここで、動詞「fly」の活用形を含む行を検索する式を記述する例を想定してみます。次の正規表現で、「fly」、「flying」、 「flew」、「flown」および「flies」に一致する行を検索できます。
SELECT c1 FROM t1 WHERE REGEXP_LIKE(c1, ‘fl(y(ing)?|(ew)|(own)|(ies))’);
REGEXP_SUBSTR
この関数は、特定のパターンに一致する実際のデータを返します。パターンがどのように一致したかが明確でない場合は、 REGEXP_INSTR を使用して、正確な文字オフセットを取得できます。前述のシナリオを使用すると、次のようになりま す。
SELECT REGEXP_SUBSTR(
‘the bird flew over the river’,
‘fl(y(ing)?|(ew)|(own)|(ies))’) FROM dual; → flew REGEXP_INSTR REGEXP_INSTR 関数は、正規表現による検索を実行して、一致した文字の先頭または末尾の位置を返します。 INSTR と異なり、REGEXP_INSTR は、文字列の末尾からは機能しません。戻り値を分析する場合、返された文字件数の すぐ前の位置に、一致位置を表示すると役立ちます。この関数の結果を他の SQL 関数の入力値として使用する場合、値 を同じように解釈するとは限らないため、注意が必要です。戻り値に関する一般的なシナリオは、後で説明します。
REGEXP_REPLACE
Oracle Regular Expression は、一致により検出したパターンを置換える機能と組み合せたとき、その優秀性が最も明確にな ります。この関数は、正規表現と一致するものを検索し、それを指定したテキスト文字に置換えます。置換えるテキスト 文字には、一致に含まれる副次式への後方参照も含めることができるため、検索操作および置換操作を非常に厳密に制御 できます。 単純な HTML フィルタ REGEXP_REPLACE を使用すると、データの一部分を簡単にフィルタできます。この例を見ると、HTML フィルタがい かに簡単に記述できるかがわかります。
SELECT REGEXP_REPLACE (c1, ‘<[^>]+>’) FROM t1;
後方参照の使用 一致した副次式への参照は置換文字列内で、使用でき、\n として識別されます(このとき、n は、n 番目の副次式の参 照を意味します)。REPLACE 式の一部としてバックスラッシュ(\)を指定するには、バックスラッシュを「\\」と してエスケープする必要があります。
DDL との使用
制約Oracle Regular Expression を使用して、制約に基づいて表への入力を許可するデータをフィルタできます。次の例は、 VARCHAR2 列でアルファベット文字のみを許可するように列を構成する方法を示しています。
この構成によって、句読記号、数字、空白要素などの表への入力がすべて禁止されます。
CREATE TABLE t1 (c1 VARCHAR2(20), CHECK (REGEXP_LIKE(c1, '^[[:alpha:]]+$')));
INSERT INTO t1 VALUES ('newuser'); → 1 row created.
INSERT INTO t1 VALUES ('newuser1'); → ORA-02290:check constraint violated INSERT INTO t1 VALUES ('new-user'); → ORA-02290:check constraint violated
許可するデータに関する記述が列定義と連動し、すべての受信データに対するシールドとして機能するため、データベー スへの送信前にクライアントでデータをフィルタする必要がありません。
索引
普通は、頻繁にアクセスし、簡単に索引付けされる列に索引を作成することで、表へアクセスする時のパフォーマンスを 向上します。Oracle Regular Expression では、列内のデータの開始文字を把握している必要があるため、索引があまり簡単 に使用できません。そのため、列を抽象的なパターンで検索する機能にはあまり適していません。ただし、1 つの問合せ 内で、1 つの列に同じ式が発行されることが予想されるケースでは、機能別索引(functional index)を使用できます。機 能別索引は、次の結果に基づいて作成されます。
CREATE INDEX t1_ind ON t1 (REGEXP_SUBSTR(c1, 'a'));
SELECT c1 FROM t1 WHERE REGEXP_SUBSTR(c1, 'a') = 'a';
ビュー ビューは、問合せサブセットや、エンド・ユーザーへ表示する前のデータの書式化のために、非常に有用なメカニズムで す。この例では、ビューと正規表現を組み合せることで、データを簡単に再書式化できることを示しています。たとえば、 電子メール・アドレスを、判読可能な状態に保ったまま、自動検出されないように改変する必要があるとします。 この場合、1 つの方法として、各文字間にスペースを挿入する方法があります。REGEXP_REPLACE と後方参照を次のよ うに使用して、各文字の後にスペースが入るように置換できます。 CREATE VIEW v1 AS SELECT empno, REGEXP_REPLACE(email, '(.)', '\1 ‘) email FROM emp;
SELECT email FROM v1 WHERE empno = 7369; → j d o e @ s o m e w h e r e . c o m
PL/SQL との使用
Oracle Regular Expression の関数は SQL 文の一部とする必要はなく、PL/SQL の組込み関数として完全にサポートされてい ます。 1 つの例として、指定したデータに対しいくつかの正規表現操作を実行する関数を作成するとします。 この場合、コードは次のようになります。 src := REGEXP_REPLACE (src, ‘<regexp_1>’); src := REGEXP_REPLACE (src, ‘<regexp_2>’); src := REGEXP_REPLACE (src, ‘<regexp_3>’); PL/SQL は、また正規表現の機能性を高める目的にも使用できます。n 番目の副次式を返す関数を作成するために使用で きる PL/SQL の例を次に示します。
CREATE FUNCTION regexp_subx ( input VARCHAR2,
regx VARCHAR2,
subx NUMBER) RETURN VARCHAR2 IS
ret VARCHAR2(4000); BEGIN
ret := REGEXP_SUBSTR (input, regx);
ret := REGEXP_REPLACE (ret, regx, ‘\’ || subx);
RETURN (ret); END regexp_subx; / パフォーマンスに関する配慮 コンパイルやマッチング・ロジック固有の複雑さが原因となって、正規表現機能を使用して行う処理は非正規表現を使用 した場合に比べて実行速度が遅くなる可能性があります。ある式が供給されると、コンパイラがその文字列を内部書式に 変換する処理を開始します。この処理によって、正規表現が確実にエラーのない、正しく書式化されたものになります。 この処理だけでも、特に、(誤った書式の表現が構成されることがあり得ない)LIKE の引数などの解析と比較した場合、 パフォーマンスに対する負担が大きくなる可能性があります。一方、コンパイルされた正規表現が実行時に非常に最適化 されていると、正規表現機能の実行速度が上がることもあります。これは、特に単一の正規表現をベースにした関数では なく、数多くの異なる SQL 条件内に複雑な正規表現を記述する必要がある場合に、特に当てはまります。正規表現機能 では、通常の索引は使用できないことに留意してください。 REGEXP_LIKE は、コンパイル方法が少し異なります。それは、REGEXP_LIKE の一致が発生した位置は識別せず、パター ンの一致が文字列内で発生したかどうかの識別のみを行う処理用に最適化されているためです。このため、 REGEXP_LIKE の処理速度は他の正規表現に比べてかなり速く、処理時間の長い他の正規表現機能の事前処理として利用 できます。
Oracle Regular Expression では、複数の LIKE 文や PL/SQL ロジックを必要とする複雑な式の場合、単一の関数内で同じロ ジックを実行する際は処理速度が大幅に速くなります。ただし、どの程度速くなるかは、使用する正規表現だけでなく、 一致の対象とするデータによっても左右されるため、特定するのは困難です。
正規表現と特定のテキスト・セグメントの組合せによっては、一致の識別を行う対象が膨大な数になり、最悪の場合、す べての対象を処理した挙句、一致が存在しないこともあります。
ネイティブ浮動小数点データ型
Oracle Database 10g では、2 つの新しいネイティブ浮動小数点データ型が導入されています。BINARY_FLOAT データ型お よび BINARY_DOUBLE データ型は、それぞれ 32-bit IEEE 754 形式および倍精度 64-bit IEEE 754 形式で浮動小数点データ を格納します。Oracle NUMBER データ型と比較した場合、通常は、BINARY_FLOAT および BINARY_DOUBLE のほうが、 浮動小数点データに対する算術演算速度が速くなります。また、桁数の多い値は、BINARY_FLOAT および BINARY_DOUBLE に格納すると、スペースの節約になります。 BINARY_FLOAT データ型および BINARY_DOUBLE データ型に対する算術演算(およびデータベースでサポートされてい る関連クライアント・インタフェース)は、ハードウェア・ベンダーから供給されるネイティブな命令セットにより実行 されます。IEEE 754 標準規格に準拠しているため、サポートされているプラットフォーム全体で共通の結果が保証され ます。さらに、ネイティブ浮動小数点データ型には、次のような多くの特長があります。 binary_float または binary_double タイプの列を持つ表を作成できる。 • • • • • • • • • • 選択リストに binary_float や binary_double の列を含めることができる。 binary_float 列および binary_double 列について索引を作成できる。 binary_float 列および binary_double 列に対し、集計がサポートされている。
binary_float および binary_double は、order by 句および group by 句でサポートされている。
binary_float および binary_double の記憶域は、プラットフォームから独立している。
これまでのリリースでは、Oracle RDBMS での数値のデータ型は Oracle Number のみで、すべての算術演算がこのデータ 型を使用して行われています。Oracle Number には、次のような利点があります。
ソフトウェアに実装されているため、ポータブルである。
10 進表記が使用されているため、文字列が数値に変換された場合でも精度が落ちず、丸め処理は 10 進値に対し 行われる。この動作は多くのアプリケーションで必要とされます。
RDBMS で 1 つの数値型のみを使用するように制限することで、ほとんどの算術演算子および数学関数が多重定 義されない。日付データ型を除き、算術は Oracle Number 算術であり、数学関数は Oracle Number を補助するのみ です。より多くのデータ型がサポートされると、算術演算子および数学関数が多重定義され、その結果、多重定 義された演算子および関数を解決する規則によって、算術式評価の実装および記述が複雑になります。
ただし、現在のデータベース・アプリケーションでは、Java や XML が広く使用されています。これらの言語は、IEEE 754
Standard for Binary Floating-Point Arithmetic(バイナリ浮動小数点演算の IEEE754 標準規格)をサポートしています。
さらに、ライフ・サイエンス、OLAP、データ・マイニングなど、多くのデータベース・アプリケーションで、拡張精度 浮動小数点計算が必要とされます。したがって、この新しい数値型が持つ高パフォーマンスで記憶領域の節約にもなる優 れた機能は、多岐にわたるアプリケーションにおいて有用です。BINARY_FLOAT および BINARY_DOUBLE は、Oracle Number に置き換わるものではありません。これらは、Oracle Number と並ぶもう 1 つの選択肢で、次のような利点があり ます。
binary_float および binary_double は、RDBMS クライアントにより使用されるデータ型と適合する。Java および XML スキーマは、どちらも IEEE 754 データ型と等価なデータ型をサポートします。現行では、数値データは Oracle Number として保存する必要があります。Oracle Number への変換により精度が落ち、エラーが増える場合があり ます。Oracle Number では 10 進法を使用しており、binary_float および binary_double では 2 進法を使用しているた
め、精度が落ちる可能性があります。また、Oracle Number によって表される値のセットは、binary_float または binary_double により表される値のサブセットでもスーパーセットでもありません。
binary_float および binary_double のほうが、算術の処理速度が速くなる。処理速度は、Oracle Number での場合に 比べ、5 倍から 10 倍速くなります。 • • • ディスクに値を保存する際、binary_float および binary_double のほうが数バイト小さくなる可能性がある。 Oracle Number では、1∼22 バイト使用します。
IEEE 754 は、数値アルゴリズムの記述に必要な、Oracle Number では提供していない多くの機能を提供する。
浮動小数点数システムの概念
浮動小数点数システムは、コンピュータ・システムで数値を表記および操作するための一般的な方法です。浮動小数点数 は、符号(sign)、符号付指数部(exponent)および仮数(significand)の 3 つの構成要素で表記され、基数(base)の固 定を前提とします。その値は、仮数と指数乗した基数との符号付乗算の結果です。
(-1)sign . significand . base exponent
浮動小数点数書式は、浮動小数点数の 3 つの構成要素の表記方法を指定するものです。表記の指定により、その書式で表 記できる値の範囲および精度が決まります。定義上、値の範囲は書式で表記可能な最小値および最大値の間の範囲であり、 精度は仮数部の桁数です。 浮動小数点値の書式では、無限大精度および無限大範囲のいずれもサポートしません。数の表記にはビット数に制限があ り、書式で表記できるのは制限された数の値のみです。書式で可能な精度よりも高い精度を使用する浮動小数点数は、丸 め処理されます。
浮動小数点の書式
次の表は、IEEE 754 標準規格での必須書式および Oracle NUMBER での必須書式の値範囲および精度を示したものです。 IEEE 754 書式の範囲および精度
範囲および精度 単精度 32 ビット 1 倍精度 64 ビット 1 Oracle NUMBER 正の最大正規数 3.40282347e+38 1.7976931348623157e+308 10e125 正の最小正規数 1.17549435e-38 2.2250738585072014e-308 1e-130 正の最大非正規数 1.17549421e-38 2.2250738585072009e-308 適用なし
正の最小非正規数 1.40129846e-45 4.9406564584124654e-324 適用なし 精度(桁数) 6 - 9 15 - 17 38 - 40
ネイティブ浮動小数点データ型の比較演算子
比較演算子として、等しい(equal to)、等しくない(not equal to)、より大きい(greater than)、以上(greater than or equal
to)、より小さい(less than)、以下(less than or equal to)および順序付けしない(unordered)、が定義されています。
特別なケースとして、次のものがあります。 比較では、0 の符号は無視される(−0 は+0 と等しく、−0 は+0 よりも小さいとは認識されません)。 • • • • • • • •
最低 1 つの演算子が NaN(Not a Number)で、比較演算子が「等しくない(not equal to)」以外の演算子の場合、 すべての比較に false が返される。
最低 1 つの演算子が NaN(Not a Number)で、比較演算子が「等しくない(not equal to)」の場合、すべての比 較に true が返される。
ネイティブ浮動小数点データ型の算術演算子
算術演算子として、乗算、除算、加算、減算、剰余算および平方根が定義されています。演算の結果を丸めるための端数 処理方法を定義できます。演算子の実行時に例外を発生させることができます。また、例外を無効にすることも可能です。 最近まで、Java では、厳密な再現性のために浮動小数点算術を必要としました。IEEE 754 では、そのような動作を必要 としません。IEEE 754 では、算術を含めた演算の結果を、演算で演算子が使用する範囲よりも広い範囲を使用する格納 先へ配布できます。倍精度の乗算の結果を、拡張倍精度の格納先に算出できます。これを行う場合、格納先が単精度また は倍精度であるときと同様、結果を丸める必要があります。ただし、結果の範囲(指数に使用されるビット数)には、格 納先の書式(拡張倍精度)でサポートされている、より広い範囲を使用できます。このことから、丸め処理の重複による エラーが発生し、結果の最後の仮数ビットが正しくなくなる場合があります。 これは、IA-32 および IA-64 命令セット・アーキテクチャを実装しているハードウェア上での倍精度の乗算および除算で のみ起こりうるエラーです。このケースとハードウェアの不具合を例外として、これらのデータ型の算術は、異なるプラッ トフォーム間全体で再現可能です。計算の結果が NaN の場合は、すべてのプラットフォームで、expr IS NAN が true であ る値が生成されます。ただし、すべてのプラットフォームで、同じビット・パターンが生成されるとは限りません。ネイティブ浮動小数点データ型の変換関数
変換関数は、浮動小数点書式と 10 進精度を使用する文字列書式間の変換を行うように、定義されています。精度は変換 処理の間に落ちることがあります。また、変換処理の間に例外を発生させることが可能です。実行できる変換は次のとお りです。 float 型から double 型への変換 double 型から float 型への変換float 型および double 型から decimal 型(文字列)への変換
decimal 型(文字列)から float 型および double 型への変換
ネイティブ浮動小数点データ型をサポートする数値関数
現行の SQL 組込み数値関数(ABS、ACOS など)では、次のように、binary_float データ型および binary_double データ型 をサポートしています。
SQL> select ceil(1.2343243e2F) from dual;
CEIL(1.2343243E2F) --- 1.24E+002
ネイティブ浮動小数点データ型をサポートする集計関数
集計関数は、単一行ではなく行のグループに基づいて、単一の結果行を返します。集計関数は、選択リストや ORDER BY 句および HAVING 句に指定できます。これらは通常、SELECT 文内で GROUP BY 句とともに使用されます。
Oracle では、GROUP BY 句は、問い合せた表またはビューの行をグループに分ける処理に使用しています。GROUP BY 句を含む問合せでは、選択リストの要素は、集計関数、GROUP BY 式、定数、またはこれらのうちの 1 つに関する式で す。Oracle では、集計関数は各行グループに適用され、各グループに対し単一の結果行を返します。 ネイティブ浮動小数点データ型を導入することで、現在、多くの組込み集計関数(AVG、CORR、MAX、MIN、STDDEV など)が、これらの新規導入データ型をサポートしています。
ネイティブ浮動小数点データ型をサポートする分析関数
分析関数は、行のグループに基づいて集計値を算出します。集計関数とは異なり、分析関数は各行に対し複数の行を返し ます。行のグループはウィンドウ(Window)と呼ばれ、分析句により定義されます。各行に対し、行のスライド・ウィ ンドウ(Sliding Window)が定義されます。ウィンドウは、「現行の行」に対する計算の実行で使用する行範囲を決定し ます。ウィンドウのサイズは、物理的な行数または論理的な範囲(時間など)のいずれでも定義できます。分析関数は、最後の ORDER BY 句を除き、問合せで実行される演算の最後です。すべての結合、ならびに WHERE 句、GROUP BY 句、HAVING 句すべてが、分析関数の処理前に完了しています。したがって、分析関数は、選択リストまたは ORDER BY 句にのみ指定できます。分析関数は、一般に、累積集計、移動集計、中央集計およびレポート作成集計の計算に使用 されます。 ネイティブ浮動小数点データ型を導入することで、現在、多くの組込み分析関数(AVG、CORR、MAX、MIN、STDDEV など)が、これらの新規導入データ型をサポートしています。 ネイティブ浮動小数点列に対する制約 多数の制約のうちの 1 つを使用して、整合性制約を定義できます。整合性制約とは、データベース内の値を制限する規則 のことです。Oracle Database 10g では、浮動小数点データ型の列に対し、次の 6 種類の制約を作成します。
• 主キー制約。この制約は、1 つの宣言で NOT NULL 制約と一意制約を組み合せたものです。つまり、複数の行が同じ 列または列の組合せで同じ値を持つこと、および値が NULL になることを禁止します。 • 外部キー制約。この制約は、ある表の値が別の表の値と一致することを要求します。 • CHECK 制約。この制約は、データベースの値が、指定された条件を満たすことを要求します。 • REF 制約。REF 列は、定義上は別のオブジェクト型またはリレーショナル表の中のオブジェクトを参照します。 REF 制約を使用すると、REF 列と参照先のオブジェクトの間の関係をさらに詳しく指定できます。 次の例は、浮動小数点データ型に対しこれらの制約を作成する方法を示したものです。 SQL> create table floating_point_table1 (
fltNnull binary_float constraint flt_null not null, dblNnull binary_double constraint dbl_null not null, fltUnq binary_float constraint flt_unq unique, dblUnq binary_double constraint dbl_unq unique, fltChk binary_float constraint
flt_chk check ( fltChk is not nan ) , dblChk binary_double constraint
dbl_chk check ( dblChk is not infinite) , fltPrm binary_float constraint flt_prm primary key);
Table created.
SQL> create table floating_point_table2 ( dblPrm binary_double constraint dbl_prm primary key, fltFrn binary_float constraint flt_frn references floating_point_table1(fltPrm) on delete cascade); Table created.
ネイティブ浮動小数点データ型のクライアント・インタフェース
SQL、PL/SQL、OCI、OCCI、Pro*C/C++、JDBC および XML(XML スキーマ・マッピング)を含む数多くのクライアン ト・インタフェースに、ネイティブ浮動小数点データ型のサポートが実装されています。 SQL のネイティブ浮動小数点データ型 SQL データ型の BINARY_FLOAT および BINARY_DOUBLE は、SQL 環境にネイティブ浮動小数点データ型を実装します。 また、これらのデータ型で機能する多くの SQL 関数が提供されています。BINARY_FLOAT および BINARY_DOUBLE は、 SQL 構文内の式(expr)が指定されているすべての場所でサポートされます。OCI のネイティブ浮動小数点データ型 SQLT_BFLOAT および SQLT_BDOUBLE
Oracle Call Interface(OCI)アプリケーション・プログラミング・インタフェースは、IEEE 754 単精度および倍精度のネ イティブ浮動小数点データ型を、それぞれ SQLT_BFLOAT データ型および SQLT_BDOUBLE データ型で実装します。 IEEE 754 標準規格の C 言語 float 型および double 型を実装しているプラットフォームでは、OCI データ型(SQLT_BFLOAT および SQLT_BDOUBLE)と SQL データ型(BINARY_FLOAT および BINARY_DOUBLE)間の変換は正確に行われます。
Oracle オブジェクト型でサポートするネイティブ浮動小数点データ型
SQL データ型 BINARY_FLOAT および BINARY_DOUBLE は、Oracle オブジェクト型の属性としてサポートされています。
LOB の拡張機能
一時 LOB のパフォーマンスの改善
Oracle Database 10g リリースでは、Reference on Read and Copy on Write メカニズムの導入により、一時 LOB のパフォーマ ンスおよび記憶要件が大幅に改善されています。このメカニズムの基本概念は、割当て後の LOB 値のディープ・コピー は行わないということにあります。そのかわり、各 LOB について参照件数を記録して、一時 LOB の参照数を把握します。 LOB から新しいコピーが作成されると件数が 1 件増え、LOB のコピーが削除されると 1 件減ります。件数が 0 になった 時点で、一時 LOB が削除されます。つまり、参照が存在する限り、一時 LOB データは保持されます。読取り操作では、 この参照モデルは問題なく機能します。ただし、値セマンティクスを維持するために、LOB を変更した場合には LOB の 新しいコピーを作成する必要があります。新しい LOB は、変更前に作成されたコピーとはまったく関係がなく、そのた め新しい LOB の参照件数は 1 件にリセットされます。 おもに一時 LOB への読取り操作を使用するアプリケーションでは、変数割当ての時や関数コール・パラメータを渡す際 に、ディープ・コピーによってパフォーマンスや記憶領域に負担をかける必要がなくなります。
サイズ制限のない LOB のサポート
これまで LOB データ型(BLOB、CLOB および NCLOB)の最大サイズは 4294967295(4 ギガバイト-1(2^32−1))で、4 バイト unsigned int 型(UB4)のサイズ制限でした。LOB の新しい最大サイズは、(4 ギガバイト−1)*(db_block_size) です。そのため、実際の LOB 最大サイズはデータベースのブロック・サイズによって異なります。たとえば、データベー ス・ブロック・サイズの許容範囲を 2∼32 キロバイトと仮定した場合、サイズ制限は 8∼128 テラバイトになります。 サイズ制限のない LOB(つまり、サイズが 4 ギガバイト以上の LOB)は、次のプログラミング環境でサポートされてい ます。 DBMS_LOB パッケージを使用する PL/SQL 環境 • • •
JDBC(Java Database Connectivity)を使用する Java 環境
サイズ制限のない LOB の最大記憶容量
サポートされている環境では、LOB の作成および操作は、データベース構成の最大記憶域サイズまで実行可能です。 構成の許容最大記憶容量は、データベース・ブロック・サイズ設定内の DB_BLOCK_SIZE 初期化パラメータの値によっ て異なり、DB_BLOCK_SIZE パラメータ値の(4 ギガバイト−1)倍として算出されます。たとえば、データベース・ブロッ ク・サイズの許容範囲を 2∼32 キロバイトと仮定した場合、記憶容量は 8∼128 テラバイトになります。
この記憶容量は、サイズ制限のない LOB をサポートする環境内のすべての LOB 型に対し適用されますが、CLOB 型およ び NCLOB 型は文字数でサイズを測定し、BLOB 型ではバイト数でサイズを測定することに注意してください。
PL/SQL、JDBC および OCI とのサイズ制限のない LOB の使用
現在、サイズ制限のない LOB は、DBMS_LOB PL/SQL パッケージのすべての API でサポートされています。
DBMS_LOB.GET_STORAGE_LIMIT 関数は、データベース構成の記憶容量を返します。また、Oracle JDBC クラスでも、 JDBC 内のすべての LOB ASI でサイズ制限のない LOB をサポートしています。
Oracle Call Interface API は、サイズ制限のない LOB の操作に特化された関数セットを提供します。たとえば、データを挿 入または取得するための、ユーザー定義の読取りおよび書込みコールバック関数が、LOB をストリームするポーリング・ メソッドの代替機能として提供されています。これらの関数の実装はユーザーが行い、OCILobRead()、
OCILobWriteAppend()および OCILobWrite()calls を通じて OCI に登録します。これらのコールバック関数は、必要に応じ て、OCI によりコールされます。4GB より大きいサイズの LOB では、OCILobRead2()、OCIWriteAppend2()および OCILobWrite2()は、パラメータ長さが oraub8 として定義されているコールバック関数を持ちます。
CLOB と NCLOB 間の変換
Unicode とデータベース各国語キャラクタ・セット間のデータ変換は、ますます頻繁に行われるようになっています。 CLOB と NCLOB 間の明示的な変換は、TO_CLOB 関数および TO_NCLOB 関数によって、すでに SQL および PL/SQL で実 行可能です。Oracle Database 10g では、問合せ操作および DML 操作における SQL IN および OUT バインド変数の暗黙的 な変換、PL/SQL 関数およびプロシージャのパラメータ渡しの暗黙的な変換、および PL/SQL 変数割当ての暗黙的な変換 が、それぞれ導入されています。たとえば、次のシナリオでは、変換は完全に透過的です。
例 1
CREATE TABLE my_table (nclob_col NCLOB);
DECLARE
clob_var CLOB; nclob_var NCLOB; BEGIN
clob_var := 'clob data'; -- initialize the CLOB value; -- Bind a CLOB into an NCLOB column
INSERT INTO my_table VALUES (clob_var); SELECT nclob_col
INTO clob_var
FROM my_table; -- Define an NCLOB column as a CLOB var END;
例 2
CREATE FUNCTION TRY_ME (a IN CLOB) RETURN NCLOB is BEGIN RETURN a; END; / DECLARE clob_var CLOB; nclob_var NCLOB; BEGIN
nclob_var:= 'nclob data';
/* Pass an NCLOB into a function which takes a CLOB Return an NCLOB variable to a CLOB variable. */ clob_var:=TRY_ME(nclob_var); end; / キャラクタ・セットの変換を伴う BFILE の CLOB/NCLOB へのロード 外部の BFILE 型データをデータベース LOB へロードする際は注意が必要です。ロード元とロード先のキャラクタ・セッ ト幅または文字幅の制約のために、データが読取り不可能になる可能性があるからです。新しい LOADFROMFILE2()プ ロシージャは、文字データの CLOB または NCLOB へのロードに関し、より優れた機能性を提供します。 このプロシージャは、DBMS_LOB パッケージおよび OCI で使用できます。
LOADFROMFILE2()プロシージャを使用すると、csid(キャラクタ・セット ID)パラメータを通じて BFILE のキャラク タ・セットを指定できます。CLOB または NCLOB の場合は、この新しいプロシージャを使用して、指定した外部の BFILE キャラクタ・セットから CLOB で使用しているデータベース・キャラクタ・セットまたは NCLOB 用のデータベース各 国語キャラクタ・セットへ、データを変換できます。ロード元(BFILE)とロード先(内部 LOB)が同じ幅の固定幅キャ ラクタ・セットである場合は、変換は行われません。ロード先のキャラクタ・セットの幅が固定されていない場合、デー タベースでは可変幅データは UCS2 形式で格納されるため、データは UCS2(2 バイト Unicode)形式に変換されます。 キャラクタ・セットを指定しない場合は、CLOB では現行のデータベース csid が、NCLOB ではデータベース各国語 csid が、それぞれデフォルトで使用されます。
ロード元: BFILE CharacterSet1 ロード先: LOB CharacterSet2 キャラクタ・セットの変換 (変換前 → 変換後)
固定幅 固定幅 cs1 → cs2 if (cs1!=cs2)
可変幅 固定幅 cs1 → cs2
LOB および可変幅 LOB 記憶域でのトランスポータブル表領域のサポート
Oracle Database 10g では、クロス・プラットフォーム・ポータブル表領域機能によって、異なるプラットフォーム上の 独立したデータベース間で表領域を移動できます。コレクション拡張機能
ネストした表を格納する表領域の指定
ネストした表を、その親表以外の表領域に格納できます。次の SQL 文では、ネストした表が users 表領域に格納されます。 CREATE TABLE people_tab (people_column people_typ )
NESTED TABLE people_column STORE AS people_column_nt (TABLESPACE users);
TABLESPACE 句を指定しない場合は、ネストした表の記憶表は親表がある表領域内に作成されます。表が複数のレベル にネストされている場合は、直近の親表と同じ表領域に子表が作成されます。
ALTER TABLE MOVE 文を発行することで、表を異なる表領域に移動できます。ネストした表の列がある表に対し ALTER TABLE MOVE 文を発行すると、親表のみが移動し、ネストした表の記憶表については操作が行われません。
ネストした表の記憶表を異なる表領域に移動するには、次のように、記憶表に対して ALTER TABLE MOVE 文を発行し ます。
ALTER TABLE people_tab MOVE TABLESPACE users;
ALTER TABLE people_column_nt MOVE TABLESPACE example;
これで people_tab 表は users 表領域に、ネストした表は example 表領域に、それぞれ保存されます。
ネストした表のための ANSI SQL 標準の多重集合(MULTISET)操作
Oracle Database 10g では、NESTED TABLE コレクション型用の多重集合(MULTISET)演算子を数多くサポートしてい ます。実際のアプリケーションでは、コレクション型は抑止関係のモデル化に使用されています。コレクション型用の比 較演算子および集合演算子は、これらのアプリケーションにおける強力なツールです。Oracle では、VARRAY および NESTED TABLE の 2 つのコレクション・データ型をサポートしています。 ネストした表は、順序付けされていない、すべて同じデータ型のデータ要素のセットです。表の定義にはネストの最大数 は指定されておらず、要素の順序も保存されていません。 ネストした表の要素は、実際は、各要素が属している親表行や親オブジェクトを識別する列を含む、別個の記憶表に格納 されています。ネストした表にある列は 1 つで、その列のタイプは組込みタイプまたはオブジェクト・タイプのいずれか です。ネストした表の列がオブジェクト・タイプの場合、その表は、オブジェクト・タイプの各属性の列とともに、複数 列表としても表示できます。
ネストした表の比較
等価および不等価の比較 等価(=)および不等価(<>)条件では、入力した 2 つのネストした表が等しいかどうかを判定します。 結果はブール値で返されます。 2 つのネストした表が、同じ名前のタイプおよび同じカーディナリティを持ち、その要素が等しい場合には、それらの表 は等しいとされます。 要素は、マップ・メソッドを必要とするオブジェクト・タイプを除き、要素自体の等価性定義が等しいかどうかによって、 等しいかどうかが決まります。 たとえば、次のようになります。CREATE TYPE person_typ AS OBJECT ( idno NUMBER,
name VARCHAR2(30), phone VARCHAR2(20),
MAP MEMBER FUNCTION get_idno RETURN NUMBER ); /
CREATE TYPE BODY person_typ AS
MAP MEMBER FUNCTION get_idno RETURN NUMBER IS BEGIN
RETURN idno; END;
END; /
CREATE TYPE people_typ AS TABLE OF person_typ; /
CREATE TABLE students ( graduation DATE,
math_majors people_typ, chem_majors people_typ, physics_majors people_typ)
NESTED TABLE math_majors STORE AS math_majors_nt NESTED TABLE chem_majors STORE AS chem_majors_nt
NESTED TABLE physics_majors STORE AS physics_majors_nt;
INSERT INTO students (graduation) VALUES ('01-JUN-03'); UPDATE students
physics_majors =
people_typ (person_typ(12, 'Bob Jones', '111-555-1212'), person_typ(45, 'Chris Woods', '111-555-1213')) WHERE graduation = '01-JUN-03';
SELECT p.name
FROM students, TABLE(physics_majors) p WHERE math_majors = physics_majors;
no rows selected この例では、ネストした表に、マップ・メソッドが関連付けられる person_typ オブジェクトがあります。 IN 条件による比較 IN 条件では、ネストした表がネストした表のリスト内にあるかどうかを確認します。結果はブール値で返されます。 ネストした表が存在しない(空の)ネスト表の場合は、NULL が返されます。 たとえば、次のようになります。 SELECT p.idno, p.name
FROM students, TABLE(physics_majors) p
WHERE physics_majors IN (math_majors, chem_majors);
no rows selected 多重集合のサブセットの比較 SUBMULTISET [OF]条件では、ネストした表が別のネストした表のサブセットかどうかを確認します。 結果はブール値で返されます。OF キーワードはオプションで、SUBMULTISET だけを使用した場合と機能は同じです。 この演算子は多重集合演算にのみ使用されるので、ネストした表用にのみ実装されています。 たとえば、次のようになります。 SELECT p.idno, p.name
FROM students, TABLE(physics_majors) p
WHERE physics_majors SUBMULTISET OF math_majors;
IDNO NAME
--- --- 12 Bob Jones
ネストした表のメンバーの比較
MEMBER [OF]または NOT MEMBER [OF]条件では、ある要素がネストした表のメンバーかどうかを確認します。 結果はブール値で返されます。OF キーワードはオプションで、結果には影響しません。
たとえば、次のようになります。 SELECT graduation FROM students
WHERE person_typ(12, 'Bob Jones', '1-800-555-1212') MEMBER OF math_majors;
GRADUATION --- 01-JUN-03
このとき、person_typ (12, 'Bob Jones', '1-800-555-1212')は、ネストした表 math_majors の要素と同じ タイプの要素です。
空の比較
IS [NOT] EMPTY 条件では、NULL 要素があるかどうかにかかわらず、ネストした表が空か空でないかを確認します。 ネストした表に対し NULL が与えられている場合、結果は NULL になります。結果はブール値として返されます。
SELECT p.idno, p.name
FROM students, TABLE(physics_majors) p WHERE physics_majors IS NOT EMPTY;
IDNO NAME --- --- 12 Bob Jones 45 Chris Woods 集合(要素の一意性)の比較 IS [NOT] A SET 条件では、ネストした表が一意の要素で構成されているかどうかを確認します。 結果はブール値で返されます。 たとえば、次のようになります。 SELECT p.idno, p.name
FROM students, TABLE(physics_majors) p WHERE physics_majors IS A SET;
多重集合(MULTISET)演算 CARDINALITY
CARDINALITY 関数は、VARRAY またはネストした表内の要素の数を返します。戻り型は数値型(NUMBER)です。 VARRAY またはネストした表が NULL コレクションの場合は、NULL が返されます。
たとえば、次のようになります。 SELECT CARDINALITY(math_majors) FROM students; CARDINALITY(MATH_MAJORS) --- 3 COLLECT COLLECT 関数は、要素のセットから多重集合を作成する集計関数です。この関数は、要素型の列を入力として受け取り、 選択された行から多重集合を作成します。結果を取得するには、この関数を CAST 関数内で使用し、出力タイプを COLLECT に指定する必要があります。 MULTISET EXCEPT MULTISET EXCEPT 演算子では、2 つのネストした表が入力され、1 番目のネストした表には存在するが 2 番目のネスト した表には存在しない要素で構成される、ネストした表が返されます。入力するネストした表と結果として返されるネス トした表は、すべて同じタイプ名です。
この演算子には、ALL または DISTINCT オプションが使用できます。デフォルトは ALL です。
ALL オプションでは、たとえば ntab1 MULTISET EXCEPT ALL ntab2 という指定の場合、ntab2 内の要素以外の ntab1 内のすべての要素が、結果として含まれます。特定の要素が、ntab1 で m 回、ntab2 で n 回それぞれ出現する場合、結 果の表では、m が n より大きいときはその要素が(m – n)回出現し、それ以外のときはその要素は出現しません。 DISTINCT オプションでは、出現の回数にかかわりなく、ntab1 に存在し、ntab2 にも存在する要素はすべて除外され ます。
たとえば、次のようになります。
SELECT math_majors MULTISET EXCEPT physics_majors FROM students
WHERE graduation = '01-JUN-03';
MATH_MAJORSMULTISETEXCEPTPHYSICS_MAJORS(IDNO, NAME, PHONE)
--- PEOPLE_TYP(PERSON_TYP(31, 'Sarah Chen', '111-555-2212'))
MULTISET INTERSECTION
MULTISET INTERSECT 演算子は、入力する2 つのネストした表に共通する値で構成される、ネストした表を返します。 入力するネストした表と結果として返されるネストした表は、すべて同じタイプ名です。
この演算子には、ALL または DISTINCT オプションが使用できます。デフォルトは ALL です。ALL オプションでは、特 定の値が ntab1 で m 回、ntab2 で n 回それぞれ出現する場合、結果にはその要素が MIN (m, n)回出現します。 DISTINCT オプションでは、NULL 値の重複(存在する場合)も含め、結果内の重複分は削除されます。
たとえば、次のようになります。
SELECT math_majors MULTISET INTERSECT physics_majors FROM students
WHERE graduation = '01-JUN-03';
MATH_MAJORSMULTISETINTERSECTPHYSICS_MAJORS(IDNO, NAME, PHONE) --- PEOPLE_TYP(PERSON_TYP(12, 'Bob Jones', '111-555-1212'),
PERSON_TYP(45, 'Chris Woods', '111-555-1213'))
MULTISET UNION
MULTISET UNION 演算子は、入力した2 つのネストした表に含まれている値で構成される、ネストした表を返します。 入力するネストした表と結果として返されるネストした表は、すべて同じタイプ名です。
この演算子には、ALL または DISTINCT オプションが使用できます。デフォルトは ALL です。ALL オプションでは、NULL のすべての重複を含め、ntab1 および ntab2 に含まれるすべての要素が結果の要素になります。特定の値が ntab1 で m 回、ntab2 で n 回それぞれ出現する場合は、結果にはその要素が(m + n)回出現します。DISTINCT オプションでは、 NULL 値の重複(存在する場合)も含め、結果内の重複分は削除されます。
たとえば、次のようになります。
SELECT math_majors MULTISET UNION DISTINCT physics_majors FROM students
WHERE graduation = '01-JUN-03';
MATH_MAJORSMULTISETUNIONDISTINCTPHYSICS_MAJORS(IDNO, NAME, PHONE) --- PEOPLE_TYP (PERSON_TYP(12, 'Bob Jones', '111-555-1212'),
PERSON_TYP(31, 'Sarah Chen', '111-555-2212'), PERSON_TYP(45, 'Chris Woods', '111-555-1213'))
SELECT math_majors MULTISET UNION ALL physics_majors FROM students
WHERE graduation = '01-JUN-03';
POWERMULTISET
POWERMULTISET 関数は、指定した多重集合から、空以外のすべてのサブ多重集合を生成します。
POWERMULTISET 関数には、多重集合を評価する任意の式を入力できます。多重集合引数のカーディナリティの制限は 32 です。
たとえば、次のようになります。
SELECT * FROM TABLE(POWERMULTISET( people_typ (
person_typ(12, 'Bob Jones', '1-800-555-1212'), person_typ(31, 'Sarah Chen', '1-800-555-2212'), person_typ(45, 'Chris Woods', '1-800-555-1213'))));
COLUMN_VALUE(IDNO, NAME, PHONE)
--- PEOPLE_TYP (PERSON_TYP(12, 'Bob Jones', '1-800-555-1212')) PEOPLE_TYP (PERSON_TYP(31, 'Sarah Chen', '1-800-555-2212')) PEOPLE_TYP (PERSON_TYP(12, 'Bob Jones', '1-800-555-1212'),
PERSON_TYP(31, 'Sarah Chen', '1-800-555-2212')) PEOPLE_TYP (PERSON_TYP(45, 'Chris Woods', '1-800-555-1213')) PEOPLE_TYP (PERSON_TYP(12, 'Bob Jones', '1-800-555-1212'), PERSON_TYP (45, 'Chris Woods', '1-800-555-1213'))
PEOPLE_TYP (PERSON_TYP(31, 'Sarah Chen', '1-800-555-2212'), PERSON_TYP(45, 'Chris Woods', '1-800-555-1213')) PEOPLE_TYP (PERSON_TYP(12, 'Bob Jones', '1-800-555-1212'),
PERSON_TYP(31, 'Sarah Chen', '1-800-555-2212'), PERSON_TYP(45, 'Chris Woods', '1-800-555-1213'))
7 rows selected.
POWERMULTISET_BY_CARDINALITY
POWERMULTISET_BY_CARDINALITY 関数は、指定したカーディナリティのネストした表の、空以外のすべてのサブ多 重集合を返します。ネストした表の行が、結果として返されます。
POWERMULTISET_BY_CARDINALITY(x, l)は TABLE(POWERMULTISET(x)) p where CARDINALITY(value(p)) = l と等価です(このとき、「x」は多重集合で、「1」は指定したカーディナリティです)。
POWERMULTISET_BY_CARDINALITY への最初の入力パラメータとして、ネストした表を評価する任意の式を使用でき ます。長さのパラメータは正の整数である必要があります。そうでない場合、エラーが返されます。ネストした表のカー ディナリティの制限は 32 です。
たとえば、次のようになります。
SELECT * FROM TABLE(POWERMULTISET_BY_CARDINALITY( people_typ ( person_typ(12, 'Bob Jones', '1-800-555-1212'),
person_typ(31, 'Sarah Chen', '1-800-555-2212'), person_typ(45, 'Chris Woods', '1-800-555-1213')),2));
COLUMN_VALUE(IDNO, NAME, PHONE)
---
PEOPLE_TYP(PERSON_TYP(12, 'Bob Jones', '1-800-555-1212'), PERSON_TYP(31, 'Sarah Chen', '1-800-555-2212'))
PEOPLE_TYP(PERSON_TYP(12, 'Bob Jones', '1-800-555-1212'), PERSON_TYP(45, 'Chris Woods', '1-800-555-1213'))
PEOPLE_TYP(PERSON_TYP(31, 'Sarah Chen', '1-800-555-2212'), PERSON_TYP(45, 'Chris Woods', '1-800-555-1213')) SET SET 関数は、ネストした表の重複を除去したセットに変換し、要素が互いに一意(DISTINCT)であるネストした表を返 します。結果として返されるネストした表は、入力するネストした表と同じ名前のタイプです。 たとえば、次のようになります。 SELECT SET(physics_majors) FROM students
WHERE graduation = '01-JUN-03';
SET(PHYSICS_MAJORS)(IDNO, NAME, PHONE)
--- PEOPLE_TYP(PERSON_TYP(12, 'Bob Jones', '111-555-1212'), PERSON_TYP(45, 'Chris Woods', '111-555-1213'))
結論
Oracle の SQL は、グリッド・コンピューティングの拡大・浸透における先導役として、絶えず発展を続けています。 Oracle Database 10g では、Oracle SQL エンジンの一層の発展に重要な要素となるシステム固有の正規表現、ネイティブ浮 動小数点データ型、LOB パフォーマンスの改善およびコレクション型の拡張機能が採用されています。結果として、Oracle Database 10g では、Grid データのプロビジョニング、統合および処理のために、SQL と重要なデータ処理機能や Java、 XML の統合が、より充実したものになっています。 文字列の検索、操作、検証および書式化のための機能は、テキスト・データを扱うすべてのアプリケーションの中核機能 であり、正規表現は、それらの処理を実行する最も高度な方法と考えられています。Oracle Database の SQL および PL/SQL にネイティブ正規表現サポートを導入したことで、問合せやデータ定義、文字列操作での正規表現の使用が可能になり、 データベースでのテキストの検索および操作機能に大幅な刷新がもたらされました。 E-Business、ビジネス・インテリジェンス、ライフ・サイエンスおよびその他多くの基幹業務アプリケーションでは、デー タベースに構造化データおよび非構造化データとして格納されている膨大な量のデータ・セットに対し、非常に高度な データ操作や浮動小数点計算が要求されます。データベース内のデータ処理機能(浮動小数点データ型や LOB の処理な
Oracle の Java および XML 言語バインド API は、データベース・サーバーへのダイレクトなインタフェースを提供します。 これらの包括的な API は最新の標準規格をサポートしており、Java、XML、C/C++およびその他のプログラミング言語を 通じて、幅広い Oracle データベース・サービスが供給されます。 さらに、Oracle Database 10g では、グローバルな企業のニーズに応えるため、管理機能、グリッド・コンピューティング・ インフラストラクチャ、データベース Web サービス、OLAP、データ・マイニングおよびその他の領域においてきわめて 多くの改善が行われています。Oracle のデータベース技術は、基幹業務アプリケーションの開発、デプロイメントおよび 管理のための最も総合的なソリューションを提供します。 SQL 技術の誕生以来、オラクル社は常に、最も強力な SQL 技術の先導者です。今後も、その最高の SQL 技術をもって、 パートナ企業やお客様のニーズに応え続けていきます。Oracle Database 10g の新しい SQL 性能は、グリッド環境で実行す る、多機能かつスケーラブルで、同時処理が可能な、パフォーマンスの高いデータベース・アプリケーションを開発する ための、最も総合的な機能性を提供します。