この章では、Oracleオブジェクト・リレーショナル・モデルの主な機能および利点について説明します。内容は次のとおりです。
Oracleオブジェクト型は、データベース内のオブジェクトとして実社会のエンティティ(顧客や発注書など)をモデル化できるようにするユーザー定義型です。
新しいオブジェクト型は、任意の組込みデータベース型、作成済のオブジェクト型、オブジェクト参照およびコレクション型から作成できます。オブジェクト・データ型は、イメージ、音声および動画などの複雑なデータを扱うことができます。Oracle Databaseでは、ユーザー定義のメタデータが、SQL、PL/SQL、Javaおよび他の言語で使用できるスキーマに格納されます。
VARRAYやネストした表などのオブジェクト型および関連オブジェクト指向機能は、データベース内のデータを編成し、アクセスするための高度な手段となります。オブジェクト層の下では、データは従来どおり列や表に格納されますが、このデータは、データに意味を持たせる実社会のエンティティとして扱えます。データベースへ問い合せる場合は、顧客や発注書など、作成したエンティティを選択するだけでよく、列と表に置き換えて考える必要はありません。
従来どおり、データの大部分を相関的に扱いながら、オブジェクト指向機能を利用する方向に進むことも、すべてオブジェクト指向アプローチを使用することもできます。
オブジェクト型は、ユーザー定義型またはADTとも呼ばれます。『Oracle Database PL/SQL言語リファレンス』では、通常ADTといいます。
一般的に、オブジェクト型モデルは、C++およびJavaで使用されているクラス・メカニズムに似ています。クラスの場合と同様、オブジェクトを再利用できるため、データベース・アプリケーションを短期間で効率的に開発できます。データベースのオブジェクト型をネイティブ・サポートしているため、アプリケーション開発者は自身のアプリケーションで使用するデータ構造に直接アクセスできます。
純粋なリレーショナル・アプローチにより得られるオブジェクトの利点には、次のようなものもあります。
オブジェクトによる操作とデータのカプセル化
データベース表には、データのみが存在します。データに対して実行する可能性のある操作を実行する機能を、オブジェクトに組み込むことができます。したがって、発注情報オブジェクトに、購入品目すべてのコストを計算するメソッドを組み込むことができます。または、顧客オブジェクトに、顧客の購買履歴および支払パターンを戻すメソッドを持たせることもできます。アプリケーションは、メソッドをコールするのみで、情報を取り出せます。
オブジェクトによる効果
オブジェクト型を使用することで、次のような効果があります。
オブジェクト型およびオブジェクト・メソッドは、データと一緒にデータベースに格納されるため、どのアプリケーションでも利用できるようになります。開発者は、アプリケーションごとに同様の構造およびメソッドを再作成する必要がありません。また、複数の開発者が一貫した標準を使用することになります。
一連の関連オブジェクトを1つの単位としてフェッチし、処理できます。サーバーからオブジェクトをフェッチする要求を1回出すのみで、関連付けられた他のオブジェクトが取り出せます。SQLオブジェクト型の列を参照すると、オブジェクト全体が取り出せます。
オブジェクトによる部分対全体の関連の表現
オブジェクト型を使用すると、部分対全体の関連を表現できます。たとえば、在庫品目のリレーショナル表では、ピストンとエンジンに同じステータスが与えられてしまいます。オブジェクトを使用すれば、主キーと外部キーの関連を使用した複数の表で構成される複雑なスキーマを使用して、ピストンをエンジンのパーツとして表現する必要がありません。オブジェクトは他のオブジェクトを属性として持ち、属性オブジェクトは個別のオブジェクト属性も持てます。オブジェクト型を結合することにより、この方法でパーツリスト全体の階層を作成できます。
Oracle Databaseでは、オブジェクト型モデルはリレーショナル・モデルの拡張機能として実装されますが、高速コミット、バックアップとリカバリ、スケーラブルな接続性、行レベルのロック、読取り一貫性など、標準のリレーショナル・データベース機能は引き続きサポートされます。
SQLや各種のプログラム・インタフェースおよび言語(PL/SQL、Java、Oracle Call Interface、Pro*C/C++、C#など)には、Oracleオブジェクトをサポートするための拡張機能が追加されています。その結果、リレーショナル・データベースの優れた並行性とスループットを保つと同時に、オブジェクト・インタフェースの直観性と経済性を実現する、オブジェクト・リレーショナル・モデルが誕生しました。
この項の内容は次のとおりです。
この項では、データベースに関連のあるオブジェクト・リレーショナル・モデルの機能と概念を説明します。
この項の内容は次のとおりです。
オブジェクト型はある種のデータ型です。NUMBER
やVARCHAR2
のような標準的なデータ型の場合と同じ方法で使用できます。たとえば、オブジェクト型をリレーショナル表の列のデータ型として指定し、オブジェクト型の変数を宣言できます。値は、その型の変数またはインスタンスです。オブジェクト・インスタンスは、オブジェクトとも呼ばれます。
図1-1に、オブジェクト型person_typ
とオブジェクト型の2つのインスタンスを示します。
オブジェクト型は、構造と動作の両方を定義する見取り図またはテンプレートとして機能します。オブジェクト型はデータベース・スキーマ・オブジェクトで、他のスキーマ・オブジェクトと同様に管理制御されます。アプリケーション・コードは、これらのオブジェクトを取得および操作できます。第7章「Oracleオブジェクトの管理」を参照してください。
オブジェクト型を定義するには、CREATE
TYPE
文を使用します。
例1-1に、person_typ
というオブジェクト型の作成方法を示します。この例では、オブジェクト仕様部とオブジェクト本体が定義されています。SQL文CREATE
TYPE
およびSQL文CREATE
TYPE
BODY
の詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。
例1-1 person_typオブジェクト型の作成
CREATE TYPE person_typ AS OBJECT ( idno NUMBER, first_name VARCHAR2(20), last_name VARCHAR2(25), email VARCHAR2(25), phone VARCHAR2(20), MAP MEMBER FUNCTION get_idno RETURN NUMBER, MEMBER PROCEDURE display_details ( SELF IN OUT NOCOPY person_typ )); / CREATE TYPE BODY person_typ AS MAP MEMBER FUNCTION get_idno RETURN NUMBER IS BEGIN RETURN idno; END; MEMBER PROCEDURE display_details ( SELF IN OUT NOCOPY person_typ ) IS BEGIN -- use the PUT_LINE procedure of the DBMS_OUTPUT package to display details DBMS_OUTPUT.PUT_LINE(TO_CHAR(idno) || ' ' || first_name || ' ' || last_name); DBMS_OUTPUT.PUT_LINE(email || ' ' || phone); END; END; /
オブジェクト型は、リレーショナル・データベースに固有の標準的なデータ型とは異なります。
オブジェクト型の変数は、その型のインスタンス、すなわちオブジェクトです。オブジェクトは、その型に定義された属性およびメソッドを持ちます。オブジェクト・インスタンスは具体的な存在なので、値をその属性に割り当て、そのメソッドをコールできます。
オブジェクト型を定義しても、記憶域は割り当てられません。オブジェクト型を定義すると、SQL文のNUMBER
やVARCHAR2
のような型を使用する場所のほとんどでそのオブジェクト型を使用できるようになります。オブジェクト型のインスタンスを作成すると、記憶域が割り当てられます。
例1-2に、例1-1で作成したperson_typ
のオブジェクト・インスタンスを作成する方法と、これらのインスタンスを連絡先として記録するためのリレーショナル表を定義する方法を示します。
例1-2 オブジェクト型の列を持つcontacts表の作成
-- requires existing person_typ fr. Ex 1-1 CREATE TABLE contacts ( contact person_typ, contact_date DATE ); INSERT INTO contacts VALUES ( person_typ (65, 'Verna', 'Mills', 'vmills@example.com', '1-650-555-0125'), to_date('24 Jun 2003', 'dd Mon YYYY'));
contacts
表は、オブジェクト型をそのcontact列のデータ型として持つリレーショナル表です。リレーショナル表の列を占有するオブジェクトを、列オブジェクトといいます。「オブジェクトを表に格納する方法」を参照してください。
オブジェクト・メソッドとは、定義された型のオブジェクトに実行させる動作を実装する目的で、オブジェクト型定義に宣言できるファンクションまたはプロシージャのことです。
型定義には、一般的に、次のようなメソッドを宣言できます。
メンバー・メソッド
メンバー・メソッドを使用すると、オブジェクトのデータへのアクセスを提供することも、アプリケーションがデータに対して実行する操作を定義することもできます。アプリケーションは、オブジェクトに対応するメソッドをコールして、操作を実行します。
静的メソッド
静的メソッドは、オブジェクト・インスタンスを比較し、特定のオブジェクトのデータを使用しないオブジェクト型に対してグローバルな操作を実行します。
コンストラクタ・メソッド
どのオブジェクト型についても、デフォルトのコンストラクタ・メソッドが暗黙的に定義されています(ユーザー定義コンストラクタによって上書きされた場合を除く)。型のオブジェクト・インスタンスを作成するときに、その型のコンストラクタ・メソッドがコールされます。
例1-3では、例1-1で作成したget_idno()
メソッドを使用して、contacts
表に個人のID番号を表示します。
例1-3 get_idnoオブジェクト・メソッドの使用
-- requires Ex 1-1 and Ex 1-2 SELECT c.contact.get_idno() FROM contacts c;
オブジェクトは次の2種類の表に格納できます。
オブジェクト表: オブジェクトのみが格納されます。
オブジェクト表では、それぞれの行が行オブジェクトと呼ばれる1つのオブジェクトを表します。「オブジェクト表の作成および使用」を参照してください。
リレーショナル表: オブジェクトと他の表データが格納されます。
リレーショナル表の列として格納されたオブジェクト、または他のオブジェクトの属性であるオブジェクトは、列オブジェクトと呼ばれます。例1-2は、person_typ
オブジェクトのインスタンスを格納するcontacts
表を示しています。
包含しているリレーショナル・データベースの外で意味を持つオブジェクト、または複数のリレーショナル・データベース・オブジェクトの間で共有されるオブジェクトは、行オブジェクトとして参照できるようにする必要があります。つまり、そのようなオブジェクトは、リレーショナル表の列に格納するのではなく、行オブジェクトとしてオブジェクト表に格納する必要があります。
例1-4に、person_typ
オブジェクトのオブジェクト表を作成するCREATE
TABLE
文を示します。
この表は、次の2つの方法で表示できます。
各行にperson_typ
オブジェクトが入っている単一列表として表示します。ここでは、オブジェクト指向操作が実行できます。
オブジェクト型person_typ
の各属性(idno
、first_name
、last_name
など)が列を占有している複数列表として表示します。ここでは、リレーショナル操作を実行できます。
例1-5に、オブジェクト表に対する複数の操作を示します。
例1-5 person_obj_tableオブジェクト表に対する操作
-- requires Ex. 1-1 and 1-4 INSERT INTO person_obj_table VALUES ( person_typ(101, 'John', 'Smith', 'jsmith@example.com', '1-650-555-0135') ); SELECT VALUE(p) FROM person_obj_table p WHERE p.last_name = 'Smith'; DECLARE person person_typ; BEGIN -- PL/SQL block for selecting a person and displaying details SELECT VALUE(p) INTO person FROM person_obj_table p WHERE p.idno = 101; person.display_details(); END; /
例1-5のSQL文INSERT
INTO
は、person_typ
オブジェクトをperson_obj_table
に挿入し、person_obj_table
を複数列表として扱います。
SQL文SELECT
では、VALUE
ファンクションを使用して、person_obj_table
から単一列表として抽出し、行をオブジェクト・インスタンスとして戻します。VALUE
ファンクションの詳細は、「VALUE」を参照してください。
PL/SQLブロックでは、特定の個人が選択され、person_typ
のメンバー・ファンクションが実行されて、指定の個人に関する詳細が表示されます。PL/SQLのオブジェクトへの使用の詳細は、第3章『PL/SQLのオブジェクト型への使用』を参照してください。
オブジェクト識別子(OID)は、オブジェクト表の行オブジェクトを一意に識別します。オブジェクト識別子に直接アクセスすることはできませんが、「行オブジェクトの参照の使用」で説明するように、オブジェクト識別子の参照(REF
)を作成してREF
に直接アクセスすることはできます。
2種類のオブジェクト識別子があります。
システム生成のオブジェクト識別子(デフォルト)
主キー・ベースのオプションを選択しないかぎり、オブジェクト表の行オブジェクトには、システム生成のオブジェクト識別子が自動的に作成されます。
主キー・ベースのオブジェクト識別子
CREATE
TABLE
文を使用して表を作成するときに、主キー・ベースのOIDを作成することを選択できます。
注意: 列オブジェクトは行の主キーで識別されるため、特定のオブジェクト識別子は必要ありません。 |
REF
とは、オブジェクト識別子(OID)から作成できる行オブジェクトへの論理ポインタまたは参照のことです。REF
を使用すると、オブジェクトを取得、調査または更新できます。同じオブジェクト型階層の異なるオブジェクトを指すようにREF
を変更したり、REFにNULL値を割り当てることも可能です。
REF
は、Oracle Databaseの組込みデータ型です。REF
とREF
のコレクションではオブジェクト間の関連付け(特に多対1リレーションシップ)がモデル化されるため、外部キーの必要性が減少します。REF
は、オブジェクト間をナビゲートする簡単なメカニズムを提供します。
例1-6に、REF
の単純な使用方法を示します。
例1-6 emp_person_typオブジェクトへのREFの使用
CREATE TYPE emp_person_typ AS OBJECT (
name VARCHAR2(30),
manager REF emp_person_typ );
/
CREATE TABLE emp_person_obj_table OF emp_person_typ;
INSERT INTO emp_person_obj_table VALUES (
emp_person_typ ('John Smith', NULL));
INSERT INTO emp_person_obj_table
SELECT emp_person_typ ('Bob Jones', REF(e))
FROM emp_person_obj_table e
WHERE e.name = 'John Smith';
この例では最初に、上司としてNULL
値を使用してJohn Smithというemp_person_typ
を作成しています。次に、Bob Jonesというemp_person_typ
をJohn Smithの部下として追加しています。
次の問合せおよびその出力に結果を示します。
COLUMN name FORMAT A10 COLUMN manager FORMAT A50 select * from emp_person_obj_table e;
NAME MANAGER
---------- --------------------------------------------------
John Smith
Bob Jones 0000220208424E801067C2EABBE040578CE70A0707424E8010
67C1EABBE040578CE70A0707
例1-10に、Manager
がオブジェクト識別子ではなく名前で表示されるように、オブジェクトを参照解除する方法を示します。
「REF型の列および属性のルール」および「REFの設計上の考慮点」を参照してください。
指定したオブジェクト表を参照するように列型、コレクション要素またはオブジェクト型属性を制限するには、REF
を宣言するときにSQL制約副次句SCOPE
IS
を使用します。有効範囲付きREF
では、有効範囲指定なしのREF
に比べて、少ない記憶域でより効率的なアクセスが可能です。
例1-7は、有効範囲がperson_typ
型のオブジェクト表であるperson_obj_table
に制限されている、REF
列のcontact_ref
を示しています。
例1-7 有効範囲付きREFを使用したcontacts_ref表の作成
-- requires Ex. 1-1, 1-4, and 1-5
CREATE TABLE contacts_ref (
contact_ref REF person_typ SCOPE IS person_obj_table,
contact_date DATE );
表に行を挿入するには、次のコマンドを発行します。
INSERT INTO contacts_ref SELECT REF(p), '26 Jun 2003' FROM person_obj_table p WHERE p.idno = 101;
REF
の有効範囲は、宣言された型のオブジェクト表(この例では、person_typ
)または宣言された型の任意のサブタイプのオブジェクト表に制限できます。REF
の有効範囲がサブタイプのオブジェクト表に制限されている場合、表内のサブタイプ(およびそのサブタイプ)のインスタンスの参照のみを含むように、REF
列が効果的に制限されます。「SQLオブジェクト型の継承」を参照してください。
オブジェクトが削除されている場合、または必要な権限が削除されている場合、REF
により識別されるオブジェクトが使用できなくなることがあります。これを参照先がないREF
といいます。Oracle DatabaseのSQL述語IS
DANGLING
を使用すると、REF
がこの条件を満たしているかどうかをテストできます。
参照先がないREF
は、参照整合性制約を定義することによって回避できます。「REF型の列および属性のルール」を参照してください。
REF
が参照するオブジェクトにアクセスすることを、REF
を参照解除するといいます。Oracle Databaseでは、この参照解除を行うDEREF
演算子が提供されています。
DEREF(E.MANAGER)(NAME, MANAGER)
----------------------------------------------------------------
EMP_PERSON_TYP('John Smith', NULL)
例1-9は、参照先がないREF
を参照解除するとNULLオブジェクトが戻されることを示しています。
例1-9 参照先がないREFの参照解除
--requires Ex. 1-1, 1-4, 1-5, and 1-7 -- DELETE command needed to cause dangling refDELETE from person_obj_table WHERE idno = 101;/ SELECT DEREF(c.contact_ref), c.contact_date FROM contacts_ref c;
Oracle Databaseでは、REF
の暗黙的な参照解除も提供されています。たとえば、特定の従業員の上司の名前にアクセスするには、SELECT
文を使用できます。
例1-10では、ポインタを上司の名前から移し、上司の名前e.manager.name
を取り出します。
例1-10 REFの暗黙的な参照解除
-- requires Ex. 1-6 SELECT e.name, e.manager.name FROM emp_person_obj_table e WHERE e.name = 'Bob Jones';
SQLではこのようにREF
に続けることができますが、PL/SQLでは例1-8のようにDEREF
キーワードを使用する必要があります。
オブジェクト表からオブジェクトを選択してREF
演算子を適用することで、その行オブジェクトに対するREF
が取得できます。
例1-11に、idno
が101
である個人に対するREF
を取得する方法を示します。
例1-11 行オブジェクトへのREFの取得
-- requires Ex. 1-1, 1-4, and 1-5 DECLARE person_ref REF person_typ; person person_typ; BEGIN SELECT REF(p) INTO person_ref FROM person_obj_table p WHERE p.idno = 101; select deref(person_ref) into person from dual; person.display_details(); END; /
問合せは1行のみを戻します。「REFの記憶域サイズ」を参照してください。
Oracle Databaseでは、複数値属性および多対多リレーションシップをモデル化するために、VARRAYとネストした表の2つのコレクション・データ型がサポートされます。コレクション型は、他のデータ型が使用されるところであれば、どこでも使用できます。また、コレクション型の列に加え、コレクション型のオブジェクト属性も使用できます。たとえば、発注書オブジェクト型に、発注書についての明細項目のコレクションを格納するためのネストした表属性を持たせることができます。
コレクション型を定義するには、CREATE
TYPE
.
.
.
AS
TABLE
OF
文を使用します。
例1-12に、コレクションおよびオブジェクト型を定義するCREATE
TYPE
文を示します。
例1-12 people_typコレクション・データ型の作成
-- requires Ex. 1-1 CREATE TYPE people_typ AS TABLE OF person_typ; / CREATE TYPE dept_persons_typ AS OBJECT ( dept_no CHAR(5), dept_name CHAR(20), dept_mgr person_typ, dept_emps people_typ); /
この例に関して次の点に注意してください。
コレクション型people_typ
は、具体的にはネストした表型です。
dept_persons_typ
オブジェクト型は、people_typ
の属性dept_emps
を持ちます。ネストした表dept_emps
の各行は、例1-1で定義されたperson_typ
型のオブジェクトです。
オブジェクト・ビューは、オブジェクト・リレーショナル機能を使用して関連するデータにアクセスする方法です。オブジェクト・ビューを使用すると、基礎となるリレーショナル・スキーマを変更せずに、オブジェクト指向アプリケーションを開発できます。
オブジェクト・ビューに属するオブジェクトには、オブジェクト表の行オブジェクトにアクセスする場合と同じ方法でアクセスできます。Oracle Databaseでは、リレーショナル・スキーマおよび表に格納されたデータからの、ユーザー定義型のマテリアライズド・ビュー・オブジェクトの生成もサポートされています。
オブジェクト・ビューを使用すると、型階層によりもたらされるポリモフィズム(多相性)を活用できます。ポリモフィックな式は、その式の宣言された型またはその型のサブタイプの値をとります。ある型階層の構造の一部または全部をミラー化するオブジェクト・ビューの階層を作成すると、その階層内のすべてのビューに対して問合せを行い、関心のある特化レベルでデータにアクセスできます。サブビューを持つオブジェクト・ビューの問合せを行う場合は、ポリモフィック・データ、すなわちビューの型とそのサブタイプの両方の行を取得できます。第6章「オブジェクト・モデルのリレーショナル・データへの適用」を参照してください。
型継承を使用すると、型階層を作成できます。型階層とは、スーパータイプと呼ばれる、共通する祖先のオブジェクト型から導出される特化されたサブタイプの連続レベルのセットです。導出サブタイプは、親オブジェクト型の機能を継承すると同時に、親の型定義を拡張できます。特殊な型を使用することで、新しい属性またはメソッドの追加や、親から継承するメソッドの再定義ができます。その結果発生する型階層により、アプリケーション・モデルの複雑さを管理するために必要な高度な抽象化レベルが得られます。たとえば、一般的な個人オブジェクト型から、追加属性またはメソッドを持つ、個人の特殊な型である学生型または定時制の学生型を導出できます。
図1-3は、Person_t
の下に作成されたStudent_t
およびEmployee_t
という2つのサブタイプと、Student_t
の下に作成された1つのサブタイプPartTimeStudent_t
を示しています。
型進化を使用すると、既存のオブジェクト型を(すでに表で使用されていても)変更したり、進化させることができます。型進化はALTER
TYPE
文によって行われるため、そのオブジェクト型のすべてのインスタンスに変更を伝播できます。
ALTER
TYPE
文は、CREATE
TYPE
文と基本的に同じ妥当性チェックを使用して、変更対象の型の依存関係を調べます。型またはその依存型のいずれかについて型の妥当性が確認されない場合は、ALTER
TYPE
文はロールバックします。
変更された型を使用するすべての表および列のメタデータは、データを新しい形式で格納できるように、新しい型定義に対応して更新されます。既存データを新しい形式に変換する処理は、データ更新時に一括または個別に行えます。いずれの場合も、データが古い型定義の形式のまま格納されていても、データは、必ず新しい型定義で表示されます。
この項では、言語およびApplication Program Interface (API)に関連のあるオブジェクト・リレーショナル・モデルの主要な機能を説明します。
SQLのオブジェクトの拡張
Oracle Databaseでは、オブジェクト関連機能をサポートするために、SQL拡張機能(DDLを含む)を提供し、オブジェクト型の作成、変更または削除、オブジェクト型の表への格納、およびオブジェクト・ビューの作成、変更または削除に対応します。オブジェクト型、参照およびコレクションのサポートには、DMLと問合せ拡張機能が用意されています。「SQLおよびオブジェクト型」を参照してください。
PL/SQLのオブジェクト拡張
PL/SQLでは、オブジェクト型をシームレスに操作できます。したがって、アプリケーション開発者は、PL/SQLを使用して、データベース・サーバー内で実行するユーザー定義型に対してロジックや操作を実装できます。第3章「PL/SQLでのオブジェクト型の使用」を参照してください。
Oracleオブジェクトに対するJavaのサポート
Oracle Java VMはOracle Databaseと密接に統合されており、Java Database Connectivity (JDBC)へのオブジェクト拡張機能を介して行うOracleオブジェクトへのアクセスをサポートします。これにより動的SQLが提供され、また静的SQLを提供するSQLJが提供されます。したがって、アプリケーション開発者は、Javaを使用して、データベース内で実行するオブジェクト型に対してロジックや操作を実装できます。SQL型を既存のJavaクラスにマップして、Javaオブジェクトに永続ストレージを持たせることができます。「Javaオブジェクトの記憶域」を参照してください。
関連項目: 『Oracle Database JDBC開発者ガイド』 |
外部プロシージャ
オブジェクト型のデータベース・ファンクション、プロシージャまたはメンバー・メソッドは、PL/SQL、Java、Cまたは.NETで、外部プロシージャとして実装できます。外部プロシージャは、Cなどの低レベル言語でより高速で簡単にできる作業に最適です。外部プロシージャは常に、データベースのアドレス空間外でセーフ・モードで実行されます。1つ以上のパラメータをシステム定義汎用型として宣言する共通の外部プロシージャが書き込めます。したがって、外部プロシージャはシステム定義の汎用型を使用して、任意の組込み型またはユーザー定義型のデータを扱うことができます。
Object Type Translator/JPublisher
OTTおよびOracle JPublisherは、Oracleデータ・ディクショナリからのスキーマ情報を使用して、Javaクラス、C構造体およびインジケータが入っているヘッダー・ファイルを生成することによって、クライアント側でオブジェクト型スキーマへのマッピングを行います。ホスト言語アプリケーションで、データベース・オブジェクトへ透過的にアクセスするために、生成されたこれらのヘッダー・ファイルを使用できます。
クライアント側キャッシュ
Oracle Databaseでは、データベースに格納された永続オブジェクトに効率的にアクセスするためのオブジェクト・キャッシュが提供されています。オブジェクトのコピーは、オブジェクト・キャッシュに置かれます。一度データがクライアントにキャッシュされると、アプリケーションは、これらのデータに対してメモリー・スピードでアクセスできます。キャッシュ内で行われたオブジェクトの変更は、Oracle Call Interfaceプログラム・インタフェースのオブジェクト拡張機能を使用して、データベースに反映できます。
Oracle Call InterfaceおよびOracle C++ Call Interface
Oracle Call Interface (OCI)およびOracle C++ Call Interfaceは、アプリケーション開発者およびツール開発者向けの包括的なアプリケーション・プログラミング・インタフェースを提供します。Oracle Call Interfaceは、Oracle Databaseに接続する機能と、データベース内のオブジェクトにアクセスするトランザクションを制御する機能を備えたランタイム環境となります。これにより、アプリケーション開発者は、クライアント側のオブジェクト・キャッシュ内のオブジェクトおよびそれらの属性に、ナビゲーショナル・アクセス(相互に関連付けられた複数のオブジェクトを横断)、または結合アクセス(宣言SQL DMLでデータの性質を指定)して操作できます。Oracle Call Interfaceには、データベース内で定義されたオブジェクト型に関するメタデータに実行時にアクセスする様々なファンクションが用意されています。「Oracle Call Interface (OCI)」および「Oracle C++ Call Interface (OCCI)」を参照してください。
Pro*C/C++のオブジェクト拡張
Oracle Pro*C/C++プリコンパイラは、埋込みSQLアプリケーション・プログラミング・インタフェースを備え、Oracle Call Interfaceより高レベルの抽象化を行います。Oracle Call Interfaceと同様に、Pro*C/C++プリコンパイラでも、アプリケーション開発者は、Oracleのクライアント側のオブジェクト・キャッシュおよびObject Type Translatorユーティリティが使用できます。Pro*C/C++は、Oracleオブジェクト型を対象としたCバインド変数の使用をサポートしています。また、Pro*C/C++には、SQL型オブジェクトの割当てや解放を行ったり、SQL DMLまたはナビゲーショナル・インタフェースを使用してこれらのオブジェクトにアクセスするための、単純化された構文が用意されています。「Oracle Call Interface (OCI)」を参照してください。
Oracle Developer Tools for Visual Studio (ODT)およびOracle Data Provider for .NET (ODP.NET)は、Oracleのオブジェクト・リレーショナル・データ型、コレクションおよびREFにマップされる.NETカスタム・オブジェクトをサポートしています。ODTは、Visual Studio統合開発環境に組み込まれたツール・セットであり、Oracle Database内部でのこれらのデータ型の管理を可能にします。ODTカスタム・クラス・ウィザードを実行すると、Oracleオブジェクトを.NETカスタム型に自動的にマップでき、Oracle Databaseと.NETアプリケーション間でのデータ共有が容易になります。これらの.NETカスタム型へのデータ・アクセスは、ODP.NETを介して行われます。
関連項目:
|