この章では、データ・カートリッジ用のスキーマから始まる例について説明します。オブジェクト型は、ドメイン・レベルの抽象化をデータベース内で取得可能にするという点で、データ・カートリッジを作成する上で重要です。
この章の内容は、次のとおりです。
関連項目 オブジェクト型の作成と使用の詳細は、次のマニュアルを参照してください。
|
Oracle Object-Relational Database Management System(ORDBMS)では、オブジェクト型を使用して現実のエンティティをモデル化します。オブジェクト型は、エンティティの構造を反映した属性と、エンティティに対する操作を実装するメソッドを持ちます。属性の定義には、組込み型または他のオブジェクト型を使用します。メソッドとは、PL/SQLまたはCのような外部言語で記述され、データベースに格納されるファンクションまたはプロシージャです。
オブジェクト型の通常の用途は、データベースに格納されるデータの一部に構造を適用することです。たとえば、カートリッジでDataStream
というオブジェクト型を使用して、大量のデータをキャラクタLOB(ラージ・オブジェクトのデータ型)に格納できます。このオブジェクト型には、識別子、名前、日付などの属性があります。例3-1の文は、DataStream
データ型を定義しています。
例3-1 DataStreamデータ型の定義方法
create or replace type DataStream as object ( id integer, name varchar2(20), createdOn date, data clob, MEMBER FUNCTION DataStreamMin return pls_integer, MEMBER FUNCTION DataStreamMax return pls_integer, MAP MEMBER FUNCTION DataStreamToInt return integer, PRAGMA restrict_references(DataStreamMin, WNDS, WNPS), PRAGMA restrict_references(DataStreamMax, WNDS, WNPS));
メソッドとは、オブジェクト型定義の一部で、オブジェクト型のデータの属性を操作できるプロシージャまたはファンクションのことです。この種のメソッドはメンバー・メソッドと呼ばれ、オブジェクト型の構成要素として指定するときにキーワードMEMBER
を取ります。DataStream
型の定義では、3つのメソッドが宣言されています。最初の2つ(DataStreamMin
およびDataStreamMax
)は、キャラクタLOB
に格納されているデータ・ストリーム内でそれぞれ最小値および最大値を計算します。
第3のメソッド(DataStreamToInt
)はマップ・メソッドであり、データ・ストリームの型のインスタンス間の比較を制御します。
プラグマ(コンパイラ・ディレクティブ)RESTRICT_REFERENCES
は、セキュリティのために必要であり、以降の項で説明します。
型を宣言した後に、型本体を定義します。本体には、型のメソッドのコードが含まれています。例3-2に、DataStream
型の型本体の定義を示します。この例では、メンバー・ファンクションのメソッド(DataStreamMin
およびDataStreamMax
)とマップ・メソッド(DataStreamToInt
)が定義されています。
例3-2 型本体の定義方法
CREATE OR REPLACE TYPE BODY DataStream IS MEMBER FUNCTION DataStreamMin return pls_integer is a pls_integer := DS_Package.ds_findmin(data); begin return a; end; MEMBER FUNCTION DataStreamMax return pls_integer is b pls_integer := DS_Package.ds_findmax(data); begin return b; end; MAP MEMBER FUNCTION DataStreamToInt return integer is c integer := id; begin return c; end; end;
DataStreamMin
およびDataStreamMax
は、PL/SQLパッケージDS_Package
内のコール・ルーチンです。これらのメソッドは計算集中型になりがちなため(CLOB
に格納されている数値を処理して最小値と最大値を判別します)、外部プロシージャとして定義されてCで実装されます。外部ディスパッチは、PL/SQLパッケージDS_Package
を介して送られます。この種のパッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
第3のメソッド、DataStreamToInt
はPL/SQLで実装されます。DataStream
に識別子(id
)属性があるため、このメソッドは識別子属性の値を戻すことができます。ただし、ほとんどのマップ・メソッドはDataStreamToInt
よりも複雑です。
CREATE
TYPE
文には、ユーザー指定のオブジェクト識別子(OID
)を型定義に関連付けるオプションのキーワードOID
があります。複数のデータベースで使用するオブジェクト型を作成する場合は、このキーワードを使用する必要があります。
型はそれぞれがOID
を持ちます。オブジェクト型を作成してもOID
を指定しなければ、OracleによりOID
が生成されて型に割り当てられます。Oracleでは、その型に関する操作に対して内部的にOID
が使用されます。エクスポート、インポートおよび分散問合せなどの操作で複数のデータベースにまたがって型のインスタンスを共有する予定の場合は、1つの型に同じOID
を使用することが重要です。
注意: OID を指定してCREATE TYPE を実行すると、OID は型自体に割り当てられます。指定した型の列を含む表に作成される各行に、行固有のOID が割り当てられます。 |
SpecialPerson
という型を作成し、その型を表SpecialPersonTable1
およびSpecialPersonTable2
を含む2つの異なるデータベースでインスタンス化する必要があるとします。RDBMSは、SpecialPerson
型が両方のインスタンスで同じ型であることを認識する必要があるため、両方のデータベースで同じOID
を使用してこの型を定義することになります。CREATE
TYPE
でOID
を指定しなければ、RDBMSにより自動的に一意識別子が作成されます。オブジェクト型のOID
を指定する構文は、例3-3のとおりです。
例3-3 オブジェクト型に対するODIの指定方法
CREATE
OR
REPLACE
TYPE
type_name OID 'oid' AS OBJECT (attribute datatype [,...]);
例3-4では、SELECT
文でOID
を生成し、CREATE
TYPE
文でOID
を使用してオブジェクト型mytype
を作成します。作成するオブジェクト型ごとに異なるOID
を生成する場合は、必ずSELECT
文を使用してください。これは、各OID
が有効でグローバルに一意であることを保証する唯一の方法であるためです。
Oracleでは、定義するオブジェクト型ごとに暗黙的にコンストラクタ・メソッドが定義されます。コンストラクタ・メソッドの名前は、オブジェクト型と同じです。コンストラクタ・メソッドのパラメータはオブジェクト型のデータ属性と同じであり、オブジェクト型の属性定義と同じ順序で発生します。各オブジェクト型に対して定義できるコンストラクタ・メソッドは1つのみです。
例3-5で、システムがrational_type
という型を作成し、このオブジェクト型に対してコンストラクタ・メソッドを暗黙的に作成します。
rational_type
のオブジェクトをインスタンス化するときには、例3-6に示されているように、コンストラクタ・メソッドを起動します。
SQLでは、オブジェクトの比較操作が実行されます。一部の比較は、比較演算子(=、<、>、<>、<=、>=、!=)とBETWEEN
およびIN
述語を使用して明示的に実行されます。他の比較は、GROUP
BY
、ORDER
BY
、DISTINCT
およびUNIQUE
句のように暗黙的です。
オブジェクトの比較には、オブジェクト型の特殊なメンバー・ファンクションであるマップ・メソッドと順序付けメソッドを使用します。オブジェクト比較を実行するには、CREATE
TYPE
およびCREATE
TYPE
BODY
文でマップ・メソッドまたは順序付けメソッドを実装する必要があります。例3-7で、DataStream
型に対する型本体はマップ・メンバー・ファンクションを実装します。
例3-7 メンバー・ファンクションの実装方法
MAP MEMBER FUNCTION DataStreamToInt return integer is c integer := id; begin return c; end;
マップ・メンバー・ファンクションのこの定義は、インスタンスを整数にマップするDataStream
型のid
属性の存在に依存しています。DataStream
型のオブジェクト間で比較操作が必要になると、システムにより暗黙的にマップ・ファンクションDataStreamToInt()
がコールされます。
オブジェクト型rational_type
には、DataStream
のような単純なid
属性はありません。かわりに、マップ・メンバー・ファンクションは、例3-8で示されているように、複雑です。マップ・ファンクションは任意の組込み型を戻すことができるため、rational_type
は値またはREAL
型を戻すことができます。
例3-8 単純なID属性なしでの型へのファンクションの実装方法
MAP MEMBER FUNCTION RationalToReal RETURN REAL IS BEGIN RETURN numerator/denominator; END; ...
オブジェクト型に対してマップ・ファンクションまたは順序付けファンクションを定義していない場合、サポートできるのは等価比較のみです。Oracle SQLでは、その型の属性がフィールドごとに比較されます。