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

前
 
次
 

4 Oracleプログラム環境のオブジェクト・サポート

Oracleデータベースでは、SQL DDLコマンドを使用してオブジェクト型を作成し、SQL DMLコマンドを使用してオブジェクトを操作できます。そこから、多くのOracleアプリケーション・プログラミング環境およびOracleオブジェクトの組込みサポートを含むツールを使用できます。

内容は次のとおりです。

SQLおよびオブジェクト型

Oracle SQLデータ定義言語(DDL)では、オブジェクト型に対して次のようなサポートが提供されます。

  • オブジェクト型、ネストした表および配列の定義

  • 権限の指定

  • オブジェクト型の表の列の指定

  • オブジェクト表の作成

Oracle SQL DMLでは、オブジェクト型に対して次のようなサポートが提供されます。

  • オブジェクトおよびコレクションの問合せおよび更新

  • REFの操作


    関連項目:

    Oracle SQL構文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

SQL Developer

SQL Developerは、データベース開発者およびDBAのビジュアル開発環境を提供して、Oracleオブジェクトを含むデータベース・スキーマ・オブジェクトの作成と操作、レポートの実行、豊富なグラフィカル・ユーザー・インタフェースを使用したパフォーマンスの監視および他の多くのデータベース関連タスクの実行を行います。


関連項目:

『Oracle SQL Developerユーザーズ・ガイド』

PL/SQL

オブジェクト型およびサブタイプは、組込み型が使用可能なほとんどの場所において、PL/SQLプロシージャおよびファンクションで使用できます。

PL/SQLファンクションおよびプロシージャのパラメータおよび変数には、オブジェクト型を使用できます。

PL/SQLには、オブジェクト型と対応付けられたメソッドを実装できます。これらのメソッド(ファンクションおよびプロシージャ)は、ユーザーのスキーマの一部としてサーバーに格納します。


関連項目:

PL/SQLの詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。

Oracle Call Interface(OCI)

OCIとは、アプリケーションがOracleデータベース内でデータおよびスキーマを操作するために使用できる、一連のCライブラリ関数のことです。OCIでは、次の項で説明するように、データベース・アクセスに従来の3GLおよびオブジェクト指向技法の両方がサポートされています。

OCIの重要なコンポーネントは、オブジェクト・キャッシュと呼ばれる作業領域を管理する一連のコールです。オブジェクト・キャッシュは、クライアント側のメモリー・ブロックで、このメモリー・ブロックにより、サーバーに対しさらにラウンドトリップを行わなくても、プログラムはオブジェクト全部を格納し、オブジェクト間をナビゲートできます。

オブジェクト・キャッシュは、それを使用するアプリケーションによって完全に制御および管理されます。Oracleサーバーは、オブジェクト・キャッシュにアクセスできません。オブジェクト・キャッシュを使用するアプリケーション・プログラムは、サーバーと一体となってデータ一貫性を保持し、同時発生する競合アクセスから作業領域を保護する必要があります。

OCIは、次の機能を備えています。

  • SQLを使用して、サーバー上のオブジェクトにアクセスします。

  • ポインタまたはREFを利用することによって、オブジェクト・キャッシュ内のオブジェクトにアクセスし、操作および管理します。

  • Oracleの日付、文字列および数値をCのデータ型に変換します。

  • オブジェクト・キャッシュのメモリー・サイズを管理します。

OCIは、オブジェクトを個々にロックできるようにして、同時実行性を改善します。これは、複雑なオブジェクト検索をサポートして、パフォーマンスを改善します。

OCI開発者は、Object Type Translatorを使用して、Oracleオブジェクト型に対応するCのデータ型を生成できます。


関連項目:

OCIでオブジェクトを使用する場合の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。

OCIプログラムにおける連想アクセス

