ヘッダーをスキップ

Oracle Database 概要
10gリリース2(10.2)

B19215-02
目次
目次
索引
索引

戻る 次へ

27 オブジェクト・データ型とオブジェクト・ビュー

オブジェクト型とその他のユーザー定義データ型を使用すると、アプリケーションのデータの構造と動作をモデル化するデータ型を定義できます。オブジェクト・ビューは、仮想的なオブジェクト表です。

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

オブジェクト・データ型の概要

Oracleオブジェクト・テクノロジは、Oracleのリレーショナル・テクノロジ上に作成された抽象レイヤーです。組込みデータベース型または以前に作成したオブジェクト型、オブジェクト参照およびコレクション型から、新規のオブジェクト型を作成できます。ユーザー定義型のメタデータは、SQL、PL/SQL、Javaおよび他の公開インタフェースで使用可能なスキーマに格納されます。オブジェクト・データ型によって、イメージ、オーディオおよびビデオなどの複合データを容易に処理できます。

オブジェクト型は、ユーザー定義であり、基礎となる永続データ(属性)と関連する動作(メソッド)を指定するという点で、ネイティブのSQLデータ型と異なります。オブジェクト型は、発注情報など、実社会のエンティティを抽象化したものです。オブジェクト型では、構造化されたビジネス・データが自然な形で格納され、アプリケーションもそれらのデータを自然な形で取り出すことができます。

オブジェクト型と、可変長配列やネストした表などの関連するオブジェクト指向機能により、データベース内のデータについて高水準の編成方法とアクセス方法が提供されます。データはオブジェクト・レイヤーでも列と表に格納されますが、顧客や発注情報など、データを意味のあるものにする実社会のエンティティに関連してデータを操作できます。データベースの問合せでは、列と表を考慮するかわりに単に顧客を選択できます。

内部的には、オブジェクトに関する文は基本的にはリレーショナル表および列に関する文であり、従来どおりリレーショナル・データ型を操作して、データをリレーショナル表に格納できます。ただし、オブジェクト指向の機能を利用するかどうかを選択するオプションも用意されています。オブジェクト指向の機能を使用しながら引き続きほとんどのリレーショナル・データを操作する方法と、完全にオブジェクト指向のアプローチを使用するように移行する方法があります。たとえば、オブジェクト・データ型をいくつか定義し、オブジェクトをリレーショナル表の列に格納できます。また、既存のリレーショナル・データのオブジェクト・ビューを作成し、オブジェクト・モデルに従ってこのデータの表示およびアクセスができます。各行がオブジェクトとなるようにオブジェクト表にオブジェクト・データを格納することもできます。

関連項目

『Oracle Databaseアプリケーション開発者ガイド - オブジェクト・リレーショナル機能』 

複合データ・モデル

Oracleデータベース・サーバーでは、複合ビジネス・モデルをSQLで定義し、それをデータベース・スキーマの一部にすることができます。データを管理し共有するアプリケーションに入っている必要があるのは、データ・ロジックではなく、アプリケーション・ロジックのみです。

たとえば、発注情報を使用して、購買、買掛管理、出荷および売掛管理の機能を編成しているとします。

1件の発注情報には、関連するサプライヤまたは顧客と、不特定数の品目が含まれています。さらに、アプリケーションでは、発注に関してステータス情報を動的に計算する機能が必要になることがあります。出荷済みまたは未出荷の品目の現行の数量が必要になることがあります。

オブジェクト型は、アプリケーションですべての発注データのテンプレートとして使用することになるスキーマ・オブジェクトです。オブジェクト型では、発注などの構造化されたデータ単位を形成する個々の要素を指定します。この要素のことを属性と呼びます。属性そのものが、別の構造化されたデータ単位になっていることもあります(明細項目リストなど)。オブジェクト型では、1件の発注の合計金額を計算するなど、そのデータ単位に対して実行できる操作も指定します。この操作のことをメソッドと呼びます。

テンプレートと一致する発注情報を作成し、数値や日付とまったく同じように表の列に格納できます。

また、発注情報をオブジェクト表に格納することもできます。その場合、表の各行が1件の発注情報に対応し、表の各列が発注情報の属性に対応します。

