Oracleデータベースでは、SQL DDLコマンドを使用してオブジェクト型を作成し、SQL DMLコマンドを使用してオブジェクトを操作できます。そこから、多くのOracleアプリケーション・プログラミング環境およびOracleオブジェクトの組込みサポートを含むツールを使用できます。
内容は次のとおりです。
Oracle SQLデータ定義言語(DDL)では、オブジェクト型に対して次のようなサポートが提供されます。
オブジェクト型、ネストした表および配列の定義
権限の指定
オブジェクト型の表の列の指定
オブジェクト表の作成
Oracle SQL DMLでは、オブジェクト型に対して次のようなサポートが提供されます。
オブジェクトおよびコレクションの問合せおよび更新
REF
の操作
関連項目: Oracle SQL構文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
SQL Developerは、データベース開発者およびDBAのビジュアル開発環境を提供して、Oracleオブジェクトを含むデータベース・スキーマ・オブジェクトの作成と操作、レポートの実行、豊富なグラフィカル・ユーザー・インタフェースを使用したパフォーマンスの監視および他の多くのデータベース関連タスクの実行を行います。
関連項目: 『Oracle SQL Developerユーザーズ・ガイド』 |
オブジェクト型およびサブタイプは、組込み型が使用可能なほとんどの場所において、PL/SQLプロシージャおよびファンクションで使用できます。
PL/SQLファンクションおよびプロシージャのパラメータおよび変数には、オブジェクト型を使用できます。
PL/SQLには、オブジェクト型と対応付けられたメソッドを実装できます。これらのメソッド(ファンクションおよびプロシージャ)は、ユーザーのスキーマの一部としてサーバーに格納します。
関連項目: PL/SQLの詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。 |
OCIとは、アプリケーションがOracleデータベース内でデータおよびスキーマを操作するために使用できる、一連のCライブラリ関数のことです。OCIでは、次の項で説明するように、データベース・アクセスに従来の3GLおよびオブジェクト指向技法の両方がサポートされています。
OCIの重要なコンポーネントは、オブジェクト・キャッシュと呼ばれる作業領域を管理する一連のコールです。オブジェクト・キャッシュは、クライアント側のメモリー・ブロックで、このメモリー・ブロックにより、サーバーに対しさらにラウンドトリップを行わなくても、プログラムはオブジェクト全部を格納し、オブジェクト間をナビゲートできます。
オブジェクト・キャッシュは、それを使用するアプリケーションによって完全に制御および管理されます。Oracleサーバーは、オブジェクト・キャッシュにアクセスできません。オブジェクト・キャッシュを使用するアプリケーション・プログラムは、サーバーと一体となってデータ一貫性を保持し、同時発生する競合アクセスから作業領域を保護する必要があります。
OCIは、次の機能を備えています。
ポインタまたはREF
を利用することによって、オブジェクト・キャッシュ内のオブジェクトにアクセスし、操作および管理します。
Oracleの日付、文字列および数値をCのデータ型に変換します。
オブジェクト・キャッシュのメモリー・サイズを管理します。
OCIは、オブジェクトを個々にロックできるようにして、同時実行性を改善します。これは、複雑なオブジェクト検索をサポートして、パフォーマンスを改善します。
OCI開発者は、Object Type Translatorを使用して、Oracleオブジェクト型に対応するCのデータ型を生成できます。
関連項目: OCIでオブジェクトを使用する場合の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。 |
3GLプログラムは、SQL文およびPL/SQLプロシージャを実行し、リレーショナル・データベースに格納されたデータを操作します。データは、通常サーバー上で処理されるので、クライアント側にデータを転送するコストが発生しません。OCIでは、オブジェクト・データを操作するSQL文を実行するAPIを提供することによって、この結合アクセスをサポートしています。特に、OCIでは、次のことができます。
オブジェクト・データおよびオブジェクト型スキーマ情報を操作するSQL文を実行します。
オブジェクト、オブジェクト参照(REF
)およびコレクションを、SQL文の入力変数として渡します。
オブジェクト、REF
およびコレクションを、SQL文フェッチの出力として戻します。
オブジェクト、REF
およびコレクションを戻すSQL文のプロパティを記述します。
オブジェクトのパラメータまたは結果を持つPL/SQLプロシージャまたはファンクションを記述し実行します。
拡張されたコミットおよびロールバック関数を介して、オブジェクト機能とリレーショナル機能を並用できます。
「Pro*C/C++での連想アクセス」を参照してください。
オブジェクト指向のプログラミング・パラダイムでは、アプリケーションは、実社会のエンティティを、オブジェクト・グラフを形成する相互関連オブジェクトの集合としてモデル化します。オブジェクト間の関連は、参照として実装されます。アプリケーションは、いくつかのイニシャル・オブジェクトの集合から始めて、これらのイニシャル・オブジェクトの参照を使用して残りのオブジェクトにアクセスし、各オブジェクトで計算処理を実行することで、オブジェクトを処理します。OCIでは、ナビゲーショナル・アクセスとして知られる、オブジェクト参照を使用してオブジェクト間のアクセスを行うためのAPIが提供されています。特に、OCIでは、次のことができます。
クライアント・マシン上のメモリーにオブジェクトをキャッシュします。
オブジェクト参照を解除し、オブジェクト・キャッシュ内の対応するオブジェクトを確保します。確保されたオブジェクトは、ホスト言語表現に透過的にマップされます。
確保されたオブジェクトが不要になった場合、キャッシュに通知します。
1回のコールで、関連するオブジェクトをまとめてデータベースからクライアント・キャッシュにフェッチします。
オブジェクトをロックします。
キャッシュ上でオブジェクトを作成、更新および削除します。
クライアント・キャッシュ上でオブジェクトに対して行われた変更を、データベースに反映します。
「Pro*C/C++でのナビゲーショナル・アクセス」を参照してください。
高パフォーマンスのオブジェクト・ナビゲーショナル・アクセスをサポートするために、OCIランタイムでは、メモリーにオブジェクトをキャッシュするためのオブジェクト・キャッシュを提供しています。オブジェクト・キャッシュは、オブジェクト・キャッシュ内のデータベース・オブジェクトへの参照(REF
)をサポートし、データベース・オブジェクトは、それらの参照を介して識別(確保)されます。オブジェクト・キャッシュは、データベース・オブジェクトに対して透過的で効率的なメモリー管理を提供するため、アプリケーションは、データベース・オブジェクトがキャッシュにロードされたときに、メモリーを割り当てたり解放する必要はありません。
さらに、データベース・オブジェクトは、キャッシュにロードされた際、ホスト言語に透過的にマップされます。たとえば、C言語では、データベース・オブジェクトは対応するC構造体へマップされます。オブジェクト・キャッシュは、キャッシュ上のオブジェクトと対応するデータベース・オブジェクトとの間の整合性を保ちます。トランザクションのコミット時にキャッシュ上のオブジェクト・コピーに対して行われた変更は、データベースに自動的に反映されます。
オブジェクト・キャッシュでは、REF
をオブジェクトにマップするために、高速参照表がメンテナンスされます。アプリケーションがREF
を参照解除するときに、対応するオブジェクトがまだキャッシュされていない場合は、オブジェクト・キャッシュからサーバーに自動的に要求が送信され、データベースからオブジェクトがフェッチされてオブジェクト・キャッシュにロードされます。同一のREF
に対するその後の参照解除は、ローカル・キャッシュ・アクセスになり、ネットワークのラウンドトリップが発生しないため、より高速になります。キャッシュ内のオブジェクトにアクセス中であることをオブジェクト・キャッシュに通知するために、アプリケーションはオブジェクトを確保し、オブジェクトの処理が終わった時点で確保解除します。オブジェクト・キャッシュは、キャッシュの各オブジェクトの確保カウントをメンテナンスします。確保カウントは、確保コール(ピン・コール)で増加し、確保解除コール(アンピン・コール)で減少します。確保カウントが0になると、アプリケーションがそのオブジェクトを必要としなくなったことを意味します。オブジェクト・キャッシュでは最低使用頻度(LRU)アルゴリズムを使用して、キャッシュのサイズが管理されます。キャッシュが最大サイズに達すると、LRUアルゴリズムによって確保カウントが0の候補オブジェクトが解放されます。
オブジェクトを操作するOCIプログラムを作成するときは、次の一般的な手順を実行する必要があります。
アプリケーション・オブジェクトに対応するオブジェクト型を定義します。
SQL DDL文を実行して、必要なオブジェクト型をデータベースに定義します。
オブジェクト型をホスト言語形式で表します。
たとえば、Cプログラムでオブジェクト型のインスタンスを操作するには、それらの型をC言語形式で記述する必要があります。そのためには、オブジェクト型をC構造体で表します。OTTというツールを使用すると、オブジェクト型に対応するCの構造体を生成できます。OTTは、等価なC構造体をヘッダー・ファイル(*.h)に作成します。これらの*.hファイルを、アプリケーションを実装するC関数を含む*.cファイルにインポートします。
アプリケーションの*.cファイルをOCIライブラリとともにコンパイルおよびリンクすることによって、アプリケーションの実行可能ファイルを作成します。
関連項目: OCIプログラムをオブジェクトとともに効果的に使用するためのヒントおよび技法は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。 |
Cでユーザー定義コンストラクタを定義する場合は、PARAMETERS
句にSELF
(オプションで、SELF
TDO
)を指定する必要があります。C関数を入力すると、オブジェクトがマップされるすべてのC構造体の属性は、NULL
に初期化されます。関数により戻される値は、ユーザー定義型のインスタンスにマップされます。例4-1に、Cでユーザー定義コンストラクタを定義する方法を示します。
例4-1 Cにおけるユーザー定義コンストラクタの定義
CREATE LIBRARY person_lib TRUSTED AS STATIC / CREATE TYPE person AS OBJECT ( name VARCHAR2(30), CONSTRUCTOR FUNCTION person(SELF IN OUT NOCOPY person, name VARCHAR2) RETURN SELF AS RESULT); / CREATE TYPE BODY person IS CONSTRUCTOR FUNCTION person(SELF IN OUT NOCOPY person, name VARCHAR2) RETURN SELF AS RESULT IS EXTERNAL NAME "cons_person_typ" LIBRARY person_lib WITH CONTEXT PARAMETERS(context, SELF, name OCIString, name INDICATOR sb4); END;/
SELF
パラメータは、INパラメータと同様にマップされるため、NOT
FINAL
型の場合、(dvoid **)
ではなく(dvoid *)
にマップされます。
戻り値のTDO
は、SELF
のTDO
と一致する必要があるため暗黙的です。戻り値はNULLになり得ないため、戻りインジケータも暗黙的です。
Oracle Pro*C/C++プリコンパイラを使用すると、プログラマはユーザー定義データ型をCプログラムおよびC++プログラムで使用できます。
Pro*C開発者は、Object Type Translatorを使用して、Oracleオブジェクト型およびコレクションを、Pro*Cアプリケーションで使用できるCのデータ型にマップできます。
Pro*Cでは、コンパイル時のオブジェクト型とコレクションのタイプ・チェック、およびデータベースのデータ型からCのデータ型への自動型変換が行われます。
Pro*Cには、オブジェクトを作成および破棄するためのEXEC SQL構文が含まれており、次の2つを使用してサーバーにあるオブジェクトにアクセスできます。
オブジェクト・キャッシュへのインタフェース(「Oracle Call Interface (OCI)」を参照)。この場合、オブジェクトにはポインタを介してアクセスし、サーバー上で変更および更新できます。
関連項目: Pro*Cプリコンパイラの詳細は、『Pro*C/C++プログラマーズ・ガイド』を参照してください。 |
連想アクセスのバックグラウンド情報については、「OCIプログラムにおける連想アクセス」を参照してください。
Pro*C/C++では、オブジェクトの連想アクセスに対して次の機能が提供されます。
オブジェクト・キャッシュに割り当てられたオブジェクトの一時コピーのサポート
埋込みSQLのINSERT
、UPDATE
、DELETE
文、またはSELECT
文のWHERE
句の入力ホスト変数として参照されるオブジェクトの一時コピーのサポート
埋込みSQLのSELECT
およびFETCH
文で出力ホスト変数として参照されるオブジェクトの一時コピーのサポート
オブジェクトの型およびスキーマ情報を取得するためにDESCRIBE
文を介してオブジェクト型を参照する、ANSI動的SQL文のサポート
ナビゲーショナル・アクセスのバックグラウンド情報については、「OCIプログラムのナビゲーショナル・アクセス」を参照してください。
Pro*C/C++では、オブジェクトに対してさらにオブジェクト指向のインタフェースをサポートするために、次の機能が提供されます。
埋込みSQLのOBJECT
DEREF
文を使用した、オブジェクト・キャッシュでのオブジェクトの参照解除、確保およびロック(オプション)のサポート
オブジェクトが更新または削除された場合、または不要になった場合に、Pro*C/C++ユーザーが埋込みSQLのOBJECT
UPDATE
、OBJECT
DELETE
およびOBJECT
RELEASE
文を使用してオブジェクト・キャッシュに通知できる機能
埋込みSQLのOBJECT
CREATE
文を使用して、オブジェクト・キャッシュに新しい参照可能オブジェクトを作成するための機能
オブジェクト・キャッシュでの変更を、埋込みSQLのOBJECT
FLUSH
文を使用してサーバーにフラッシュするための機能
OTTによって生成されるオブジェクトのC表現では、スカラー属性に対してOCIString
やOCINumber
などの、内部詳細が非表示にされたOCI型が使用されます。コレクション型およびオブジェクト参照も、OCITable
、OCIArray
およびOCIRef
型を使用して同様に表されます。この不透明な型を使用すると、これらの型の内部形式の変更が見えなくなるため、CまたはC++アプリケーションでこれらの型を使用することはお薦めしません。Pro*C/C++では、CおよびC++アプリケーションでOCI型を簡単に使用できるように、次の拡張が行われています。
埋込みSQLのOBJECT
GET
文を使用することで、オブジェクト属性を取得し暗黙的にCのデータ型に変換可能。
埋込みSQLのOBJECT
SET
文を使用することで、オブジェクト属性をCのデータ型で設定可能。
埋込みSQLのCOLLECTION
GET
文を使用することで、コレクションをホスト配列にマップ可能。さらに、コレクションがスカラー型で構成されている場合、OCI型は、暗黙的にCのデータ型に変換されます。
埋込みSQLのCOLLECTION
SET
文を使用することで、ホスト配列でコレクションの要素を更新可能。COLLECTION
GET
文と同様、コレクションがスカラー型で構成されている場合、Cのデータ型は、暗黙的にOCI型に変換されます。
OCCIは、C++プログラミング言語のオブジェクト指向機能、ネイティブ・クラスおよびメソッドを使用して、OracleデータベースにアクセスできるようにするC++ APIの1つです。
OCCIインタフェースはJDBCインタフェースを基に作成されているため、JDBCインタフェースのように扱いが簡単です。OCCIそのものがOCIの上に構築され、オブジェクト指向パラダイムを使用してOCIの能力およびパフォーマンスを提供します。
OCIは、Oracle Database用のC APIです。Oracleの全機能セットをサポートし、リレーショナル・データとオブジェクト・データへ効率的にアクセスしますが、特に複雑なオブジェクト・データ型を扱う場合には、問題が発生する可能性があります。オブジェクト型はCではネイティブ・サポートされていないため、Cでこれらの型をシミュレートするのは容易ではありません。OCCIは、OCIの機能に単純なオブジェクト指向インタフェースを持たせることで、この問題に取り組みます。OCI用のラッパー1組を定義して、これを行います。このような高度な抽象化を扱うことにより、開発者はOCIの基盤となる機能を使用して、非常にプログラムしやすいオブジェクト指向インタフェースを介してサーバーでオブジェクトを操作できます。
OCCIは、次の3つの機能セットに分類できます。
結合リレーショナル・アクセス
結合オブジェクト・アクセス
ナビゲーショナル・アクセス
結合リレーショナルAPIおよびオブジェクト・クラスにより、SQLにデータベースへアクセスする機能が提供されます。これらのインタフェースを介してSQLをサーバー上で実行し、オブジェクトまたはリレーショナル・データを作成および操作し、フェッチします。アプリケーションは、次のようなサーバー上のどのデータ型にもアクセスできます。
ラージ・オブジェクト
オブジェクト/構造型
配列
参照
ナビゲーショナル・インタフェースとは、SQLを使用せずに、C++オブジェクトの形式で表現されたオブジェクト・リレーショナル・データにシームレスにアクセスし、修正できるようにするC++インタフェースです。C++オブジェクトは透過的にアクセスし、必要に応じてデータベースに格納します。
OCCIナビゲーショナル・インタフェースを使用すると、オブジェクトを取り出し、参照によりオブジェクト間をナビゲートできます。サーバー・オブジェクトはアプリケーション・キャッシュ内部でC++クラス・インスタンスとして具体化されます。
アプリケーションはOCCIオブジェクト・ナビゲーショナル・コールを使用して、サーバー・オブジェクトに対し次の機能を実行できます。
オブジェクトの作成、アクセス、ロック、削除およびフラッシュ
オブジェクトの参照の取得およびオブジェクトのナビゲート
関連項目: Oracle C++ APIを使用したアプリケーションの作成方法の詳細は、『Oracle C++ Call Interfaceプログラマーズ・ガイド』を参照してください。 |
OO4Oでは、Oracleデータベース・サーバーにあるREF
のインスタンス、値インスタンス、可変長配列(VARRAY
)およびネストした表へのアクセスおよび操作が完全にサポートされます。
Windowsシステム上では、OO4Oを使用して、Visual Basic、またはExcel、ActiveXおよびActive Server PagesなどのCOMプロトコルをサポートする他の環境で、オブジェクト指向データベース・プログラムを作成できます。
関連項目: OO4OをOracleオブジェクトとともに使用する方法の詳細および使用例は、Oracle Objects for OLEの『Oracle Objects for OLE開発者ガイド』の「サーバー・オブジェクト」の章を参照してください |
図4-1に、OO4Oにおけるすべての型の値インスタンスの抑制階層を示します。
これらの型のインスタンスは、データベースからフェッチできるか、またはSQL文および(ストアド・プロシージャおよびファンクションを含む)PL/SQLブロックに対する入力変数または出力変数として渡すことができます。すべてのインスタンスは、属性の動的アクセスおよび操作用のメソッドを提供する、COMオートメーション・インタフェースにマップされます。このインタフェースは、次のものから取得できます。
dynasetのOraField
オブジェクトの値プロパティ
SQL文またはPL/SQLブロックで入力または出力パラメータとして使用されるOraParameter
オブジェクトの値プロパティ
オブジェクトの属性(REF
)
コレクションの要素(VARRAYまたはネストした表)
OraObject
インタフェースは、Oracle埋込みオブジェクトまたは値インスタンスの表現形式です。これには、値インスタンスの個々の属性にアクセスおよび操作(更新および挿入)するためのコレクション・インタフェース(OraAttributes
)が含まれます。OraAttributes
コレクション・インタフェースの個々の属性には、添字または属性の名前を使用して、アクセスできます。
次のVisual Basicの例では、person_tab
表のAddress
オブジェクトの属性にアクセスする方法を示します。
Dim Address OraObject
Set Person =
OraDatabase.CreateDynaset("select * from person_tab", 0&)
Set Address = Person.Fields("Addr").Value
Msgbox Address.Zip
Msgbox.Address.City
OraRef
インタフェースは、Oracleオブジェクト参照(REF
)を表すと同時に、クライアント・アプリケーションの参照可能なオブジェクトを表します。このオブジェクト属性には、OraObject
インタフェースによって表されるオブジェクトの属性と同じ方法でアクセスできます。OraRef
は、COMでの抑制メカニズムを介して、OraObject
インタフェースから導出されます。REF
オブジェクトは、dynasetなど導出元となるコンテキストからは独立して、更新および削除できます。OraRef
インタフェースでは、OCIの複合オブジェクト検索機能(COR)を使用して、オブジェクト間の関連をたどる機能のカプセル化も行います。
関連項目: OCIプログラムをオブジェクトとともに効果的に使用するためのヒントおよび技法は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。 |
OraCollection
インタフェースでは、OO4OにおいてOracleコレクション型、つまり可変長配列(VARRAY
)およびネストした表にアクセスおよび操作するためのメソッドが提供されます。コレクションに含まれる要素には、添字でアクセスできます。
次のVisual Basicの例では、department
表のEnameList
オブジェクトの属性にアクセスする方法を示します。
Dim EnameList OraCollection
Set Person =
OraDatabase.CreateDynaset("select * from department", 0&)
Set EnameList = Department.Fields("Enames").Value
'The following loop accesses all elements of
'the EnameList VArray
For I=1 to I=EnameList.Size
Msgbox EnameList(I)
Next I
Javaは、開発者に簡単で効率的でポータブルかつ安全なアプリケーション開発プラットフォームを提供する強力な最新のオブジェクト指向言語として登場しました。Oracleでは、Oracleオブジェクト機能をJavaと統合する様々な方法を提供しています。これらのインタフェースにより、JavaからSQLデータにアクセスできるようになるのみでなく、Javaオブジェクトの永続データベース記憶域が得られます。
JDBCは、Oracleサーバーに接続するためのJavaインタフェースの集合です。Oracleでは、オブジェクトとJDBCの間の緊密な統合が提供されます。SQL型はJavaクラスにマップでき、このマップ方法について、かなりの柔軟性が提供されています。
Oracle JDBC:
動的SQLを使用して、Javaプログラム内でオブジェクト型およびコレクション型(データベースで定義)にアクセスできます。
デフォルトまたはカスタマイズ可能なマッピングを使用して、データベースで定義されたデータ型をJavaクラスに変換します。
JDBC 2.0では、ユーザー定義型(オブジェクト型)などのオブジェクト・リレーショナル構造がサポートされています。JDBCは、Oracleオブジェクトを特定のJavaクラスのインスタンスとして具体化します。JDBCを使用してOracleオブジェクトにアクセスするには、OracleオブジェクトについてJavaクラスを作成し、これらのクラスを移入する必要があります。たとえば、次のような処理を行うことができます。
JDBCにオブジェクトをSTRUCT
として具体化させます。この場合、JDBCは属性のクラスを作成し、作成したクラスを移入します。
OracleオブジェクトとJavaクラスの間のマッピングを手動で指定します。つまり、Javaクラスをオブジェクト・データ用にカスタマイズします。この後、ドライバはカスタマイズされた指定のJavaクラスを移入し、これがJavaクラスに対する一連の制約となります。これらの制約に従うために、クラスをSQLData
インタフェースまたはORAData
インタフェースのどちらにあわせて定義するかを選択できます。
関連項目: Oracle JDBCドライバの詳細は、『Oracle Database JDBC開発者ガイドおよびリファレンス』を参照してください。 |
SQLJでは、Javaコードに埋め込んだSQL文を使用して、サーバー・オブジェクトへアクセスできます。
Javaプログラムでオブジェクト型を使用可能です。
JPublisherを使用して、オブジェクト型およびコレクション型を、アプリケーションで使用できるJavaクラスにマップします。
SQL文のオブジェクト型およびコレクション型は、コンパイル時にチェックされます。
関連項目: SQLJの詳細は、『Oracle Database Java開発者ガイド』を参照してください |
Oracle SQLJでは、イテレータまたはホスト式で使用するオブジェクト型、参照型(REF
)およびコレクション型(VARRAYおよびネストした表)の強力な型指定または緩い型指定のJava表現がサポートされます。
強力な型指定の表現では、特定のオブジェクト型、REF
型またはコレクション型に対応するカスタムJavaクラスを使用し、インタフェースoracle
.sql
.ORAData
を実装する必要があります。Oracle JPublisherユーティリティでは、そのようなカスタムJavaクラスを自動的に生成します。
緩い型指定の表現では、クラスoracle
.sql
.STRUCT
(オブジェクト用)、oracle
.sql
.REF
(参照用)またはoracle
.sql
.ARRAY
(コレクション用)を使用します。
Oracle JPublisherはユーティリティで、次のユーザー定義データベース・エンティティをユーザーのJavaプログラムで表すJavaクラスを生成します。
データベース・オブジェクト・タイプ
データベース参照(REF
)型
データベース・コレクション型(VARRAYまたはネストした表)
PL/SQLパッケージ
JPublisherにより、強力な型指定パラダイムで、データベース・オブジェクト型、参照型およびコレクション型(VARRAYまたはネストした表)をJavaクラスに対してマップする操作を指定し、カスタマイズできます。
関連項目: 『Oracle Database JPublisherユーザーズ・ガイド』 |
Oracleでは、オブジェクト型、参照型およびコレクション型をJavaクラスにマップすることで、強力な型指定によるすべての利点を得ることができます。たとえば、次のような処理を行うことができます。
Oracle JPublisherを使用してカスタムJavaクラスを自動的に生成し、それらのクラスを変更なしで使用します。
JPublisherによって生成されたクラスをサブクラス化し、独自の専用Javaクラスを作成します。
『Oracle Database JPublisherユーザーズ・ガイド』に記述されている要件をクラスが満たす場合は、JPublisherを使用せず、カスタムJavaクラスを手動でコーディングできます。
生成されたクラスが十分な機能を果さない場合は、JPublisherおよびサブクラスを使用することをお薦めします。
オブジェクト型に対してJPublisherを実行する場合、次のものが自動的に作成されます。
ユーザーのOracleオブジェクト型に対応する型定義として動作するカスタム・オブジェクト・クラス
このクラスには、各属性に対する取得メソッドおよび設定メソッドが含まれます。メソッド名は、属性xxx
の場合は、getXxx()
およびsetXxx()
の形式をとります。
また、オプションで、サーバーで実行されるOracleオブジェクト・メソッドを起動するラッパー・メソッドをクラスに作成するように指定できます。
ユーザーのOracleオブジェクト型に対するオブジェクト参照用のカスタム・リファレンス・クラス
このクラスには、ユーザーのカスタム・オブジェクト・クラスのインスタンスを戻すgetValue()
メソッドおよびデータベースのオブジェクト値を更新するsetValue()
メソッドが含まれます。これらのメソッドは、入力としてカスタム・オブジェクト・クラスのインスタンスをとります。
コレクション型に対してJPublisherを実行する場合、次のものが自動的に作成されます。
ユーザーのOracleコレクション型に対応する型定義として動作するカスタム・コレクション・クラス
このクラスには、コレクション全体を取得または更新する、オーバーロード型のgetArray()
メソッドおよびsetArray()
メソッド、コレクションの個々の要素を取得または更新するgetElement()
メソッドおよびsetElement()
メソッド、その他のユーティリティ・メソッドが含まれます。
これらのどのカテゴリでも、JPublisherが生成するカスタムJavaクラスでは、ORAData
インタフェースおよびgetFactory()
メソッドが実装されます。
関連項目: JPublisherの詳細は、『Oracle Database JPublisherユーザーズ・ガイド』を参照してください。 |
JPublisherを使用すると、既存のSQL型にマップするJavaクラスを作成できます。このようにJavaクラスを作成した後、JDBCによりJavaアプリケーションからSQL型にアクセスできるようになります。
この逆を実行することもできます。つまり、既存のJavaクラスにマップするSQL型を作成できます。これにより、Javaオブジェクト用の永続ストレージが用意できます。これらのSQL型を、Java言語のSQL型またはSQLJオブジェクト型といいます。これらは、オブジェクト、属性、列、またはオブジェクト表の行の型として使用できます。オブジェクト参照または外部キーを介して、これらのタイプのオブジェクト(Javaオブジェクト)に対して、ナビゲーショナル・アクセスを行ったり、SQLからこれらのオブジェクトの問合せや操作ができます。
他のユーザー定義型と同様に、SQLJ型もCREATE TYPE
文を使用して作成します。SQLJ型の場合、次の2つの特別な要素がCREATE
TYPE
文に追加されます。
それぞれのSQLJ属性とメソッドに対応するJavaの属性とメソッド、およびSQLJ型そのものに対応するJavaクラスの識別に使用するEXTERNAL
NAME
句。
サーバーに対してSQLJ型をどのように表現するかを指定するためのUSING
句。USING
句は、SQLJ型およびストレージの種類を取得するために使用するインタフェースを指定します。
次に例を示します。
例4-2 SQL型からJavaクラスへのマッピング
-- Mapping SQL Types to Java Classes example, not sample schema CREATE TYPE full_address AS OBJECT (a NUMBER); / CREATE OR REPLACE TYPE person_t AS OBJECT EXTERNAL NAME 'Person' LANGUAGE JAVA USING SQLData ( ss_no NUMBER (9) EXTERNAL NAME 'socialSecurityNo', name varchar(100) EXTERNAL NAME 'name', address full_address EXTERNAL NAME 'addrs', birth_date date EXTERNAL NAME 'birthDate', MEMBER FUNCTION age RETURN NUMBER EXTERNAL NAME 'age () return int', MEMBER FUNCTION addressf RETURN full_address EXTERNAL NAME 'get_address () return long_address', STATIC function createf RETURN person_t EXTERNAL NAME 'create () return Person', STATIC function createf (name VARCHAR2, addrs full_address, bDate DATE) RETURN person_t EXTERNAL NAME 'create (java.lang.String, Long_address, oracle.sql.date) return Person', ORDER member FUNCTION compare (in_person person_t) RETURN NUMBER EXTERNAL NAME 'isSame (Person) return int') /
SQLJ型は、対応するJavaクラスを型の本体として使用します。ただし、SQLでは、通常のオブジェクト型のように、型のメソッドの実装を格納する目的で型の本体は指定しません。
SQLJ型をサーバーに対してどのように表現し、格納するかは、対応するJavaクラスが実装するインタフェースによって決まります。現在、Oracleでは、SQLData
またはORAData
インタフェースを実装するJavaクラスに対してのみ、SQLJ型の表現がサポートされます。サーバーに対して、これらは表現され、SQLを介してアクセス可能になります。java.io.Serializable
インタフェースを実装するJavaクラスの表現は、現在サポートされていません。
SQL表現では、型の属性は、通常のオブジェクト型の属性と同様に、列に格納されます。この表現の場合、オブジェクトはSQL文を使用してアクセスおよび操作しますが、オブジェクト・データの整合性を確保するために、トリガーおよび制約が使用できるため、属性はすべてパブリックです。
SQL表現の場合、USING
句によりSQLData
またはORAData
のいずれかを指定する必要があります。また、これらのインタフェースの1つを対応するJavaクラスにより実装する必要があります。属性用のEXTERNAL
NAME
句は任意で使用してください。
SQLJ型を作成し、Javaへのマッピングを指定するSQL文は、デプロイメント・ディスクリプタと呼ばれるファイルの中に収められます。関連するSQL制約および権限も、このファイルに指定されます。型は、ファイルが実行されるときに作成されます。
次に、JavaタイプおよびJavaクラスのSQLバージョンを作成するプロセスの概要を示します。
Javaタイプを設計します。
Javaクラスを作成します。
SQLJオブジェクト型の文を作成します。
JARファイルを作成します。これは、必要なクラスがすべて入っている1つのファイルです。
loadjava
ユーティリティを使用して、JARファイルに定義されているJavaクラスをインストールします。
文を実行して、SQLJオブジェクト型を作成します。
JavaクラスをSQL型にマップする際、次の点を考慮してください。
SQLJ静的ファンクションは、Javaクラスのユーザー定義コンストラクタにマップできます。このファンクションの戻り値は、ファンクションをローカルに定義したユーザー定義型をとります。
Javaの静的変数は、対応する静的変数(EXTERNAL
NAME
で識別)の値を返すSQLJ静的メソッドにマップします。SQLData
またはORAData
表現の場合、属性用のEXTERNAL
NAME
句は任意で使用します。
SQL表現のSQLJ型のどの属性も、Javaフィールドにマップする必要があります。ただし、必ずしもすべてのJavaフィールドを、対応するSQLJ属性にマップする必要はありません。マッピングではJavaフィールドが省略できます。
クラスは省略できます。SQLJ型をルート・クラスにマップせず、またスーパークラスを介在させずに、SQLJ型をJavaクラス階層内の非ルート・クラスにマップできます。これにより、スーパークラスから継承した属性およびメソッドを含んだまま、スーパークラスを非表示にできます。
ただし、クラス階層内のノード間の構造対応関係およびSQLJ型階層に存在するノード間の構造対応関係はそのまま保つ必要があります。つまり、継承により関連付け、2つのSQL型であるs_A
およびs_B
にマップする2つのJavaクラスj_A
およびj_B
の場合、j_A
からj_B
への継承パスのそれぞれのノードについて、s_A
からs_B
への継承パスに対応するノードが1つ存在する必要があります。
前述の制限に違反しないかぎり、Javaクラスを複数のSQLJ型にマップできます。つまり、同一のJavaクラスにマップされた2つのSQLJ型は、共通するスーパータイプの祖先クラスを持てないということです。
すべてのJavaクラスをSQLJ型にマップしなければ、SQLJオブジェクト型の属性を、マップされていないJavaクラスのオブジェクトに設定することが可能です。特に、継承階層において属性がマップされたクラスの上位または下位で発生するクラスの場合、これに該当します。オブジェクトのクラスが、属性の型/クラスのスーパークラスの場合は、エラーとなります。オブジェクトのクラスが、属性の型/クラスのサブクラスであれば、SQLマッピングが存在するオブジェクトの階層の最も狭い意味での型に、オブジェクトがマップされます。
関連項目: オブジェクト・マッピングのJPublisherでの使用例は、『Oracle Database JPublisherユーザーズ・ガイド』を参照してください。 |
ALTER
TYPE
文を使用すると、属性またはメソッドの追加、削除などを行うことにより、型を進化させられます。
SQLJ型を進化させる場合は、クラスと型間のマッピングを確認するために、特別な検証を行います。クラスと進化させた型が一致した場合は、有効な型であると表示されます。一致しない場合は、検証待ちと表示されます。
検証待ちという表示は、無効という表示と同じではありません。検証待ちの型は、たとえばALTER
TYPE
およびGRANT
文を使用して、操作を継続できます。
SQL表現を持つ型が、検証待ちと表示されても、メソッド起動を必要としないDMLまたはSELECT文を使用して、この型の表にアクセスできます。
ただし、シリアル化可能な表現を持ち、検証待ちと表示された型の表に対しては、DMLやSELECT
文は実行できません。シリアル化可能な型のデータに対しては、メソッド起動を介したナビゲーショナル・アクセスのみ許可されます。検証待ちの型の場合は、このタイプのアクセスはできません。ただし、検証に合格するまで型をさらに進化させることは可能です。
「型進化」を参照してください。
SQL表現を持つSQLJ型の場合、通常のオブジェクト型の場合と同じ制約を定義できます。
制約を定義する対象は、型ではなく表で、列レベルで定義します。SQL表現を持つSQLJ型についてサポートされている制約は、次のとおりです。
一意制約
主キー
CHECK制約
属性についてのNOT NULL
制約
参照制約
SQL表現を持つSQLJ型の場合は、列の代入性についてのIS
OF
type
制約もサポートされます。「代入性の制約」を参照してください。
SQLJ型の列が入っている表に、行を挿入するには、この型のコンストラクタ・ファンクションをコールし、この型のJavaオブジェクトを作成する必要があります。
システムが生成する暗黙的なコンストラクタを使用するか、またはJavaクラスのユーザー定義コンストラクタにマップする静的ファンクションを定義してください。
UPDATE
文を使用して、1つ以上の属性の値を変更するか、または属性を更新しSELF
を戻すメソッド(つまり、変更を行ったうえでオブジェクトそのものを戻すメソッド)を起動すると、SQLJオブジェクトを更新できます。
raise()
が、指定された分のみsalary
フィールド/属性を増加し、SELF
を戻すメンバー・ファンクションである場合について考えてみます。次の文により、オブジェクト表employee_objtab
に含まれているすべての従業員に1000
分の増額が与えられます。
UPDATE employee_objtab SET c=c.raise(1000);
SQLJ型の列は、通常のオブジェクト型と同じ構文を使用して、NULL
に設定するか、または別の列に設定できます。たとえば、次の文により、列c
に列d
が割り当てられます。
UPDATE employee_reltab SET c=d;
Javaでユーザー定義コンストラクタを実装する場合、実装ルーチンとして提供される文字列は、静的ファンクションに対応する必要があります。ファンクションの戻り型には、SQL型にマップされるJava型を指定します。
例4-3に、Javaで実装されたユーザー定義コンストラクタを伴う型宣言の例を示します。
例4-3 Javaにおけるユーザー定義コンストラクタの定義
-- Defining a User-Defined Constructor in Java example, not sample schema CREATE TYPE person1_typ AS OBJECT EXTERNAL NAME 'pkg1.J_Person' LANGUAGE JAVA USING SQLData( name VARCHAR2(30), age NUMBER, CONSTRUCTOR FUNCTION person1_typ(SELF IN OUT NOCOPY person1_typ, name VARCHAR2, age NUMBER) RETURN SELF AS RESULT AS LANGUAGE JAVA NAME 'pkg1.J_Person.J_Person(java.lang.String, int) return J_Person') /
DROP TYPE person1_typ FORCE; DROP TYPE person_t FORCE; DROP TYPE full_address FORCE; DROP TYPE person FORCE; DROP LIBRARY person_lib; SPOOL OFF COMMIT;
Oracle JDeveloperは、Oracle Application ServerおよびOracle Databaseと緊密に統合された複数層のJavaアプリケーションの作成を目的としたフル機能のクロスプラットフォームの統合開発環境です。
Oracle JDeveloperにより、Javaクライアント・アプリケーション、動的HTMLアプリケーション、Webおよびアプリケーション・サーバー・コンポーネント、JavaBeanコンポーネントおよび業界標準モデルに基づいたデータベース・ストアド・プロシージャの開発、デバッグおよびデプロイができます。
JDeveloperは、ADFおよびTopLinkの統合開発環境でもあります。
XMLType
ビューは、既存のリレーショナル・データおよびオブジェクト・リレーショナル・データをXML形式でラップします。これらのビューは、オブジェクト・ビューと類似しています。XMLType
ビューの各行は、XMLType
インスタンスに対応します。ビュー内の各行を一意に識別するためのオブジェクト識別子は、XMLType
値に対してextract()
などの式を使用して作成できます。
関連項目: XMLとOracleオブジェクトの使用方法の詳細および使用例は、『Oracle XML DB開発者ガイド』を参照してください。 |
この項では、Oracleオブジェクトのサポートを提供する複数のOracleユーティリティについて説明します。
この項の内容は次のとおりです。
エクスポート・ユーティリティおよびインポート・ユーティリティは、Oracleデータベースへ、またはOracleデータベースから、データを移動します。また、データのバックアップまたはアーカイブ、およびOracle RDBMSの異なるリリースへの移行に役立ちます。
エクスポートおよびインポートは、オブジェクト型をサポートします。エクスポートは、オブジェクト型定義および関連するすべてのデータをダンプ・ファイルに書き込みます。インポートは、ダンプ・ファイルからこれらの項目を再作成します。
オブジェクト表をインポートする場合、デフォルトでOID
が維持されます。
関連項目: インポートおよびエクスポート・ユーティリティの使用方法は、『Oracle Databaseユーティリティ』を参照してください。 |
SQL*Loaderユーティリティは、外部ファイルのデータを、Oracle Database内の表に移動します。これらのファイルには、INTEGER
、CHAR
、DATE
など基本的なスカラー・データ型や、行オブジェクトや列オブジェクト(オブジェクト、コレクションまたはREF
属性を持つオブジェクトを含む)、コレクション、LOBなど複雑なユーザー定義データ型で構成されるデータが含まれる可能性があります。現在、SQL*Loaderはシングルレベル・コレクションのみをサポートしています。マルチレベル・コレクション(他のコレクションが要素になっているか、他のコレクションが入っているコレクション)のロードに、SQL*Loaderは使用できません。SQL*Loaderは、SQL*Loader DDL文が入っている制御ファイルを使用して、データ・ファイルのフォーマット、内容および位置を記述します。
SQL*Loaderがデータをロードする方法は、2通りあります。
従来型パス・ロード: SQL
INSERT
文およびバインド配列バッファを使用して、データをデータベース表にロードします。
ダイレクト・パス・ロード: ダイレクト・パス・ロードAPIを使用して、SQL*Loaderクライアントのかわりに、データ・ブロックを直接データベースに書き込みます。
ダイレクト・パス・ロードはSQLインタフェースを使用しないので、関連するSQL文の処理時にオーバーヘッドが発生しません。したがって、ダイレクト・パス・ロードからは従来型パス・ロードよりも優れたパフォーマンスが通常得られます。
どちらの方法も、サポート対象となっているオブジェクトおよびコレクション・データ型のデータのロードに使用できます。
関連項目: SQL*Loaderの使用方法は、『Oracle Databaseユーティリティ』を参照してください。 |