3GLプログラムは、SQL文およびPL/SQLプロシージャを実行し、リレーショナル・データベースに格納されたデータを操作します。データは、通常サーバー上で処理されるので、クライアント側にデータを転送するコストが発生しません。OCIでは、オブジェクト・データを操作するSQL文を実行するAPIを提供することによって、この結合アクセスをサポートしています。特に、OCIでは、次のことができます。

  • オブジェクト・データおよびオブジェクト型スキーマ情報を操作するSQL文を実行します。

  • オブジェクト、オブジェクト参照(REF)およびコレクションを、SQL文の入力変数として渡します。

  • オブジェクト、REFおよびコレクションを、SQL文フェッチの出力として戻します。

  • オブジェクト、REFおよびコレクションを戻すSQL文のプロパティを記述します。

  • オブジェクトのパラメータまたは結果を持つPL/SQLプロシージャまたはファンクションを記述し実行します。

  • 拡張されたコミットおよびロールバック関数を介して、オブジェクト機能とリレーショナル機能を並用できます。

「Pro*C/C++での連想アクセス」を参照してください。

OCIプログラムのナビゲーショナル・アクセス

オブジェクト指向のプログラミング・パラダイムでは、アプリケーションは、実社会のエンティティを、オブジェクト・グラフを形成する相互関連オブジェクトの集合としてモデル化します。オブジェクト間の関連は、参照として実装されます。アプリケーションは、いくつかのイニシャル・オブジェクトの集合から始めて、これらのイニシャル・オブジェクトの参照を使用して残りのオブジェクトにアクセスし、各オブジェクトで計算処理を実行することで、オブジェクトを処理します。OCIでは、ナビゲーショナル・アクセスとして知られる、オブジェクト参照を使用してオブジェクト間のアクセスを行うためのAPIが提供されています。特に、OCIでは、次のことができます。

  • クライアント・マシン上のメモリーにオブジェクトをキャッシュします。

  • オブジェクト参照を解除し、オブジェクト・キャッシュ内の対応するオブジェクトを確保します。確保されたオブジェクトは、ホスト言語表現に透過的にマップされます。

  • 確保されたオブジェクトが不要になった場合、キャッシュに通知します。

  • 1回のコールで、関連するオブジェクトをまとめてデータベースからクライアント・キャッシュにフェッチします。

  • オブジェクトをロックします。

  • キャッシュ上でオブジェクトを作成、更新および削除します。

  • クライアント・キャッシュ上でオブジェクトに対して行われた変更を、データベースに反映します。

「Pro*C/C++でのナビゲーショナル・アクセス」を参照してください。

オブジェクト・キャッシュ

高パフォーマンスのオブジェクト・ナビゲーショナル・アクセスをサポートするために、OCIランタイムでは、メモリーにオブジェクトをキャッシュするためのオブジェクト・キャッシュを提供しています。オブジェクト・キャッシュは、オブジェクト・キャッシュ内のデータベース・オブジェクトへの参照(REF)をサポートし、データベース・オブジェクトは、それらの参照を介して識別(確保)されます。オブジェクト・キャッシュは、データベース・オブジェクトに対して透過的で効率的なメモリー管理を提供するため、アプリケーションは、データベース・オブジェクトがキャッシュにロードされたときに、メモリーを割り当てたり解放する必要はありません。

さらに、データベース・オブジェクトは、キャッシュにロードされた際、ホスト言語に透過的にマップされます。たとえば、C言語では、データベース・オブジェクトは対応するC構造体へマップされます。オブジェクト・キャッシュは、キャッシュ上のオブジェクトと対応するデータベース・オブジェクトとの間の整合性を保ちます。トランザクションのコミット時にキャッシュ上のオブジェクト・コピーに対して行われた変更は、データベースに自動的に反映されます。

オブジェクト・キャッシュでは、REFをオブジェクトにマップするために、高速参照表がメンテナンスされます。アプリケーションがREFを参照解除するときに、対応するオブジェクトがまだキャッシュされていない場合は、オブジェクト・キャッシュからサーバーに自動的に要求が送信され、データベースからオブジェクトがフェッチされてオブジェクト・キャッシュにロードされます。同一のREFに対するその後の参照解除は、ローカル・キャッシュ・アクセスになり、ネットワークのラウンドトリップが発生しないため、より高速になります。キャッシュ内のオブジェクトにアクセス中であることをオブジェクト・キャッシュに通知するために、アプリケーションはオブジェクトを確保し、オブジェクトの処理が終わった時点で確保解除します。オブジェクト・キャッシュは、キャッシュの各オブジェクトの確保カウントをメンテナンスします。確保カウントは、確保コール(ピン・コール)で増加し、確保解除コール(アンピン・コール)で減少します。確保カウントが0になると、アプリケーションがそのオブジェクトを必要としなくなったことを意味します。オブジェクト・キャッシュでは最低使用頻度(LRU)アルゴリズムを使用して、キャッシュのサイズが管理されます。キャッシュが最大サイズに達すると、LRUアルゴリズムによって確保カウントが0の候補オブジェクトが解放されます。