発注情報の構造と動作のロジックはスキーマに入っているため、アプリケーションはその詳細を知る必要はなく、最新の変更内容を反映する必要もありません。

Oracleでは、オブジェクト型に関するスキーマ情報を使用して、実質的な伝送効率を向上させます。クライアント側のアプリケーションは、サーバーに発注情報を要求したとき、すべての関連データを1回の伝送で受信できます。その後、アプリケーションは、データが格納されている位置や実現方法の詳細を知らなくても、サーバーからそれ以上の伝送なしで、関連データ項目間をナビゲートできます。

マルチメディア・データ型

数値、日付および文字などの基本的なデータ型の管理を最適化することにより、データベース・システムはかなりの程度まで効率がよくなります。また、値の比較、値の分散状況の判別、効率的な索引の作成およびその他の最適化などを実行するための機能があります。

これらの基本的なデータ型に適合しない重要なビジネス・エンティティの例には、テキスト、ビデオ、サウンド、グラフィックスおよび空間データなどがあります。Oracle Enterprise Editionは、これらの複合データ型のモデル化と実現をサポートしています。

オブジェクト・データ型のカテゴリの概要

オブジェクト・データ型には、次の2つのカテゴリがあります。

オブジェクト・データ型では、組込みデータ型と他のユーザー定義データ型を、アプリケーション・データの構造と動作をモデル化するデータ型のビルディング・ブロックとして使用します。

オブジェクト型はスキーマ・オブジェクトです。これらのオブジェクトの使用は、他のスキーマ・オブジェクトと同様の管理制御を受けます。

関連項目

 

オブジェクト型

オブジェクト型は、アプリケーション・プログラムが取り扱う実社会のエンティティ(発注など)を抽象化したものです。オブジェクト型は、次のような3種類のコンポーネントのあるスキーマ・オブジェクトです。

オブジェクト型はテンプレートです。テンプレートにあわせて構造化されたデータ単位をオブジェクトと呼びます。

関連項目

 

メソッドの型

オブジェクト型のメソッドは、オブジェクトの動作をモデル化したもので、次の3つのカテゴリに大別できます。

Oracleは、PL/SQL、JavaおよびCで型メソッドの実装の選択をサポートしています。

すべてのオブジェクト型には、特定のオブジェクトに結び付けられない、暗黙に定義されるメソッド、つまりオブジェクト型のコンストラクタ・メソッドも1つあります。

オブジェクト型のコンストラクタ・メソッド

すべてのオブジェクト型には、オブジェクト型の仕様に基づいて新しいオブジェクトを作成する、システム定義のコンストラクタ・メソッドがあります。コンストラクタ・メソッドの名前は、そのオブジェクト型の名前と同じであり、コンストラクタ・メソッドのパラメータの名前と型は、オブジェクト型の属性の名前と型です。コンストラクタ・メソッドはファンクションです。新しいオブジェクトを値として戻します。また、独自のコンストラクタ・ファンクションを定義し、システムによって各オブジェクト型に暗黙的に定義されるコンストラクタ・ファンクションのかわりに使用することもできます。

関連項目

『Oracle Databaseアプリケーション開発者ガイド - オブジェクト・リレーショナル機能』 

比較メソッド

メソッドは、オブジェクトの比較でも役割を果たします。Oracleには、特定の組込みタイプの2つのデータ項目(たとえば2つの数値)を比較し、一方が他方より大きい、等しい、または小さいかどうかを判別する機能があります。しかし、Oracleでは、定義者がさらに指示を与えないかぎり、任意のユーザー定義型の2つの項目を比較することはできません。Oracleは、特定のオブジェクト型のオブジェクト間に順序関係を定義するために2つの方法を用意しています。マップ・メソッドとオーダー・メソッドです。

マップ・メソッドでは、組込み型を比較するOracleの機能を使用します。たとえば、rectangle(四角形)というオブジェクト型にheight(高さ)およびwidth(幅)という属性を定義した場合を考えます。area(面積)というマップ・メソッドを定義して、数値、つまり四角形のheight属性とwidth属性の積を戻すようにします。この場合は、面積によって2つの四角形を比較できます。

