15 Oracleオブジェクト参照の使用
15.1 オブジェクト参照用Oracle拡張機能
Oracleでは、データベース・オブジェクトへの参照を使用できます。Oracle JDBCでは、次のオブジェクト参照がサポートされます。
-
SELECT
句の列 -
INまたはOUTバインド変数
-
Oracleオブジェクトの属性
-
コレクション型オブジェクトの要素
SQLでは、オブジェクト参照(REF
)は厳密に型指定されています。たとえば、EMPLOYEE
オブジェクトへの参照は、REF
のみではなく、EMPLOYEE REF
として定義されます。
オブジェクト参照を選択する場合は、オブジェクト本体でなく、オブジェクトへのポインタのみを取得することに注意してください。移植性を重視して、参照をjava.sql.Ref
インスタンスとしてインスタンス化するか、事前に作成したカスタムJavaクラスのインスタンスとしてインスタンス化して強い型指定の利点を取るか、両方の選択肢があります。オブジェクト参照のために使用されるカスタムJavaクラスは、カスタム参照クラスとして参照されるため、oracle.jdbc.OracleData
インタフェースを実装する必要があります。
結果セットまたはコール可能文オブジェクトを介してREF
インスタンスを取得し、プリペアド文またはコール可能文オブジェクトを介して更新されたREF
にインスタンスをデータベースに戻すことができます。REF
クラスには、基礎となるオブジェクト属性値を取得および設定し、基礎となるオブジェクトのSQLベース型名を取得する機能があります。
カスタム参照クラスには、これと同じ機能が含まれている他に、強い型指定が適用されるという利点があります。この強い型指定により、実行時まで検出できないコーディング・エラーを、コンパイル時に発見できます。
ノート:
-
カスタム・オブジェクト・クラスに対して
oracle.jdbc.OracleData
インタフェースを使用する場合は、対応するカスタム参照クラスにもOracleData
を使用します。ただし、カスタム・オブジェクト・クラスに対して標準java.sql.SQLData
インタフェースを使用する場合、参照に使用できるのは、弱いJava型のみです。SQLData
インタフェースは、SQLオブジェクト型のマッピング専用です。 -
JDBCアプリケーションで
REF
オブジェクトを作成して取り出すことができるのは、SQL文を実行した場合のみです。REF
オブジェクトを作成して取り出すためのJDBC固有の機能はありません。 -
配列はオブジェクトの同様に構造化型ですが、参照できません。
15.2 オブジェクト参照の取出しと引渡し
この項では、オブジェクト参照の取出しと引渡しを行うJDBC機能を説明します。内容は次のとおりです。
15.2.1 結果セットからのオブジェクト参照の取出し
オブジェクト参照を取り出す方法を示すために、次の例では、最初に、Oracleオブジェクト型ADDRESS
を定義し、次にPEOPLE
表でこのオブジェクト型を参照します。
create type ADDRESS as object (street_name VARCHAR2(30), house_no NUMBER); create table PEOPLE (col1 VARCHAR2(30), col2 NUMBER, col3 REF ADDRESS);
ADDRESS
オブジェクト型には、street nameとhouse numberという2つの属性があります。PEOPLE
表には、文字データ用の列、数値データ用の列、およびADDRESS
オブジェクトへの参照を含む列が設定されています。
オブジェクト参照を取り出すには、次のステップに従ってください。
- 標準SQL
SELECT
文を使用して、データベース表のREF
列から参照を取り出します。 getRef
を使用して、結果セットからAddress参照を取り出し、OracleRef
インスタンスに格納します。Address
をSQLオブジェクト型のADDRESS
に対応するJavaカスタム・クラスに変換します。- Javaクラス
Address
とSQL型ADDRESS
間の対応を、型マップに追加します。 getObject
メソッドを使用して、Address
参照の内容を取り出します。出力をAddress
にキャストします。
15.3 オブジェクト値に対する、オブジェクト参照を介したアクセスと更新
Ref
オブジェクトのsetObject
メソッドを使用すると、データベースにあるオブジェクトの値をオブジェクト参照から更新できます。このためには、最初に、データベース・オブジェクトに対する参照を取り出し、データベース・オブジェクトに対応するJavaオブジェクトを作成する必要があります。
たとえば、次のコードのように、「オブジェクト参照の取出しと引渡し」のコードを使用して、データベースのADDRESS
オブジェクトへの参照を取り出せます。
ResultSet rs = stmt.executeQuery("SELECT col3 FROM PEOPLE"); if (rs.next()) { Ref ref = rs.getRef(1); Address a = (Address)ref.getObject(); }
次に、データベースのADDRESS
オブジェクトに対応するJavaのAddress
オブジェクトを作成できます。次のように、Ref
インタフェースのsetObject
メソッドを使用して、データベース・オブジェクトの値を設定します。
Address addr = new Address(...); ref.setObject(addr);
この例では、setValue
メソッドによりデータベースのADDRESS
オブジェクトが即時更新されます。
関連トピック