オブジェクトを操作するOCIプログラムの作成

オブジェクトを操作するOCIプログラムを作成するときは、次の一般的な手順を実行する必要があります。

  1. アプリケーション・オブジェクトに対応するオブジェクト型を定義します。

  2. SQL DDL文を実行して、必要なオブジェクト型をデータベースに定義します。

  3. オブジェクト型をホスト言語形式で表します。

    たとえば、Cプログラムでオブジェクト型のインスタンスを操作するには、それらの型をC言語形式で記述する必要があります。そのためには、オブジェクト型をC構造体で表します。OTTというツールを使用すると、オブジェクト型に対応するCの構造体を生成できます。OTTは、等価なC構造体をヘッダー・ファイル(*.h)に作成します。これらの*.hファイルを、アプリケーションを実装するC関数を含む*.cファイルにインポートします。

  4. アプリケーションの*.cファイルをOCIライブラリとともにコンパイルおよびリンクすることによって、アプリケーションの実行可能ファイルを作成します。


    関連項目:

    OCIプログラムをオブジェクトとともに効果的に使用するためのヒントおよび技法は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。

Cでのユーザー定義コンストラクタの定義

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は、SELFTDOと一致する必要があるため暗黙的です。戻り値はNULLになり得ないため、戻りインジケータも暗黙的です。

Pro*C/C++

Oracle Pro*C/C++プリコンパイラを使用すると、プログラマはユーザー定義データ型をCプログラムおよびC++プログラムで使用できます。

Pro*C開発者は、Object Type Translatorを使用して、Oracleオブジェクト型およびコレクションを、Pro*Cアプリケーションで使用できるCのデータ型にマップできます。

Pro*Cでは、コンパイル時のオブジェクト型とコレクションのタイプ・チェック、およびデータベースのデータ型からCのデータ型への自動型変換が行われます。

Pro*Cには、オブジェクトを作成および破棄するためのEXEC SQL構文が含まれており、次の2つを使用してサーバーにあるオブジェクトにアクセスできます。

  • Pro*Cプログラム内に埋め込まれたSQL文およびPL/SQLファンクションまたはプロシージャ。

  • オブジェクト・キャッシュへのインタフェース(「Oracle Call Interface (OCI)」を参照)。この場合、オブジェクトにはポインタを介してアクセスし、サーバー上で変更および更新できます。


    関連項目:

    Pro*Cプリコンパイラの詳細は、『Pro*C/C++プログラマーズ・ガイド』を参照してください。

Pro*C/C++での連想アクセス

連想アクセスのバックグラウンド情報については、「OCIプログラムにおける連想アクセス」を参照してください。

Pro*C/C++では、オブジェクトの連想アクセスに対して次の機能が提供されます。

  • オブジェクト・キャッシュに割り当てられたオブジェクトの一時コピーのサポート

  • 埋込みSQLのINSERTUPDATEDELETE文、またはSELECT文のWHERE句の入力ホスト変数として参照されるオブジェクトの一時コピーのサポート

  • 埋込みSQLのSELECTおよびFETCH文で出力ホスト変数として参照されるオブジェクトの一時コピーのサポート

  • オブジェクトの型およびスキーマ情報を取得するためにDESCRIBE文を介してオブジェクト型を参照する、ANSI動的SQL文のサポート

Pro*C/C++でのナビゲーショナル・アクセス

ナビゲーショナル・アクセスのバックグラウンド情報については、「OCIプログラムのナビゲーショナル・アクセス」を参照してください。

