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 オブジェクト型について
オブジェクト型はある種のデータ型です。
NUMBER
やVARCHAR2
のような標準的なデータ型を使用するのと同じ方法でオブジェクトを使用できます。たとえば、オブジェクト型をリレーショナル表の列のデータ型として指定し、オブジェクト型の変数を宣言できます。値は、その型の変数またはインスタンスです。オブジェクト・インスタンスは、オブジェクトとも呼ばれます。
図1-1に、オブジェクト型person_typ
とオブジェクト型の2つのインスタンスを示します。
オブジェクト型は、構造と動作の両方を定義する見取り図またはテンプレートとして機能します。オブジェクト型はデータベース・スキーマ・オブジェクトで、他のスキーマ・オブジェクトと同様に管理制御されます。アプリケーション・コードは、これらのオブジェクトを取得および操作できます。「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; /
オブジェクト型は、リレーショナル・データベースに固有の標準的なデータ型とは異なります。
1.3.1.2 オブジェクト・インスタンスについて
オブジェクト型の変数は、その型のインスタンス、すなわちオブジェクトです。
オブジェクトは、その型に定義された属性およびメソッドを持ちます。オブジェクト・インスタンスは具体的な存在なので、値をその属性に割り当て、そのメソッドをコールできます。
オブジェクト型を定義しても、記憶域は割り当てられません。オブジェクト型を定義すると、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.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
の各属性(idno
、first_name
、last_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
のメンバー・ファンクションが実行されて、指定の個人に関する詳細が表示されます。
関連項目:
-
VALUE
ファンクションの詳細は、「VALUE」を参照してください。 -
PL/SQLのオブジェクトへの使用の詳細は、「PL/SQLでのオブジェクト型の使用」を参照してください。
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.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
が取得します。
例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.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および問合せ拡張機能があります。
関連項目:
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またはナビゲーショナルなインタフェースを使用してそのようなオブジェクトにアクセスできます。
関連項目:
.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を介して行われます。
関連項目:
-
『Oracle Database Extensions for .NET開発者ガイドfor Microsoft Windows』
-
Oracle Developer Tools for Visual Studioヘルプ