オーダー・メソッドは、より一般的な方法です。オーダー・メソッドは、独自の内部論理を使用して、特定のオブジェクト型に属する2つのオブジェクトを比較します。それは、順序関係を符号化した値を戻します。たとえば、最初のオブジェクトのほうが小さければ-1を戻し、どちらも同じ大きさであれば0(ゼロ)を戻し、最初のオブジェクトのほうが大きければ1を戻す、などです。

たとえば、address(住所)というオブジェクト型にstreet(番地)、city(市町村)、state(都道府県)およびzip(郵便番号)という属性を定義した場合を考えます。アプリケーションで住所を比較して、より大きいより小さいかを判別することは無意味ですが、2つの住所が等しいかどうかを判別するには、複雑な計算を必要とする場合が考えられます。

オブジェクト型を定義する際、マップ・メソッドかオーダー・メソッドのどちらかを指定できますが、両方は指定できません。オブジェクト型に比較メソッドがない場合、Oracleはその型の2つのオブジェクト間の大小関係を判別できません。ただし、その型の2つのオブジェクトが等しいかどうかの判別は試行できます。

比較メソッドを持たない型の2つのオブジェクトを比較する場合、Oracleは、対応する属性を比較します。

オブジェクト表

オブジェクト表は特殊な種類の表で、オブジェクトを保持し、各オブジェクトの属性のリレーショナル・ビューを提供します。

Oracleでは、次の2つの方法でこの表を表示できます。

行オブジェクトと列オブジェクト

オブジェクト表に表示されるオブジェクトのことを行オブジェクトと呼びます。表の列に表示されるオブジェクト、または他のオブジェクトの属性として表示されるオブジェクトのことを列オブジェクトと呼びます。

オブジェクト識別子

オブジェクト表のすべての行オブジェクトには、論理オブジェクト識別子が対応付けられています。デフォルトで、各行オブジェクトにはオブジェクト識別子として長さ16バイトの一意のシステム生成識別子が割り当てられます。

オブジェクト表のオブジェクト識別子列は、非表示列です。オブジェクト識別子の値そのものはオブジェクト・リレーショナル・アプリケーションにほとんど意味を持ちませんが、Oracleはこの値を使用して行オブジェクトへのオブジェクト参照を組み立てます。アプリケーションは、オブジェクトのフェッチとナビゲートに使用されるオブジェクト参照のみに注意する必要があります。

行オブジェクトのオブジェクト識別子の目的は、そのオブジェクトをオブジェクト表内で一意に識別することです。そのために、Oracleはオブジェクト表のオブジェクト識別子列に索引を暗黙的に作成してメンテナンスします。システム生成の一意識別子には、分散およびレプリケート環境でオブジェクトが明確に識別されること以外にも、多数の利点があります。

主キーに基づくオブジェクト識別子

システム生成のグローバル一意識別子が提供する機能性を必要としないアプリケーションでは、各オブジェクトとともに余分の16バイトを格納し、その索引をメンテナンスしても、効率的でない場合があります。Oracleでは、行オブジェクトのオブジェクトIDとしてその主キー値を指定する方法を選択できます。

また、主キーに基づく識別子には、より効率的かつ容易にオブジェクト表をロードできるという利点もあります。これに対して、システム生成のオブジェクト識別子は、特にその参照も永続的に格納される場合には、なんらかのユーザー指定キーを使用して再マップする必要があります。

オブジェクト・ビューの説明

オブジェクト・ビューは、仮想的なオブジェクト表です。オブジェクト・ビューの行は、行オブジェクトです。Oracleは、永続的には格納しないオブジェクト識別子を、基礎を形成する表やビューの主キーから具象化します。

関連項目

「オブジェクト・ビューの概要」 

REF

リレーショナル・モデルの場合、外部キーは多対1リレーションシップを表します。Oracleオブジェクト型では、多対1リレーションシップで1の側が行オブジェクトである場合に、このリレーションシップを表すための効率的な方法が提供されています。

Oracleは、指定したオブジェクト型の行オブジェクトの参照をカプセル化するために、REFという組込みデータ型を提供します。モデル化の観点から見ると、REFを使用すると2つの行オブジェクト間の関連付けを獲得できます。Oracleは、この種のREFを組み立てるためにオブジェクト識別子を使用します。