Pro*C/C++では、オブジェクトに対してさらにオブジェクト指向のインタフェースをサポートするために、次の機能が提供されます。

  • 埋込みSQLのOBJECT DEREF文を使用した、オブジェクト・キャッシュでのオブジェクトの参照解除、確保およびロック(オプション)のサポート

  • オブジェクトが更新または削除された場合、または不要になった場合に、Pro*C/C++ユーザーが埋込みSQLのOBJECT UPDATEOBJECT DELETEおよびOBJECT RELEASE文を使用してオブジェクト・キャッシュに通知できる機能

  • 埋込みSQLのOBJECT CREATE文を使用して、オブジェクト・キャッシュに新しい参照可能オブジェクトを作成するための機能

  • オブジェクト・キャッシュでの変更を、埋込みSQLのOBJECT FLUSH文を使用してサーバーにフラッシュするための機能

Oracleのオブジェクト型とC言語のデータ型の間の変換

OTTによって生成されるオブジェクトのC表現では、スカラー属性に対してOCIStringOCINumberなどの、内部詳細が非表示にされたOCI型が使用されます。コレクション型およびオブジェクト参照も、OCITableOCIArrayおよび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型に変換されます。

Oracle Type Translator(OTT)

Oracle Type Translator (OTT)は、オブジェクト型に対応するCの構造体を自動的に生成するプログラムです。OTTは、Pro*CプリコンパイラおよびOCIサーバー・アクセス・パッケージをさらに使用しやすくします。


関連項目:

OTTの詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』および『Pro*C/C++プログラマーズ・ガイド』を参照してください。

Oracle C++ Call Interface(OCCI)

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つの機能セットに分類できます。

  • 結合リレーショナル・アクセス

  • 結合オブジェクト・アクセス

  • ナビゲーショナル・アクセス

OCCI結合リレーショナルおよびオブジェクト・インタフェース

結合リレーショナルAPIおよびオブジェクト・クラスにより、SQLにデータベースへアクセスする機能が提供されます。これらのインタフェースを介してSQLをサーバー上で実行し、オブジェクトまたはリレーショナル・データを作成および操作し、フェッチします。アプリケーションは、次のようなサーバー上のどのデータ型にもアクセスできます。

  • ラージ・オブジェクト

  • オブジェクト/構造型

  • 配列

  • 参照

OCCIナビゲーショナル・インタフェース

ナビゲーショナル・インタフェースとは、SQLを使用せずに、C++オブジェクトの形式で表現されたオブジェクト・リレーショナル・データにシームレスにアクセスし、修正できるようにするC++インタフェースです。C++オブジェクトは透過的にアクセスし、必要に応じてデータベースに格納します。

OCCIナビゲーショナル・インタフェースを使用すると、オブジェクトを取り出し、参照によりオブジェクト間をナビゲートできます。サーバー・オブジェクトはアプリケーション・キャッシュ内部でC++クラス・インスタンスとして具体化されます。

アプリケーションはOCCIオブジェクト・ナビゲーショナル・コールを使用して、サーバー・オブジェクトに対し次の機能を実行できます。

  • オブジェクトの作成、アクセス、ロック、削除およびフラッシュ

  • オブジェクトの参照の取得およびオブジェクトのナビゲート


    関連項目:

    Oracle C++ APIを使用したアプリケーションの作成方法の詳細は、『Oracle C++ Call Interfaceプログラマーズ・ガイド』を参照してください。

Oracle Objects for OLE(OO4O)

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におけるすべての型の値インスタンスの抑制階層を示します。

図4-1 サポートされているOracleデータ型

図5-1の説明
「図5-1 サポートされているOracleデータ型」の説明

これらの型のインスタンスは、データベースからフェッチできるか、またはSQL文および(ストアド・プロシージャおよびファンクションを含む)PL/SQLブロックに対する入力変数または出力変数として渡すことができます。すべてのインスタンスは、属性の動的アクセスおよび操作用のメソッドを提供する、COMオートメーション・インタフェースにマップされます。このインタフェースは、次のものから取得できます。

  • dynasetのOraFieldオブジェクトの値プロパティ

  • SQL文またはPL/SQLブロックで入力または出力パラメータとして使用されるOraParameterオブジェクトの値プロパティ

  • オブジェクトの属性(REF)

  • コレクションの要素(VARRAYまたはネストした表)

