1.3 オブジェクト・リレーショナル・モデルの主な機能

Oracle Databaseでは、オブジェクト型モデルはリレーショナル・モデルの拡張機能として実装されますが、高速コミット、バックアップとリカバリ、スケーラブルな接続性、行レベルのロック、読取り一貫性など、標準のリレーショナル・データベース機能は引き続きサポートされます。

SQLや各種のプログラム・インタフェースおよび言語(PL/SQL、Java、Oracle Call Interface、Pro*C/C++、C#など)には、Oracleオブジェクトをサポートするための拡張機能が追加されています。その結果、オブジェクト・リレーショナル・モデルが誕生し、このモデルによって、リレーショナル・データベースの優れた同時実行性とスループットを保つと同時に、オブジェクト・インタフェースの直観性と経済性が実現します。

内容は次のとおりです。

1.3.1 Oracleオブジェクトのデータベース機能

データベースに関連しているオブジェクト・リレーショナル・モデルの機能と概念がいくつかあります。

注意:

例の実行: このガイドの例の多くは、HRサンプル・スキーマを使用して実行できます。ほとんどの例には、前の例のコードが必要かどうかを示すコメントが最初に記されています。

これらのスキーマがどのように作成されているか、およびその使用方法については、『Oracle Databaseサンプル・スキーマ』を参照してください。

内容は次のとおりです。

1.3.1.1 オブジェクト型について

オブジェクト型はある種のデータ型です。

NUMBERVARCHAR2のような標準的なデータ型を使用するのと同じ方法でオブジェクトを使用できます。たとえば、オブジェクト型をリレーショナル表の列のデータ型として指定し、オブジェクト型の変数を宣言できます。値は、その型の変数またはインスタンスです。オブジェクト・インスタンスは、オブジェクトとも呼ばれます。

図1-1に、オブジェクト型person_typとオブジェクト型の2つのインスタンスを示します。

図1-1 オブジェクト型とオブジェクト・インスタンス

図1-1の説明が続きます
「図1-1 オブジェクト型とオブジェクト・インスタンス」の説明

オブジェクト型は、構造と動作の両方を定義する見取り図またはテンプレートとして機能します。オブジェクト型はデータベース・スキーマ・オブジェクトで、他のスキーマ・オブジェクトと同様に管理制御されます。アプリケーション・コードは、これらのオブジェクトを取得および操作できます。「Oracleオブジェクトの管理」を参照してください。

オブジェクト型を定義するには、CREATE TYPE文を使用します。

例1-1に、person_typというオブジェクト型の作成方法を示します。この例では、オブジェクト仕様部とオブジェクト本体が定義されています。SQL文CREATE TYPEおよびSQL文CREATE TYPE BODYの詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。

注意:

例の実行: このトピックの例の多くは、HRサンプル・スキーマを使用して実行できます。ほとんどの例には、前の例のコードが必要かどうかを示すコメントが最初に記されています。

これらのスキーマがどのように作成されているか、およびその使用方法については、『Oracle Databaseサンプル・スキーマ』を参照してください。

例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;
/

オブジェクト型は、リレーショナル・データベースに固有の標準的なデータ型とは異なります。

  • Oracle Databaseでは、事前定義のオブジェクト型は提供されません。例1-1に示したように、オブジェクト型は、ユーザー定義型と組込み型を組み合せて定義します。

  • オブジェクト型は、図1-2に示すように属性およびメソッドで構成されます。

    • 属性は、オブジェクトに関するデータを保持します。属性は宣言されたデータ型を持ち、このデータ型が別のオブジェクト型になることもあります。

    • メソッドは、アプリケーションがオブジェクト型の属性に対して操作を実行するために使用できるプロシージャまたはファンクションです。メソッドはオプションです。メソッドは、その型のオブジェクトの動作を定義します。

図1-2 オブジェクトの属性およびメソッド

図1-2は、仕様部における属性とメソッドの関係を示しています。

図1-2の説明が続きます。
「図1-2 オブジェクトの属性およびメソッド」の説明

1.3.1.2 オブジェクト・インスタンスについて

オブジェクト型の変数は、その型のインスタンス、すなわちオブジェクトです。

オブジェクトは、その型に定義された属性およびメソッドを持ちます。オブジェクト・インスタンスは具体的な存在なので、値をその属性に割り当て、そのメソッドをコールできます。

オブジェクト型を定義しても、記憶域は割り当てられません。オブジェクト型を定義すると、SQL文のNUMBERVARCHAR2のような型を使用する場所のほとんどでそのオブジェクト型を使用できるようになります。オブジェクト型のインスタンスを作成すると、記憶域が割り当てられます。

例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.3 オブジェクト・メソッドについて

オブジェクト・メソッドとは、定義された型のオブジェクトに実行させる動作を実装する目的で、オブジェクト型定義に宣言できるファンクションまたはプロシージャのことです。

型定義には、一般的に、次のようなメソッドを宣言できます。

  • メンバー・メソッド

    メンバー・メソッドを使用すると、オブジェクトのデータへのアクセスを提供できます。また、アプリケーションがデータに対して実行する操作を定義することもできます。操作を実行するために、アプリケーションはオブジェクトに対してそれに適したメソッドをコールします。

  • 静的メソッド

    静的メソッドは、オブジェクト・インスタンスを比較し、特定のオブジェクトのデータを使用しないオブジェクト型に対してグローバルな操作を実行します。

  • コンストラクタ・メソッド

    どのオブジェクト型についても、デフォルトのコンストラクタ・メソッドが暗黙的に定義されています(ユーザー定義コンストラクタによって上書きされた場合を除く)。型のオブジェクト・インスタンスを作成するときに、その型のコンストラクタ・メソッドがコールされます。

例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;

1.3.1.4 オブジェクトを表に格納する方法

オブジェクトは次の2種類の表に格納できます。

  • オブジェクト表: オブジェクトのみが格納されます。

    オブジェクト表では、それぞれの行が行オブジェクトと呼ばれる1つのオブジェクトを表します。

  • リレーショナル表: オブジェクトと他の表データが格納されます。

    リレーショナル表の列として格納されたオブジェクト、または他のオブジェクトの属性であるオブジェクトは、列オブジェクトと呼ばれます。例1-2は、person_typオブジェクトのインスタンスを格納するcontacts表を示しています。

包含しているリレーショナル・データベースの外で意味を持つオブジェクト、または複数のリレーショナル・データベース・オブジェクトの間で共有されるオブジェクトは、行オブジェクトとして参照できるようにする必要があります。つまり、そのようなオブジェクトは、リレーショナル表の列に格納するのではなく、行オブジェクトとしてオブジェクト表に格納する必要があります。

1.3.1.4.1 オブジェクト表の作成および使用

CREATE TABLE文を使用してオブジェクト表を作成します。

例1-4に、person_typオブジェクトのオブジェクト表を作成するCREATE TABLE文を示します。

例1-4 person_obj_tableオブジェクト表の作成

-- requires Ex. 1-1
CREATE TABLE person_obj_table OF person_typ;

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

  • 各行にperson_typオブジェクトが入っている単一列表として表示します。ここでは、オブジェクト指向操作が実行できます。

  • オブジェクト型person_typの各属性(idnofirst_namelast_nameなど)が列を占有している複数列表として表示します。ここでは、リレーショナル操作を実行できます。

1.3.1.4.2 オブジェクト表に対する操作の実行

表にオブジェクトを挿入したり、表からオブジェクトを選択するなど、オブジェクト表に対して様々な操作を実行できます。

例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は、単一列表としてperson_obj_tableから値を選択し、VALUEファンクションを使用して、オブジェクト・インスタンスとして行が戻されます。

PL/SQLブロックでは、特定の個人が選択され、person_typのメンバー・ファンクションが実行されて、指定の個人に関する詳細が表示されます。

関連項目:

1.3.1.5 行オブジェクトの識別に使用されるオブジェクト識別子

オブジェクト識別子(OID)は、オブジェクト表の行オブジェクトを一意に識別します。

オブジェクト識別子に直接アクセスすることはできませんが、「行オブジェクトへの参照」で説明するように、オブジェクト識別子への参照(REF)を作成してREFに直接アクセスすることはできます。

2種類のオブジェクト識別子があります。

  • システム生成のオブジェクト識別子(デフォルト)

    主キー・ベースのオプションを選択しないかぎり、オブジェクト表の行オブジェクトには、システム生成のオブジェクト識別子が自動的に作成されます。

  • 主キー・ベースのオブジェクト識別子

    CREATE TABLE文を使用して表を作成するときに、主キー・ベースのOIDを作成することを選択できます。

注意:

列オブジェクトは行の主キーで識別されるため、特定のオブジェクト識別子は必要ありません。

1.3.1.6 行オブジェクトへの参照

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がオブジェクト識別子ではなく名前で表示されるように、オブジェクトを参照解除する方法を示します。

1.3.1.6.1 有効範囲付きREFの使用

有効範囲付きREFでは、有効範囲指定なしのREFに比べて、少ない記憶域でより効率的なアクセスが可能です。

指定したオブジェクト表を参照するように列型、コレクション要素またはオブジェクト型属性を制約できます。REFを宣言するときに、SQL制約副次句SCOPE ISを使用します。

例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列が効果的に制約されます。

1.3.1.6.2 参照先がないREFのチェック

参照先がないREFとは、REFにより識別されるオブジェクトが使用できなくなっているREFです。オブジェクトが削除されている場合、またはオブジェクトに対して必要な権限が削除されている場合、オブジェクトは使用できません。

Oracle DatabaseのSQL述語IS DANGLINGを使用して、参照先がないREFがないかREFをテストします。

参照先がないREFは、参照整合性制約を定義することによって回避できます。

1.3.1.7 REFの参照解除

REFが参照するオブジェクトにアクセスすることを、REFを参照解除するといいます。

DEREFコマンドを使用する/しないの両方で、REFを参照解除する方法が様々あります。

内容は次のとおりです。

1.3.1.7.1 DEREFコマンドを使用したREFの参照解除

この例では、DEREFコマンドを使用してREFを参照解除する方法を示します。

例1-8 DEREFを使用したREFの参照解除

SELECT DEREF(e.manager) FROM emp_person_obj_table e;
DEREF(E.MANAGER)(NAME, MANAGER)
-------------------------------------------------------------
---
EMP_PERSON_TYP('John Smith', NULL)

この例は、参照先がないREFを参照解除するとNULLオブジェクトが戻されることを示しています。

1.3.1.7.2 参照先がないREFの参照解除

DELETEコマンドを使用して参照先がないREFを参照解除できます。

参照先がないREFを参照解除するとNULLオブジェクトが戻されます。

例1-9 参照先がないREFの参照解除

DELETE from person_obj_table WHERE idno = 101;
/
SELECT DEREF(c.contact_ref), c.contact_date FROM contacts_ref c;
1.3.1.7.3 REFの暗黙的な参照解除

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キーワードが必要です。

1.3.1.8 行オブジェクトへのREFの取得

オブジェクト表からオブジェクトを選択してREF演算子を適用することで、その行オブジェクトに対するREFが取得します。

  • オブジェクト表からオブジェクトを選択してREF演算子を適用します。

例1-11に、idno101である個人に対するREFを取得する方法を示します。

問合せは1行のみを戻します。

例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;
/

関連項目:

REFの記憶域サイズ

1.3.1.9 比較されるREF変数

2つのREF変数の比較ができるのは、これらの変数が参照するターゲットに宣言された型が一致するか、または一方がもう一方のサブタイプの場合のみです。

REF変数は、等価比較のみ実行できます。

1.3.1.10 Oracleコレクション・データ型

Oracle Databaseでは、複数値属性および多対多リレーションシップをモデル化するために、次の2つのコレクション・データ型がサポートされます。

  • VARRAY

  • ネストした表

コレクション型は、他のデータ型が使用されるところであれば、どこでも使用できます。また、コレクション型の列に加え、コレクション型のオブジェクト属性も使用できます。たとえば、発注書オブジェクト型に、発注書についての明細項目のコレクションを格納するためのネストした表属性を持たせることができます。

コレクション型を定義するには、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型のオブジェクトです。

関連項目:

コレクション・データ型

1.3.1.11 リレーショナル・データへのアクセスに使用されるオブジェクト・ビュー

オブジェクト・ビューは、オブジェクト・リレーショナル機能を使用して関連するデータにアクセスする方法です。

オブジェクト・ビューを使用すると、基礎となるリレーショナル・スキーマを変更せずに、オブジェクト指向アプリケーションを開発できます。

オブジェクト・ビューに属するオブジェクトには、オブジェクト表の行オブジェクトにアクセスする場合と同じ方法でアクセスできます。Oracle Databaseでは、リレーショナル・スキーマおよび表に格納されたデータからの、ユーザー定義型のマテリアライズド・ビュー・オブジェクトの生成もサポートされています。

オブジェクト・ビューを使用すると、型階層によりもたらされるポリモフィズム(多相性)を活用できます。ポリモフィックな式は、その式の宣言された型またはその型のサブタイプの値をとります。ある型階層の構造の一部または全部をミラー化するオブジェクト・ビューの階層を作成すると、その階層内のすべてのビューに対して問合せを行い、関心のある特化レベルでデータにアクセスできます。サブビューを持つオブジェクト・ビューの問合せを行う場合は、ポリモフィック・データ、すなわちビューの型とそのサブタイプの両方の行を取得できます。

1.3.1.12 型継承の使用

型継承を使用すると、型階層を作成できます。

型階層とは、スーパータイプと呼ばれる、共通する祖先のオブジェクト型から導出される特化されたサブタイプの連続レベルのセットです。導出サブタイプは、親オブジェクト型の機能を継承すると同時に、親の型定義を拡張できます。特殊な型を使用することで、新しい属性またはメソッドの追加や、親から継承するメソッドの再定義ができます。その結果発生する型階層により、アプリケーション・モデルの複雑さを管理するために必要な高度な抽象化レベルが得られます。たとえば、一般的な個人オブジェクト型から、追加属性またはメソッドを持つ、個人の特殊な型である学生型または定時制の学生型を導出できます。

図1-3は、Person_tの下に作成されたStudent_tおよびEmployee_tという2つのサブタイプと、Student_tの下に作成された1つのサブタイプPartTimeStudent_tを示しています。

1.3.1.13 既存のオブジェクト型の変更に使用される型進化

型進化を使用すると、既存のオブジェクト型を(すでに表で使用されていても)変更したり、進化させることができます。

型進化はALTER TYPE文によって行われるため、そのオブジェクト型のすべてのインスタンスに変更を伝播できます。

ALTER TYPE文は、CREATE TYPE文と基本的に同じ妥当性チェックを使用して、変更対象の型の依存関係を調べます。型またはその依存型のいずれかについて型の妥当性が確認されない場合は、ALTER TYPE文はロールバックします。

変更された型を使用するすべての表および列のメタデータは、データを新しい形式で格納できるように、新しい型定義に対応して更新されます。既存データは、データ更新時に一括または個別に新しい形式に変換できます。いずれの場合も、データは、古い型定義の形式のまま格納されていても、必ず新しい型定義で表示されます。

1.3.2 Oracleオブジェクトの言語にバインドされた機能

オブジェクト・リレーショナル・モデルの主な機能には、言語およびApplication Programming Interface (API)に関連しているものがあります。

関連している言語およびApplication Programming Interface (API)は、次のとおりです。

SQLのオブジェクトの拡張

オブジェクト関連機能をサポートするために、Oracle Databaseには、オブジェクト型の作成、変更または削除、オブジェクト型の表への格納、オブジェクト・ビューの作成、変更または削除を行うためのSQL拡張機能(DDLを含む)が用意されています。オブジェクト型、参照およびコレクションをサポートするためのDMLおよび問合せ拡張機能があります。

関連項目:

SQLおよびオブジェクト型

PL/SQLのオブジェクト拡張

PL/SQLでは、オブジェクト型をシームレスに操作できます。したがって、アプリケーション開発者は、PL/SQLを使用して、データベース・サーバー内で実行するユーザー定義型に対してロジックや操作を実装できます。

Oracleオブジェクトに対するJavaのサポート

Oracle Java VMはOracle Databaseと密接に統合されており、Java Database Connectivity (JDBC)へのオブジェクト拡張機能を介して行うOracleオブジェクトへのアクセスをサポートします。これにより動的SQLが提供され、また静的SQLを提供するSQLJが提供されます。したがって、アプリケーション開発者は、Javaを使用して、データベース内で実行するオブジェクト型に対してロジックや操作を実装できます。SQL型を既存のJavaクラスにマップして、Javaオブジェクトに永続ストレージを持たせることができます。

関連項目:

外部プロシージャ

オブジェクト型のデータベース・ファンクション、プロシージャまたはメンバー・メソッドは、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には、データベース内で定義されたオブジェクト型に関するメタデータに実行時にアクセスするための機能が多数用意されています。

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)

.NETのオブジェクトの拡張

Oracle Developer Tools for Visual Studio (ODT)およびOracle Data Provider for .NET (ODP.NET)では、Oracleのオブジェクト・リレーショナル・データ型、コレクションおよびREFにマップされる.NETカスタム・オブジェクトがサポートされます。ODTは、Visual Studio統合開発環境に組み込まれたツール・セットであり、Oracleデータベース内部でのこのようなデータ型の管理を可能にします。ODTカスタム・クラス・ウィザードを使用すると、Oracleオブジェクトを.NETカスタム型に自動的にマップでき、Oracleデータベースと.NETアプリケーション間でのデータ共有が容易になります。このような.NETカスタム型へのデータ・アクセスは、ODP.NETを介して行われます。