REFを使用して、参照先のオブジェクトを検査および更新できます。また、REFによって、参照先のオブジェクトのコピーを取得できます。REFに対して実行できる変更は、同じオブジェクト型の異なるオブジェクトへの参照に内容を置き換えるか、NULL値を割り当てるという変更のみです。

有効範囲付REF

列型、コレクション要素またはオブジェクト型の属性をREFとして宣言する際に制約を適用し、指定したオブジェクト表への参照のみを含めることができます。このようなREF有効範囲付REFと呼びます。有効範囲付REFは記憶領域が少なく、有効範囲なしREFよりも効率的にアクセスできます。

参照先がないREF

REFで識別されるオブジェクトが削除されたり権限が変更されて、そのオブジェクトを使用できなくなる可能性があります。このようなREF参照先がないREFと呼びます。OracleのSQLでは、この条件についてREFをテストする述語(IS DANGLING)を提供しています。

REFの参照解除

REFで参照しているオブジェクトにアクセスすることを、REF参照解除と呼びます。Oracleには、そのためのDEREF演算子が用意されています。参照先がないREFへの参照を解除すると、結果はNULLオブジェクトになります。Oracleは、REF暗黙的参照解除を提供しています。

REFの取得

行オブジェクトへのREFは、オブジェクト表からそのオブジェクトを選択し、REF演算子を適用すると取得できます。

関連項目

REFの使用例は、『Oracle Databaseアプリケーション開発者ガイド - オブジェクト・リレーショナル機能』を参照してください。 

コレクション型

それぞれのコレクション型は、すべて同じデータ型の不特定数の要素で構成されるデータ単位を記述します。コレクション型には、配列型表型があります。

配列型および表型は、スキーマ・オブジェクトです。それぞれに対応するデータ単位を、VARRAYおよびネストした表と呼びます。混乱の恐れがない場合は、コレクション型のことを単にVARRAYおよびネストした表と呼ぶこともよくあります。

コレクション型には、コンストラクタ・メソッドがあります。コンストラクタ・メソッドの名前はコレクション型の名前と同じで、その引数は新しいコレクションの要素をカンマで区切ったリストです。コンストラクタ・メソッドはファンクションです。新しいコレクションを値として返します。

コレクション型の名前に空のカッコを付けた式は、その型を持つ空のコレクションを作成するコンストラクタ・メソッドのコールを表します。空のコレクションは、NULLコレクションとは異なります。

VARRAY

配列とは、データ要素を順番に並べた集合のことです。特定の配列のすべての要素は、同じデータ型で構成されます。各要素には索引があり、これは配列内におけるその要素の位置に対応する番号です。

配列内の要素の数が、配列のサイズになります。Oracleの配列のサイズは可変であるため、VARRAYと呼ばれます。配列型を宣言するときは、最大サイズを指定する必要があります。

配列型を作成しても、領域は割り当てられません。単にデータ型を定義しているだけです。このデータ型は、次の用途に使用できます。

通常、VARRAYはひとまとめに格納されます。つまり、行に入っているその他のデータと同じ表領域に格納されます。ただし、サイズが十分に大きい場合には、OracleはこれをBLOBとして格納します。

関連項目

VARRAYの使用方法の詳細は、『Oracle Databaseアプリケーション開発者ガイド - オブジェクト・リレーショナル機能』を参照してください。 

ネストした表

ネストした表は、すべて同じデータ型のデータ要素を順不同で並べた集合です。この表には単一の列があり、この列の型は組込み型かオブジェクト型です。オブジェクト型の場合は、この表を、オブジェクト型の各属性に対応する列のある、複数列の表とみなすこともできます。Oracle9iまたはそれ以上への互換性を設定すれば、ネストした表は他のネストした表を含めることができます。

表型を定義しても、領域は割り当てられません。単に型を定義しているだけです。この型は、次の用途に使用できます。

表型が、リレーショナル表の列の型、またはオブジェクト表の基礎を形成するオブジェクト型の属性として使用された場合、Oracleはネストした表のすべてのデータを単一の表に格納します。Oracleは、その表を、それを含むリレーショナル表またはオブジェクト表と対応付けます。

ネストした表の要素に個々にアクセスする簡便な方法は、ネストしたカーソルを使用することです。