Visual Basicでのオブジェクトの表現形式(OraObject)

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

Visual BasicでのREFの表現形式(OraRef)

OraRefインタフェースは、Oracleオブジェクト参照(REF)を表すと同時に、クライアント・アプリケーションの参照可能なオブジェクトを表します。このオブジェクト属性には、OraObjectインタフェースによって表されるオブジェクトの属性と同じ方法でアクセスできます。OraRefは、COMでの抑制メカニズムを介して、OraObjectインタフェースから導出されます。REFオブジェクトは、dynasetなど導出元となるコンテキストからは独立して、更新および削除できます。OraRefインタフェースでは、OCIの複合オブジェクト検索機能(COR)を使用して、オブジェクト間の関連をたどる機能のカプセル化も行います。


関連項目:

OCIプログラムをオブジェクトとともに効果的に使用するためのヒントおよび技法は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。

Visual BasicでのVARRAYおよびネストした表の表現形式(OraCollection)

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

OracleオブジェクトにアクセスするJavaツール

Javaは、開発者に簡単で効率的でポータブルかつ安全なアプリケーション開発プラットフォームを提供する強力な最新のオブジェクト指向言語として登場しました。Oracleでは、Oracleオブジェクト機能をJavaと統合する様々な方法を提供しています。これらのインタフェースにより、JavaからSQLデータにアクセスできるようになるのみでなく、Javaオブジェクトの永続データベース記憶域が得られます。

Oracleオブジェクト・データへのJDBCアクセス

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開発者ガイドおよびリファレンス』を参照してください

Oracleオブジェクト・データへのSQLJアクセス

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(コレクション用)を使用します。

JPublisher

Oracle JPublisherはユーティリティで、次のユーザー定義データベース・エンティティをユーザーのJavaプログラムで表すJavaクラスを生成します。

  • データベース・オブジェクト・タイプ

  • データベース参照(REF)型

  • データベース・コレクション型(VARRAYまたはネストした表)

  • PL/SQLパッケージ

JPublisherにより、強力な型指定パラダイムで、データベース・オブジェクト型、参照型およびコレクション型(VARRAYまたはネストした表)をJavaクラスに対してマップする操作を指定し、カスタマイズできます。


関連項目:

『Oracle Database JPublisherユーザーズ・ガイド』

JPublisherを使用したJDBCおよびSQLJプログラム用Javaクラスの作成

Oracleでは、オブジェクト型、参照型およびコレクション型をJavaクラスにマップすることで、強力な型指定によるすべての利点を得ることができます。たとえば、次のような処理を行うことができます。

  • Oracle JPublisherを使用してカスタムJavaクラスを自動的に生成し、それらのクラスを変更なしで使用します。

  • JPublisherによって生成されたクラスをサブクラス化し、独自の専用Javaクラスを作成します。

  • 『Oracle Database JPublisherユーザーズ・ガイド』に記述されている要件をクラスが満たす場合は、JPublisherを使用せず、カスタムJavaクラスを手動でコーディングできます。

生成されたクラスが十分な機能を果さない場合は、JPublisherおよびサブクラスを使用することをお薦めします。

ユーザー定義のオブジェクト型に対してJPublisherで生成される内容

オブジェクト型に対してJPublisherを実行する場合、次のものが自動的に作成されます。

  • ユーザーのOracleオブジェクト型に対応する型定義として動作するカスタム・オブジェクト・クラス

    このクラスには、各属性に対する取得メソッドおよび設定メソッドが含まれます。メソッド名は、属性xxxの場合は、getXxx()およびsetXxx()の形式をとります。

    また、オプションで、サーバーで実行されるOracleオブジェクト・メソッドを起動するラッパー・メソッドをクラスに作成するように指定できます。

  • ユーザーのOracleオブジェクト型に対するオブジェクト参照用のカスタム・リファレンス・クラス

    このクラスには、ユーザーのカスタム・オブジェクト・クラスのインスタンスを戻すgetValue()メソッドおよびデータベースのオブジェクト値を更新するsetValue()メソッドが含まれます。これらのメソッドは、入力としてカスタム・オブジェクト・クラスのインスタンスをとります。

