ヘッダーをスキップ
Oracle® Databaseオブジェクト・リレーショナル開発者ガイド
11gリリース2 (11.2)
E94920-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

1 Oracleオブジェクトの概要

この章では、Oracleオブジェクト・リレーショナル・モデルの主な機能および利点について説明します。内容は次のとおりです。

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++、OO4OおよびC#など)には、Oracleオブジェクトをサポートするための拡張機能が追加されています。その結果、リレーショナル・データベースの優れた並行性とスループットを保つと同時に、オブジェクト・インタフェースの直観性と経済性を実現する、オブジェクト・リレーショナル・モデルが誕生しました。

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

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

この項では、データベースに関連のあるオブジェクト・リレーショナル・モデルの機能と概念を説明します。

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

オブジェクト型について

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

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

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

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

オブジェクト型は、構造と動作の両方を定義する見取り図またはテンプレートとして機能します。オブジェクト型はデータベース・スキーマ・オブジェクトで、他のスキーマ・オブジェクトと同様に管理制御されます。アプリケーション・コードは、これらのオブジェクトを取得および操作できます。第7章「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 オブジェクトの属性およびメソッド」の説明

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

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

オブジェクト型を定義しても、記憶域は割り当てられません。オブジェクト型を定義すると、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'), 
 '24 Jun 2003' );

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文を示します。

例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-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の組込みデータ型です。REFREFのコレクションではオブジェクト間の関連付け(特に多対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の使用

指定したオブジェクト表を参照するように列型、コレクション要素またはオブジェクト型属性を制限するには、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により識別されるオブジェクトが使用できなくなることがあります。これを参照先がないREFといいます。Oracle DatabaseのSQL述語IS DANGLINGを使用すると、REFがこの条件を満たしているかどうかをテストできます。

参照先がないREFは、参照整合性制約を定義することによって回避できます。「REF型の列および属性のルール」を参照してください。

REFの参照解除

REFが参照するオブジェクトにアクセスすることを、REFを参照解除するといいます。Oracle Databaseでは、この参照解除を行うDEREF演算子が提供されています。

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

-- requires Ex. 1-6
SELECT DEREF(e.manager) FROM emp_person_obj_table e;

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演算子を適用することで、その行オブジェクトに対するREFが取得できます。

例1-11に、idno101である個人に対する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の記憶域サイズ」を参照してください。

REF変数の比較

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

Oracleコレクションの使用

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文はロールバックします。

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

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

この項では、言語および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)」を参照してください。

OO4Oのオブジェクト拡張

Oracle Objects For OLE (OO4O)は、一連のCOMオートメーション・インタフェースおよびオブジェクトで、Oracleデータベース・サーバーに接続し、問合せを実行し、結果を管理します。OO4Oのオートメーション・インタフェースは、Oracle Databaseの機能に簡単かつ効率的にアクセスする手段となります。このインタフェースは、Microsoft COMオートメーション・テクノロジをサポートする、実質的にほとんどのプログラミング言語またはスクリプティング言語で使用できます。これらの言語としては、Visual Basic、Visual C++、ExcelのVBA、VBScriptおよびIIS Active Server PagesのJavaScriptがあります。「Oracle Objects for OLE (OO4O)」を参照してください。

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

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を介して行われます。


関連項目:

  • 『Oracle Database Extensions for .NET開発者ガイド』

  • 『Oracle Data Provider for .NET開発者ガイド』

  • Oracle Developer Tools for Visual Studioヘルプ