関連項目

  • ネストしたカーソルの詳細は、『Oracle Databaseリファレンス』を参照してください。

  • ネストした表の使用方法の詳細は、『Oracle Databaseアプリケーション開発者ガイド - オブジェクト・リレーショナル機能』を参照してください。

 

型の継承の概要

オブジェクト型は、既存オブジェクト型のサブタイプとして作成できます。単一継承モデルがサポートされており、サブタイプが導出可能な親タイプは1つのみです。型は、その直接のスーパータイプの属性とメソッドをすべて継承します。新しい属性とメソッドを追加できます。また、継承したどのメソッドに対してもオーバーライドが可能です。

図27-1は、Person_tの下に作成された2つのサブタイプStudent_tEmployee_tを示します。

図 27-1    型の階層


画像の説明

また、サブタイプは、その下に別のサブタイプを定義して型の階層を作成すると、さらに細分化できます。前述の図では、PartTimeStudent_tはサブタイプStudent_tから導出されています。

FINAL型およびNOT FINAL型

サブタイプを作成する場合は、型宣言でNOT FINALキーワードが必要です。デフォルトでは、型がFINALであるため、その型にはサブタイプは作成されません。これによって、下位互換性が維持されています。

NOT INSTANTIABLE型およびメソッド

型はNOT INSTANTIABLEを宣言できます。これは、その型にコンストラクタ(デフォルトまたはユーザー定義)がないことを意味します。このため、この型のインスタンスは作成できません。通常は、次のような型についてインスタンス化可能なサブタイプを定義します。

CREATE TYPE Address_t AS OBJECT(...) NOT INSTANTIABLE NOT FINAL;
CREATE TYPE USAddress_t UNDER Address_t(...);
CREATE TYPE IntlAddress_t UNDER Address_t(...);

ある型のメソッドはNOT INSTANTIABLEに宣言できます。NOT INSTANTIABLEとしてメソッドを宣言することは、その型がそのメソッドを実装していないことを意味します。さらに、インスタンス化が不可能なメソッドを含む型は、必ずNOT INSTANTIABLEに宣言する必要があります。

NOT INSTANTIABLE型のサブタイプは、そのスーパータイプのインスタンス化が不可能なメソッドをオーバーライドできます。また、具体的な実装を提供します。インスタンス化が不可能なメソッドが残っている場合、そのサブタイプも必ずNOT INSTANTIABLEに宣言する必要があります。

インスタンス化が不可能なサブタイプは、インスタンス化可能なスーパータイプの下に定義できます。インスタンス化が不可能な型をFINALに宣言することはできません。

関連項目

『Oracle Database PL/SQLユーザーズ・ガイドおよびリファレンス』 

ユーザー定義集計関数の概要

Oracleは、MAXMINおよびSUMなどの集計関数の基本セットをサポートしています。この他に、ユーザー定義の集計操作ロジックによる新しい集計関数を実装できるメカニズムも用意されています。

ユーザー定義の集計関数を使用する理由

ユーザー定義集計関数(UDAG)とは、ユーザーが指定した集計操作セマンティクスによる集計関数を言います。ユーザーは新しい集計関数を作成できます。また、一連のルーチンから集計操作ロジックも提供できます。いったん集計関数を作成すると、ユーザー定義集計関数は、組込み集計と同じように、SQL DML文で使用できます。Oracleデータベース・サーバーは、ユーザーが提供する集計ルーチンを適切に起動して、UDAGを評価します。

データベースでは、イメージ、空間、オーディオ、ビデオなどの複雑なデータの格納が徐々に増加します。一般に複雑なデータは、オブジェクト型、不透明型またはLOBを使用してデータベースに格納されます。ユーザー定義集合体は主に、データの新しいドメインなどに集計操作を指定する場合に便利です。

さらに、UDAGを使用すると、財務や科学関係のアプリケーションで使用する従来のスカラー・データ型について、新しい集計関数を作成できます。集計のすべてのフォームについて固有のサポートを提供できないため、アプリケーション開発者が新しい集計関数を追加できるように柔軟性に富んだメカニズムを提供することが望まれます。