コレクション型に対してJPublisherを実行する場合、次のものが自動的に作成されます。

  • ユーザーのOracleコレクション型に対応する型定義として動作するカスタム・コレクション・クラス

    このクラスには、コレクション全体を取得または更新する、オーバーロード型のgetArray()メソッドおよびsetArray()メソッド、コレクションの個々の要素を取得または更新するgetElement()メソッドおよびsetElement()メソッド、その他のユーティリティ・メソッドが含まれます。

これらのどのカテゴリでも、JPublisherが生成するカスタムJavaクラスでは、ORADataインタフェースおよびgetFactory()メソッドが実装されます。


関連項目:

JPublisherの詳細は、『Oracle Database JPublisherユーザーズ・ガイド』を参照してください。

Javaオブジェクトの記憶域

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型の表現

SQLJ型をサーバーに対してどのように表現し、格納するかは、対応するJavaクラスが実装するインタフェースによって決まります。現在、Oracleでは、SQLDataまたはORADataインタフェースを実装するJavaクラスに対してのみ、SQLJ型の表現がサポートされます。サーバーに対して、これらは表現され、SQLを介してアクセス可能になります。java.io.Serializableインタフェースを実装するJavaクラスの表現は、現在サポートされていません。

SQL表現では、型の属性は、通常のオブジェクト型の属性と同様に、列に格納されます。この表現の場合、オブジェクトはSQL文を使用してアクセスおよび操作しますが、オブジェクト・データの整合性を確保するために、トリガーおよび制約が使用できるため、属性はすべてパブリックです。

SQL表現の場合、USING句によりSQLDataまたはORADataのいずれかを指定する必要があります。また、これらのインタフェースの1つを対応するJavaクラスにより実装する必要があります。属性用のEXTERNAL NAME句は任意で使用してください。

SQLJオブジェクト型の作成

SQLJ型を作成し、Javaへのマッピングを指定するSQL文は、デプロイメント・ディスクリプタと呼ばれるファイルの中に収められます。関連するSQL制約および権限も、このファイルに指定されます。型は、ファイルが実行されるときに作成されます。

次に、JavaタイプおよびJavaクラスのSQLバージョンを作成するプロセスの概要を示します。

  1. Javaタイプを設計します。

  2. Javaクラスを作成します。

  3. SQLJオブジェクト型の文を作成します。

  4. JARファイルを作成します。これは、必要なクラスがすべて入っている1つのファイルです。

  5. loadjavaユーティリティを使用して、JARファイルに定義されているJavaクラスをインストールします。

  6. 文を実行して、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ユーザーズ・ガイド』を参照してください。

SQLJ型の進化

ALTER TYPE文を使用すると、属性またはメソッドの追加、削除などを行うことにより、型を進化させられます。

SQLJ型を進化させる場合は、クラスと型間のマッピングを確認するために、特別な検証を行います。クラスと進化させた型が一致した場合は、有効な型であると表示されます。一致しない場合は、検証待ちと表示されます。

検証待ちという表示は、無効という表示と同じではありません。検証待ちの型は、たとえばALTER TYPEおよびGRANT文を使用して、操作を継続できます。

SQL表現を持つ型が、検証待ちと表示されても、メソッド起動を必要としないDMLまたはSELECT文を使用して、この型の表にアクセスできます。

ただし、シリアル化可能な表現を持ち、検証待ちと表示された型の表に対しては、DMLやSELECT文は実行できません。シリアル化可能な型のデータに対しては、メソッド起動を介したナビゲーショナル・アクセスのみ許可されます。検証待ちの型の場合は、このタイプのアクセスはできません。ただし、検証に合格するまで型をさらに進化させることは可能です。

「型進化」を参照してください。

制約

SQL表現を持つSQLJ型の場合、通常のオブジェクト型の場合と同じ制約を定義できます。

制約を定義する対象は、型ではなく表で、列レベルで定義します。SQL表現を持つSQLJ型についてサポートされている制約は、次のとおりです。

  • 一意制約

  • 主キー

  • CHECK制約

  • 属性についてのNOT NULL制約

  • 参照制約