関連項目

  • ユーザー定義集合体の実装の詳細は、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。

  • データ・ウェアハウスにおけるUDAGの使用方法の詳細は、『Oracle Databaseデータ・ウェアハウス・ガイド』を参照してください。

  • 不透明型の詳細は、第26章「システム固有のデータ型」を参照してください。

 

データ型の発展の概要

オブジェクト・データ型は、次のスキーマ・オブジェクトによって参照できます。

これらのオブジェクトが、別の型やサブタイプから直接または間接的にある型を参照すると、その型に依存したオブジェクトになります。型が変更されると、必ずすべての依存プログラム・ユニット、ビュー、演算子および索引タイプに無効のマークが付けられます。これらの無効なオブジェクトが次回参照されると、新しい型定義を使用して再度有効にされます。正常に再コンパイルされると有効になるため、もう一度使用できるようになります。

ある型に型依存または表依存がある場合、既存の永続データは現行の型定義に依存しているため、型定義の変更はさらに複雑になります。

オブジェクト型を変更し、それが依存する型と表に型変更を伝播させることができます。ALTER TYPEによって、既存の型からメソッドや属性を追加および削除できます。またオプションで、依存する型、表や表データへもこれらの変更を伝播できます。ある型の属性も変更できます。

関連項目

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

  • 型指定および本体のコンパイルの詳細は、『Oracle Database PL/SQLユーザーズ・ガイドおよびリファレンス』を参照してください。

  • 型バージョンの管理の詳細は、『Oracle Databaseアプリケーション開発者ガイド - オブジェクト・リレーショナル機能』を参照してください。

 

オブジェクト・ビューの概要

ビューが仮想表であるのと同様に、オブジェクト・ビューは仮想的なオブジェクト表です。

Oracleは、基本的なリレーショナル・ビュー・メカニズムへの機能拡張としてオブジェクト・ビューを提供します。オブジェクト・ビューを使用すると、データベースのリレーショナル表またはオブジェクト表の列に格納されているデータ(組込み型またはユーザー定義型)から、仮想的なオブジェクト表を作成できます。

オブジェクト・ビューは、データベース内のデータおよびオブジェクトへの特化または制限付きのアクセスを提供する機能を実現します。たとえば、オブジェクト・ビューを使用して、機密データを含む属性がなく、削除方法がないバージョンの従業員オブジェクト表を提供できます。

オブジェクト・ビューにより、オブジェクト指向アプリケーションでリレーショナル・データを使用できるようになります。ユーザーは、オブジェクト・ビューを使用して次の操作ができます。

オブジェクト・ビューの利点

オブジェクト・ビューを使用すると、パフォーマンスを改善できます。オブジェクト・ビューの1行を構成するリレーショナル・データは、1つの単位としてネットワークを横断するため、何度も往復する必要がありません。

リレーショナル・データをクライアント側のオブジェクト・キャッシュにフェッチして、CまたはC++の構造体にマップできるため、3GLアプリケーションはそのデータをネイティブな構造体と同じように処理できます。

オブジェクト・ビューは、従来のデータを段階的にアップグレードしていくための手段になります。オブジェクト・ビューにより、リレーショナル・アプリケーションとオブジェクト指向アプリケーションの共存が可能になり、既存のリレーショナル・データへのオブジェクト指向アプリケーションの導入も、パラダイムの大幅な変更なしに容易に行えます。

オブジェクト・ビューには、同じリレーショナル・データまたはオブジェクト・データを複数の方法で表示できるという柔軟性もあります。したがって、データベースにデータを格納する方法を変えなくても、様々なアプリケーションに応じて異なるメモリー内オブジェクト表現を使用できます。

関連項目

  • オブジェクト・ビューを定義する手順は、『Oracle Database 管理者ガイド』を参照してください。

  • INSTEAD OFトリガーの記述方法の詳細は、「オブジェクト・ビューの更新」を参照してください。

 

オブジェクト・ビューの利用

オブジェクト・ビューの行データが2つ以上の表から取られている場合もありますが、そのオブジェクトは1回の操作でネットワークを横断します。インスタンスがクライアント側のオブジェクト・キャッシュに入っているときは、プログラマにとってそのインスタンスはCまたはC++の構造体、あるいはPL/SQLのオブジェクト変数のように見えます。
このインスタンスは、他のネイティブな構造体と同じように処理できます。

SQL文の中で、オブジェクト・ビューは、オブジェクト表を参照するときと同じ方法で参照できます。たとえば、オブジェクト・ビューは、SELECT構文のリスト、UPDATE SET 句またはWHERE句に指定できます。オブジェクト・ビューに対するオブジェクト・ビューを定義することもできます。

オブジェクト表のオブジェクトに使用するときと同じOCIコールを使用して、クライアント側でオブジェクト・ビューのデータにアクセスできます。たとえば、REFを確保するときにOCIObjectPinを使用し、オブジェクトをサーバーにフラッシュするときにOCIObjectFlushを使用できます。オブジェクト・ビュー内のオブジェクトをサーバーに更新またはフラッシュすると、Oracleはオブジェクト・ビューを更新します。

関連項目

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

オブジェクト・ビューの更新

オブジェクト・ビューのデータは、オブジェクト表に使用するのと同じSQL DMLを使用して更新、挿入および削除できます。あいまいでなければ、Oracleはオブジェクト・ビューの実表を更新します。

ビューの問合せに、結合、集合演算子、集計関数、GROUP BYまたはDISTINCTが含まれる場合、そのビューは更新不可能です。ビューの問合せに疑似列、つまり式が含まれている場合、対応するビューの列は更新不可能です。オブジェクト・ビューには、しばしば結合が含まれています。

このような問題を克服するために、OracleはINSTEAD OFトリガーを提供しています。Oracleは実際のDML文のかわりにこのトリガー本体を実行するので、これらのトリガーのことをINSTEAD OFトリガーと呼びます。

INSTEAD OFトリガーにより、透過的な方法でオブジェクト・ビューまたはリレーショナル・ビューを更新できます。オブジェクト表の場合と同じSQL DML(INSERTDELETEおよびUPDATE)文を記述します。Oracleは、SQL文のかわりに該当するトリガーを起動し、そのトリガー本体に指定されているアクションを実行します。

関連項目

  • INSTEAD OFトリガーを使用する発注/明細項目の例は、『Oracle Databaseアプリケーション開発者ガイド - オブジェクト・リレーショナル機能』を参照してください。

  • 第22章「トリガー」

 

ビュー内のネストした表の列の更新

ネストした表を変更するには、新しい要素を挿入して更新するか、既存の要素を削除します。ビュー内と同様に、ネストした表の列が仮想または合成の場合、通常その列は更新できません。この種の列を更新するために、Oracleではこれらの列にINSTEAD OFトリガーを作成できます。

ビューのネストした表の列で定義されているINSTEAD OFトリガーは、その列が変更されると起動します。親行の更新によってコレクション全体が置き換えられると、ネストした表の列のINSTEAD OFトリガーは起動しません。

関連項目

ネストした表の列でINSTEAD OFトリガーを使用する発注/明細項目の例は、『Oracle Databaseアプリケーション開発者ガイド - 基礎編』を参照してください。 

ビューの階層

オブジェクト・ビューは、別のオブジェクト・ビューのサブビューとして作成できます。スーパービューのタイプは、作成するオブジェクト・ビューのタイプの即時スーパータイプにする必要があります。つまり、タイプの階層と1対1の対応関係を持つオブジェクト・ビュー階層を作成できます。しかし、すべてのビュー階層が対応するタイプ階層すべてにまたがる必要はありません。ビュー階層はタイプ階層のどのサブタイプからでも構成できます。さらに、サブ階層全体を網羅する必要はありません。

図27-2に、複数のビューの階層を示します。

図 27-2    複数のビューの階層


画像の説明

デフォルトでは、ビューの階層におけるオブジェクト・ビューの行には、そのビューの列に表示されるすべてのサブビュー(直接および間接)の全行が含まれます。

特定のサブタイプに対応する特定のビューのサブビューとして作成できるのは、オブジェクト・ビュー1つのみです。つまり、同じビューを複数のビュー階層で使用することはできません。オブジェクト・ビューは、1つのスーパービューのサブビューとしてのみ作成できます。多重継承はサポートされていません。

サブビューはスーパービューからオブジェクト識別子を継承します。サブビュー内で明示的に指定することはできません。


戻る 次へ
Oracle
Copyright © 2006 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引