SQL表現を持つSQLJ型の場合は、列の代入性についてのIS OF type制約もサポートされます。「代入性の制約」を参照してください。

SQLJオブジェクトの問合せ

SQLJ型に対しては、通常のSQLオブジェクト型と同様に問合せを行うことができます。SELECT文でコールされたメソッドで、属性値を変更することは避けてください。

Javaオブジェクトの挿入

SQLJ型の列が入っている表に、行を挿入するには、この型のコンストラクタ・ファンクションをコールし、この型のJavaオブジェクトを作成する必要があります。

システムが生成する暗黙的なコンストラクタを使用するか、またはJavaクラスのユーザー定義コンストラクタにマップする静的ファンクションを定義してください。

SQLJオブジェクトの更新

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でのユーザー定義コンストラクタの定義

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;

JDeveloper

Oracle JDeveloperは、Oracle Application ServerおよびOracle Databaseと緊密に統合された複数層のJavaアプリケーションの作成を目的としたフル機能のクロスプラットフォームの統合開発環境です。

Oracle JDeveloperにより、Javaクライアント・アプリケーション、動的HTMLアプリケーション、Webおよびアプリケーション・サーバー・コンポーネント、JavaBeanコンポーネントおよび業界標準モデルに基づいたデータベース・ストアド・プロシージャの開発、デバッグおよびデプロイができます。

JDeveloperは、ADFおよびTopLinkの統合開発環境でもあります。

アプリケーション開発フレームワーク(ADF)

ADFは、スケーラブルなエンタープライズJava EEアプリケーションを作成するフレームワークです。開発者は、ADFを使用して、アプリケーション・データが他のスキーマ・オブジェクトとともにOracleオブジェクト表に保存されるアプリケーションを作成できます。

TopLink

TopLinkは、Javaオブジェクトをデータベースを含む様々な永続性テクノロジにマップするフレームワークで、Oracleオブジェクトを利用するアプリケーションを作成する機能を提供します。

XML

XMLTypeビューは、既存のリレーショナル・データおよびオブジェクト・リレーショナル・データをXML形式でラップします。これらのビューは、オブジェクト・ビューと類似しています。XMLTypeビューの各行は、XMLTypeインスタンスに対応します。ビュー内の各行を一意に識別するためのオブジェクト識別子は、XMLType値に対してextract()などの式を使用して作成できます。


関連項目:

XMLとOracleオブジェクトの使用方法の詳細および使用例は、『Oracle XML DB開発者ガイド』を参照してください。

オブジェクトをサポートするユーティリティ

この項では、Oracleオブジェクトのサポートを提供する複数のOracleユーティリティについて説明します。

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

オブジェクト型のインポート/エクスポート

エクスポート・ユーティリティおよびインポート・ユーティリティは、Oracleデータベースへ、またはOracleデータベースから、データを移動します。また、データのバックアップまたはアーカイブ、およびOracle RDBMSの異なるリリースへの移行に役立ちます。

エクスポートおよびインポートは、オブジェクト型をサポートします。エクスポートは、オブジェクト型定義および関連するすべてのデータをダンプ・ファイルに書き込みます。インポートは、ダンプ・ファイルからこれらの項目を再作成します。

オブジェクト表をインポートする場合、デフォルトでOIDが維持されます。


関連項目:

インポートおよびエクスポート・ユーティリティの使用方法は、『Oracle Databaseユーティリティ』を参照してください。

タイプ

導出型の定義文はエクスポートされます。インポート時、スーパータイプ定義のインポートが完了する前に、サブタイプを作成できます。この場合、サブタイプを作成するとコンパイル・エラーが発生しますが、無視してください。型のスーパータイプが作成された後、型の再検証が行われます。

オブジェクト・ビューの階層

ビュー階層に属するすべてのビューのビュー定義はエクスポートされます。

SQL*Loader

SQL*Loaderユーティリティは、外部ファイルのデータを、Oracle Database内の表に移動します。これらのファイルには、INTEGERCHARDATEなど基本的なスカラー・データ型や、行オブジェクトや列オブジェクト(オブジェクト、コレクションまたは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ユーティリティ』を参照してください。