Oracle® Fusion Middleware Oracle WebLogic Server JDBCのプログラミング 11g リリース1 (10.3.6) B60995-05 |
|
![]() 前 |
![]() 次 |
この章では、API拡張機能の使用、Oracle仮想プライベート・データベース、Oracle Thinドライバでのバッチ処理など、サードパーティのJDBCドライバを設定および使用する方法について説明します。
注意: この後の項で示す |
Oracleを含む一部のデータベース・ベンダーでは、DBMSを使用するデータベースのデータを操作するための独自のメソッドが追加されています。これらのメソッドは、標準のJDBCインタフェースを拡張したものです。WebLogic Serverは、ベンダーのJDBCドライバでパブリック・インタフェースとして公開されているすべての拡張機能メソッドをサポートします。
JDBCドライバで公開されている拡張機能メソッドを使用するには、アプリケーション・コードに次のような手順を組み込む必要があります。
データ・ソースでの接続の作成に使用するJDBCドライバから、ドライバ・インタフェースをインポートします。
データ・ソースから接続を取得します。
接続オブジェクトをベンダーの接続インタフェース型にキャストします。
ベンダーのドキュメントで説明されているとおりにAPI拡張機能を使用します。
ルックアップの失敗を捕捉するためにJNDIルックアップがtry/catch
ブロックで包まれている点、コンテキストがfinally
ブロックの中で閉じられている点に留意します。
以降の節では、サンプル・コードで詳細を示します。特定のJDBCドライバの特定の拡張機能メソッドについては、JDBCドライバ・ベンダーのドキュメントを参照してください。
以下のサンプル・コードでは、Oracle Thin Driverで利用できる拡張機能メソッドを使用して、JDBCのAPI拡張機能の使用方法を示します。使用するJDBCドライバで公開されているメソッドに合わせて、これらの例を修正することができます。
データ・ソースでの接続の作成に使用するJDBCドライバから、インタフェースをインポートします。この例ではOracle Thin Driverのインタフェースを使用します。
import java.sql.*;
import java.util.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import oracle.jdbc.*;
// Import driver interfaces. The driver must be the same driver
// used to create the database connection in the data source.
JNDI、DataSource、およびデータ・ソース・オブジェクトを使用して、データベース接続を確立します。
// Get a valid DataSource object for a data source. // Here we assume that getDataSource() takes // care of those details. javax.sql.DataSource ds = getDataSource(args); // get a java.sql.Connection object from the DataSource java.sql.Connection conn = ds.getConnection();
接続を取得したら、ベンダーの接続の形にキャストできます。この例ではOracle Thin DriverのOracleConnectionインタフェースを使用します。
orConn = (oracle.jdbc.OracleConnection)conn;
// This replaces the deprecated process of casting the connection
// to a weblogic.jdbc.vendor.oracle.OracleConnection. For example:
// orConn = (weblogic.jdbc.vendor.oracle.OracleConnection)conn;
次のコードでは、Oracle Thin Driverで使用できるOracleの行プリフェッチ・メソッドの使い方を示します。
例6-1 API拡張機能を使用する
// Cast to OracleConnection and retrieve the // default row prefetch value for this connection. int default_prefetch = ((oracle.jdbc.OracleConnection)conn).getDefaultRowPrefetch(); // This replaces the deprecated process of casting the connection // to a weblogic.jdbc.vendor.oracle.OracleConnection. For example: // ((weblogic.jdbc.vendor.oracle.OracleConnection)conn). // getDefaultRowPrefetch(); System.out.println("Default row prefetch is " + default_prefetch); java.sql.Statement stmt = conn.createStatement(); // Cast to OracleStatement and set the row prefetch // value for this statement. Note that this // prefetch value applies to the connection between // WebLogic Server and the database. ((oracle.jdbc.OracleStatement)stmt).setRowPrefetch(20); // This replaces the deprecated process of casting the // statement to a weblogic.jdbc.vendor.oracle.OracleStatement. // For example: // ((weblogic.jdbc.vendor.oracle.OracleStatement)stmt). // setRowPrefetch(20); // Perform a normal sql query and process the results... String query = "select empno,ename from emp"; java.sql.ResultSet rs = stmt.executeQuery(query); while(rs.next()) { java.math.BigDecimal empno = rs.getBigDecimal(1); String ename = rs.getString(2); System.out.println(empno + "\t" + ename); } rs.close(); stmt.close(); conn.close(); conn = null; }
JDBCが実装されたときに、Oracle JDBCタイプのインタフェースを使用するかわりに具象クラスが使用されました。具象クラスを使用すると多くのデメリットがあります。11.2.0.3ドライバでは、Oracleタイプに対応する新しいインタフェースがあります。現在、具象クラスによって、パッケージoracle.jdbc
のパブリック・インタフェースが実装されています。プログラマは可能な場合にはjava.sql
に公開されたメソッドを使用する必要があります。Oracle拡張機能メソッドについては、oracle.jdbc
を使用します。
WebLogic Serverでは、具象クラスの制限に対処するために使用される、対応するインタフェースを暫定的に実装しました。これらは現在非推奨となったため、対応するoracle.jdbc
インタフェースで置き換える必要があります。
Databaseバージョン11.2.0.3では、インタフェースがあるのは次のタイプです。
古いOracleタイプ | 非推奨WLSインタフェース | 新しいインタフェース |
---|---|---|
oracle.sql.ARRAY |
weblogic.jdbc.vendor.oracle.OracleArray |
oracle.jdbc.OracleArray |
oracle.sql.STRUCT |
weblogic.jdbc.vendor.oracle.OracleStruct |
oracle.jdbc.OracleStruct |
oracle.sql.CLOB |
weblogic.jdbc.vendor.oracle.OracleThinClob |
oracle.jdbc.OracleClob |
oracle.sql.BLOB |
weblogic.jdbc.vendor.oracle.OracleThinBlob |
oracle.jdbc.OracleBlob |
oracle.sql.REF |
weblogic.jdbc.vendor.oracle.OracleRef |
oracle.jdbc.OracleRef |
新しいインタフェースを使用するためのコード変更は、難しくはありませんが注意深く行う必要があります。次の例ではoracle.sql.ARRAYが使用されます。他のタイプにも同様の変更が適用されます。推奨する変更は次のとおりです。
Import
: 古いインタフェース(oracle.sql
またはweblogic.jdbc.vendor.oracle
)のかわりに新しいインタフェース(oracle.jdbc
)を使用するように、import文を変更します。
Declaration
: 可能な場合には宣言で標準のJavaインタフェースを使用します。Oracle拡張機能を使用する必要がある場合は、oracle.jdbc
で新しいOracleインタフェースを使用します。
Methods
: 可能な場合には標準のJavaインタフェースを使用します。
(Oracle Types): 可能な場合には標準のJavaインタフェースのメソッドを使用します。必要な場合は、Oracleインタフェースのメソッドをoracle.jdbc
で使用します。
(Defines): getARRAY
などOracle固有のメソッドは使用しないでください。標準のJavaインタフェースがない場合は、かわりに標準のJavaメソッド(getArray
またはgetObject
など)を使用します。
(Binds): setARRAY
などOracle固有のメソッドは使用しないでください。標準のJavaインタフェースがないメソッド場合は、かわりに標準のJavaメソッド(setARRAY
またはsetObject
など)を使用します。
import文の置換は、find
とsed
を使用するスクリプトで実行できます。例:
find . -name "*.java" -exec egrep ... > files.list for f in `cat files.list`; do cat $f |sed 's@^import oracle\.sql\.ARRAY@oracle\.jdbc.OracleArray@g' > /tmp/temp.txt mv /tmp/temp.txt $f done
プログラマは、oracle.jdbc.OracleConnection
でファクトリ・メソッドを使用して、タイプのインスタンスを作成する必要があります。例:
int[] intArray = { 5, 7, 9}; oracle.sql.ArrayDescriptor aDescriptor = new oracle.sql.ArrayDescriptor("SCOTT.TYPE1", connection); oracle.sql.ARRAY array = new oracle.sql.ARRAY(aDescriptor, connection, intArray);
これを次のように変更します。
int[] intArray = { 5, 7, 9}; java.sql.Array array = connection.createOracleArray("SCOTT.TYPE1", intArray);
注意: Oracleでは、匿名配列タイプはサポートされません。標準の 一部のメソッドは次の理由により使用できなくなりました。
このようなケースでは、標準APIを使用するようにコードを変更する必要があります。 |
Oracle Thin Driverのほとんどの拡張機能では、「JDBCインタフェースのAPI拡張機能の使い方」で説明したような標準的な方法を使用できます。ただし、バージョン11.2.0.3よりも前では、Oracle Thinドライバで、以下のクラスの拡張機能メソッドに対するパブリック・インタフェースを提供していません。
oracle.sql.ARRAY
oracle.sql.STRUCT
oracle.sql.REF
oracle.sql.BLOB
oracle.sql.CLOB
WebLogic Serverでは、これらのクラスの拡張機能メソッドにアクセスするために、独自のインタフェースを提供しています。
weblogic.jdbc.vendor.oracle.OracleArray
weblogic.jdbc.vendor.oracle.OracleStruct
weblogic.jdbc.vendor.oracle.OracleRef
weblogic.jdbc.vendor.oracle.OracleThinBlob
weblogic.jdbc.vendor.oracle.OracleThinClob
以降の節では、これらの拡張機能のWebLogic Serverインタフェースを使用するためのサンプル・コードを示します。サポートされるメソッドのリストについては、「Oracle Thin Driver拡張機能インタフェースとサポートされるメソッドの表」を参照してください。詳細については、Oracleのドキュメントを参照してください。
注意: このプロセスを使用すると、「Oracle Thin Driver拡張機能インタフェースとサポートされるメソッドの表」で示す拡張機能向けのWebLogic Serverインタフェースを使用できます。ただし、上記のインタフェースはすべて非推奨になっており、WebLogic Serverの今後のリリースで削除される予定です。 |
JDBCインタフェースにOracle Thin Driver拡張機能を使用する場合、次の制限があります。
Oracle拡張機能は、サーバーと同じJVMを使用したサーバー側アプリケーションのみで、ARRAY、REF、およびSTRUCTの各オブジェクトに適用できます。リモート・クライアント・アプリケーションのARRAY、REFおよびSTRUCTにOracle拡張機能は使用できません。
標準以外のOracle記述子オブジェクトを使用して、アプリケーション内でARRAYおよびSTRUCTを作成できます。
Oracleオブジェクト型へのREFを含む表に対する問合せを実行できます。REFはJDBCによってJava oracle.sql.REF
オブジェクトとして具体化されます。JDBCでは、ゼロからの新規REFの作成はサポートしていません。データベースに移動して新規REFをSQLに挿入し、REFを選択してクライアントに返します。
クライアントとサーバーで異なるバージョンのWebLogic Serverを使用する場合は、相互運用性の制限があります。「さまざまなバージョンのWebLogic Serverクライアント/サーバー間におけるAPI拡張機能のサポート」を参照してください。
注意: JDBC 4.0 APIでは、次の
|
以下のサンプル・コードでは、11.2.0.3よりも前の、パブリック・インタフェースとして利用できないOracle拡張機能に対するWebLogic Serverインタフェースにアクセスする方法を示します。次のようなインタフェースがあります。
ARRAY - 「ARRAYによるプログラミング」を参照してください。
STRUCT - 「STRUCTによるプログラミング」を参照してください。
REF - 「REFによるプログラミング」を参照してください。
BLOBおよびCLOB - 「BLOBとCLOBを使用したプログラミング」を参照してください。
WebLogic Serverと共にサーバー・サンプルをインストールするオプションを選択した場合は、JDBCサンプルの詳細なサンプル・コードを参照してください。JDBCサンプルは通常、WL_HOME
\samples\server\src\examples\jdbc
にあります。WL_HOME
はWebLogic Serverをインストールしたフォルダです。
WebLogic Serverのサーバー側アプリケーションでは、結果セット、またはJava配列として呼出し可能文を使用することにより、Oracle Collection (SQL ARRAY)を実体化できます。
WebLogic ServerアプリケーションでARRAYを使用するには、次の手順に従います。
必要なクラスをインポートします。
接続を取得して、接続のための文を作成します。
結果セット、または呼出し可能文を使用してARRAYを取得します。
ARRAYをjava.sql.Array
またはweblogic.jdbc.vendor.oracle.OracleArray
のいずれかとして使用します。
標準Javaメソッド(java.sql.Array
として使用)、またはOracle拡張機能メソッド(weblogic.jdbc.vendor.oracle.OracleArray
にキャスト)を使用して、データを操作します。
以下の節では、これらのアクションの詳細について説明します。
注意: ARRAYはサーバー側アプリケーションでのみ使用できます。リモート・クライアント・アプリケーションではARRAYは使用できません。 |
この例で使用するWebLogicインタフェースをインポートします。OracleArrayインタフェースは、oracle.sql.ARRAY
に相当し、WebLogic Serverでサポートされるメソッドを使用する場合、WebLogicインタフェースと同様に使用できます。
import java.sql.*;
import java.util.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import weblogic.jdbc.vendor.oracle.*;
JNDIとDataSourceオブジェクトを使用して、データベース接続を確立します。
// Get a valid DataSource object. // Here we assume that getDataSource() takes // care of those details. javax.sql.DataSource ds = getDataSource(args); // get a java.sql.Connection object from the DataSource java.sql.Connection conn = ds.getConnection();
呼出し可能文、または結果セットにgetArray()
メソッドを使用して、Java配列を取得できます。この配列をjava.sql.array
として使用することで標準java.sql.array
メソッドを利用できます。またweblogic.jdbc.vendor.oracle.OracleArray
にキャストすることで、配列にOracle拡張機能メソッドを利用することもできます。
以下の例では、ARRAYを含む結果セットからjava.sql.array
を取得する方法を示します。この例では、問合せにより、オブジェクト列(学生の成績を示すARRAY)を含む結果セットが返されます。
try { conn = getConnection(url); stmt = conn.createStatement(); String sql = "select * from students"; //Get the result set rs = stmt.executeQuery(sql); while(rs.next()) { BigDecimal id = rs.getBigDecimal("student_id"); String name = rs.getString("name"); log("ArraysDAO.getStudents() -- Id = "+id.toString()+", Student = "+name); //Get the array from the result set Array scoreArray = rs.getArray("test_scores"); String[] scores = (String[])scoreArray.getArray(); for (int i = 0; i < scores.length; i++) { log(" Test"+(i+1)+" = "+scores[i]); } }
データベースにおけるARRAYを更新するには、次の手順に従います。
更新する配列がデータベースにない場合、PL/SQLを使用してデータベースに配列を作成します。
結果セット、または呼出し可能文を使用してARRAYを取得します。
Javaアプリケーション内の配列をjava.sql.Array
またはweblogic.jdbc.vendor.oracle.OracleArray
として扱います。
プリペアド文または呼出し可能文にsetArray()
メソッドを使用して、データベース内の配列を更新します。例:
String sqlUpdate = "UPDATE SCOTT." + tableName + " SET col1 = ?"; conn = ds.getConnection(); pstmt = conn.prepareStatement(sqlUpdate); pstmt.setArray(1, array); pstmt.executeUpdate();
ARRAYに対してOracle Thin Driver拡張機能メソッドを利用するには、まずこの配列をweblogic.jdbc.vendor.oracle.OracleArray
にキャストします。キャストが済むとARRAYに対してOracle Thin Driver拡張メソッドを呼び出せます。例:
oracle.sql.Datum[] oracleArray = null; oracleArray = ((weblogic.jdbc.vendor.oracle.OracleArray)scoreArray).getOracleArray(); String sqltype = null sqltype = oracleArray.getSQLTypeName()
WebLogic Serverアプリケーションでは、Oracleデータベースからオブジェクトにアクセスしたり、オブジェクトを操作したりできます。Oracleデータベースからオブジェクトを検索したら、カスタムJavaオブジェクト、またはSTRUCT (java.sql.struct
あるいは weblogic.jdbc.vendor.oracle.OracleStruct
)のいずれかとして、オブジェクトをキャストできます。STRUCTは、アプリケーション中のカスタム・クラスを置き換える構造化データを表す型制限の緩いデータ型です。JDBC APIにおけるSTRUCTインタフェースには、STRUCT中の属性値を操作するためのさまざまなメソッドが組み込まれています。Oracleでは、いくつかの追加メソッドを使用して、STRUCTインタフェースを拡張しています。WebLogic Serverでは、すべての標準メソッドと大部分のOracle拡張機能が実装されています。
注意: STRUCTを使用する場合、次の制限があります。
|
WebLogic ServerアプリケーションでSTRUCTを使用するには、次の手順に従います。
必要なクラスをインポートします。(「WebLogic Oracle拡張機能へアクセスするパッケージをインポートする」を参照。)
接続を取得します(「接続を確立する」を参照)。
getObject
を使用してSTRUCTを取得します。
STRUCTをSTRUCT (標準のメソッドを使用する場合はjava.sql.Struct
、標準のメソッドとOracle拡張機能メソッドを使用する場合はweblogic.jdbc.vendor.oracle.OracleStruct
)にキャストします。
標準メソッド、またはOracle Thin Driver拡張機能メソッドを使用して、データを操作します。
以下の節では、手順3 - 5について詳しく説明します。
データベース・オブジェクトをSTRUCTとして取得するには、まず問合せを使用して結果セットを作成し、次にgetObject
メソッドを使用して、結果セットからSTRUCTを取得します。その後でSTRUCTをjava.sql.Struct
にキャストすることにより、標準Javaメソッドを使用できるようになります。例:
conn = ds.getConnection(); stmt = conn.createStatement(); rs = stmt.executeQuery("select * from people"); struct = (java.sql.Struct)(rs.getObject(2)); Object[] attrs = ((java.sql.Struct)struct).getAttributes();
WebLogic Serverでは、STRUCTに対応するすべてのJDBC APIメソッドがサポートされます。
getAttributes()
getAttributes(java.util.Dictionary map)
getSQLTypeName()
したがって、STRUCTをweblogic.jdbc.vendor.oracle.OracleStruct
にキャストすると、標準メソッドと拡張機能メソッドの両方を使用できるようになります。
STRUCTにOracle Thin Driver拡張機能メソッドを使用する場合、java.sql.Struct
(または元のgetObject
の結果)をweblogic.jdbc.vendor.oracle.OracleStruct
にキャストする必要があります。例:
java.sql.Struct struct = (weblogic.jdbc.vendor.oracle.OracleStruct)(rs.getObject(2));
WebLogic Serverでは次のOracle拡張機能がサポートされます。
getDescriptor()
getOracleAttributes()
getAutoBuffering()
setAutoBuffering(boolean)
STRUCTの個々の属性値を取得するには、getAttributes()
およびgetAttributes(java.util.Dictionary map)
の標準JDBC APIメソッド、またはOracle拡張機能メソッドgetOracleAttributes()
を使用できます。
標準メソッドを使用するには、まず結果セットを作成し、この結果セットからSTRUCTを取得した後でgetAttributes()
メソッドを使用します。このメソッドにより、順序の付いた属性の配列が返されます。アプリケーションのオブジェクト(Java言語タイプなど)にSTRUCT (データベースのオブジェクト)の属性を割り当てることができます。この後、属性を個別に操作できるようになります。例:
conn = ds.getConnection(); stmt = conn.createStatement(); rs = stmt.executeQuery("select * from people"); //The third column uses an object data type. //Use getObject() to assign the object to an array of values. struct = (java.sql.Struct)(rs.getObject(2)); Object[] attrs = ((java.sql.Struct)struct).getAttributes(); String address = attrs[1];
上の例で、people
表の第3列ではオブジェクト・データ型を使用しています。この例では、値の配列を含むJavaオブジェクトにgetObject
メソッドの結果を割り当て、必要に応じて配列中の個別の値を使用する方法を示しています。
また、getAttributes(java.util.Dictionary map)
メソッドを使用しても、STRUCTから属性を取得できます。このメソッドを使用する場合は、Java言語データ型にOracleオブジェクトのデータ型をマップするためのハッシュ表を用意する必要があります。例:
java.util.Hashtable map = new java.util.Hashtable(); map.put("NUMBER", Class.forName("java.lang.Integer")); map.put("VARCHAR", Class.forName("java.lang.String")); Object[] attrs = ((java.sql.Struct)struct).getAttributes(map); String address = attrs[1];
また、Oracle拡張機能メソッドgetOracleAttributes()
を使用して、STRUCTの属性を取得することもできます。まず、STRUCTをweblogic.jdbc.vendor.oracle.OracleStruct
にキャストする必要があります。このメソッドにより、oracle.sql.Datum
オブジェクトのデータ配列が返されます。例:
oracle.sql.Datum[] attrs = ((weblogic.jdbc.vendor.oracle.OracleStruct)struct).getOracleAttributes(); oracle.sql.STRUCT address = (oracle.sql.STRUCT) attrs[1]; Object address_attrs[] = address.getAttributes();
上の例では、STRUCTがネスト構造になっています。つまり、ここで返されるデータ配列には、別のSTRUCTが入れ子の構造で組み込まれています。
STRUCTを使用してデータベースのオブジェクトを更新するには、プリペアド文にあるsetObject
メソッドを使用します。例:
conn = ds.getConnection(); stmt = conn.createStatement(); ps = conn.prepareStatement ("UPDATE SCHEMA.people SET EMPLNAME = ?, EMPID = ? where EMPID = 101"); ps.setString (1, "Smith"); ps.setObject (2, struct); ps.executeUpdate();
WebLogic Serverでは、setObject
メソッドの3つのバージョンがすべてサポートされます。
STRUCTは通常Javaアプリケーション中で、データベース・オブジェクトにマップするカスタムJavaクラスの代わりに、データベース・オブジェクトを実体化する場合に使用します。WebLogic Serverアプリケーションでは、データベースに転送するSTRUCTは作成できません。一方で、アプリケーションから検索や操作が実行できるようなデータベース・オブジェクトを作成する文は使用できます。例:
conn = ds.getConnection(); stmt = conn.createStatement(); cmd = "create type ob as object (ob1 int, ob2 int)" stmt.execute(cmd); cmd = "create table t1 of type ob"; stmt.execute(cmd); cmd = "insert into t1 values (5, 5)" stmt.execute(cmd);
注意: アプリケーションでSTRUCTは作成できません。データベースから既存のオブジェクトを検索して、これをSTRUCTにキャストすることはできます。アプリケーションでSTRUCTオブジェクトを作成するには、標準外のOracle STRUCT記述子オブジェクトを使用します。ただし、WebLogic Serverではサポートされません。 |
STRUCTを使用するWebLogic Serverアプリケーションのパフォーマンスを向上させるために、setAutoBuffering(boolean)
メソッドで自動バッファリング機能を切り換えることができます。自動バッファリングをtrue
に設定すると、weblogic.jdbc.vendor.oracle.OracleStruct
オブジェクトに、STRUCTオブジェクトにあるすべての属性のローカル・コピーが変換済みのフォーム(すなわちSQLからJava言語オブジェクトに実体化した形式)で保持されます。アプリケーションが、STRUCTに再びアクセスした時点で、データを再度変換する必要はありません。
注意: 変換した属性をバッファリングすると、アプリケーションで使用するメモリー量が過度に増大することがあります。自動バッファリングの有効/無効を切り換えるときは、可能メモリー使用量についても考慮してください。 |
以下の例は、自動バッファリングをアクティブにする方法を示します。
((weblogic.jdbc.vendor.oracle.OracleStruct)struct).setAutoBuffering(true);
また、getAutoBuffering()
メソッドを使用して、自動バッファリング・モードを判断することもできます。
REFは、行オブジェクトに対する論理ポインタです。REFを検索すると、実際には別の表にある値を指すポインタが返されます。REFのターゲットは、オブジェクト表の行でなければなりません。REFを使用して、これが参照するオブジェクトを検証したり、更新したりできます。またREFを変更することにより、同じオブジェクト・タイプの別のオブジェクトを指示したり、null値を割り当てたりすることができます。
注意: REFを使用する場合、次の制限があります。
|
WebLogic ServerアプリケーションでREFを使用するには、次の手順に従います。
必要なクラスをインポートします。(「WebLogic Oracle拡張機能へアクセスするパッケージをインポートする」を参照。)
データベース接続を取得します(「接続を確立する」を参照)。
結果セット、または呼出し可能文を使用してREFを取得します。
結果をSTRUCT、またはJavaオブジェクトにキャストします。これにより、STRUCTメソッド、またはJavaオブジェクトのメソッドを使用して、データを操作できるようになります。
また、データベースでREF作成したり、更新したりできます。
手順3と4について以下の節で詳しく説明します。
アプリケーションでREFを取得するには、まず問合せを使用して結果セットを作成し、次にgetRef
メソッドを使用して、結果セットからREFを取得します。続いてREFをjava.sql.Ref
にキャストすることにより、組込みJavaメソッドを使用できます。例:
conn = ds.getConnection(); stmt = conn.createStatement(); rs = stmt.executeQuery("SELECT ref (s) FROM t1 s where s.ob1=5"); rs.next(); //Cast as a java.sql.Ref and get REF ref = (java.sql.Ref) rs.getRef(1);
なお、上の例のWHERE句では、ドット表記法を使用して、参照するオブジェクトの属性を指定しています。
REFをjava.sql.Ref
にキャストした後は、Java APIメソッドgetBaseTypeName
を使用できます(これはREFに対応した唯一のJDBC 2.0標準メソッドです)。
REFを取得すると、実際には別のオブジェクト表にある値を指すポインタが返されます。REF値の取得や操作を行うには、Oracle拡張機能を使用します。この拡張機能は、sql.java.Ref
をweblogic.jdbc.vendor.oracle.OracleRef
にキャストする場合に限り使用できます。
REFにOracle Thin Driver拡張機能メソッドを使用するには、REFをOracle REFにキャストします。例:
oracle.sql.StructDescriptor desc = ((weblogic.jdbc.vendor.oracle.OracleRef)ref).getDescriptor();
WebLogic Serverでは次のOracle Thin Driver拡張機能がサポートされます。
getDescriptor()
getSTRUCT()
getValue()
getValue(dictionary)
setValue(object)
Oracle Thin Driverでは、2つのバージョンのgetValue()
メソッドが提供されています。パラメータを取らないメソッドと、戻り値の型をマップするハッシュ表を必要とするメソッドの2種類です。いずれかのgetValue()
メソッドを使用してREFの属性値を取得すると、STRUCTまたはJavaオブジェクトのいずれかの形式で結果が返されます。
パラメータを取らないgetValue()
メソッドを使用する方法を以下の例で示します。この例では、REFがoracle.sql.STRUCT型にキャストされます。getAttributes()
メソッドの説明で示したとおり、STRUCTメソッド群を使用して値を操作できます。
oracle.sql.STRUCT student1 = (oracle.sql.STRUCT)((weblogic.jdbc.vendor.oracle.OracleRef)ref).getValue (); Object attributes[] = student1.getAttributes();
また、getValue(dictionary)
メソッドを使用して、REFの値を取得できます。またREFの属性ごとにデータ型をJava言語データ型にマップするためのハッシュ表を用意する必要があります。例:
java.util.Hashtable map = new java.util.Hashtable(); map.put("VARCHAR", Class.forName("java.lang.String")); map.put("NUMBER", Class.forName("java.lang.Integer")); oracle.sql.STRUCT result = (oracle.sql.STRUCT) ((weblogic.jdbc.vendor.oracle.OracleRef)ref).getValue (map);
REFの更新では、次のような操作が行えます。
setValue(object)
メソッドを使用して、基底の表の値を変更する
プリペアド文または呼出し可能文を使用してREFが指示する位置を変更する
REFの値をnullに設定する
setValue(object)
メソッドを使用してREF値を更新する場合は、REFの新しい値を持つオブジェクトを作成してから、そのオブジェクトをsetValue
メソッドのパラメータとして渡します。例:
STUDENT s1 = new STUDENT(); s1.setName("Terry Green"); s1.setAge(20); ((weblogic.jdbc.vendor.oracle.OracleRef)ref).setValue(s1);
REFの値をsetValue(object)
メソッドで更新すると、実際にはREFが示す表の値が更新されます。
プリペアド文を使用してREFが指示する位置を更新するには、次の基本手順に従います。
新しい位置を指示するREFを取得します。このREFを使用して、別のREFの値を置き換えます。
SQLコマンドの文字列を作成して、既存のREFの位置を、別のREFの値で置き換えます。
プリペアド文を作成、および実行します。
例:
try { conn = ds.getConnection(); stmt = conn.createStatement(); //Get the REF. rs = stmt.executeQuery("SELECT ref (s) FROM t1 s where s.ob1=5"); rs.next(); ref = (java.sql.Ref) rs.getRef(1); //cast the REF as a java.sql.Ref } //Create and execute the prepared statement. String sqlUpdate = "update t3 s2 set col = ? where s2.col.ob1=20"; pstmt = conn.prepareStatement(sqlUpdate); pstmt.setRef(1, ref); pstmt.executeUpdate();
呼出し可能文を使用して、REFが指示する位置を更新する場合は、まずストアド・プロシージャを作成し、いずれかのINパラメータを設定して、OUTパラメータを登録した後、文を実行します。ストアド・プロシージャでは、実際の位置を指示するREF値が更新されます。例:
conn = ds.getConnection(); stmt = conn.createStatement(); rs = stmt.executeQuery("SELECT ref (s) FROM t1 s where s.ob1=5"); rs.next(); ref1 = (java.sql.Ref) rs.getRef(1); // Prepare the stored procedure sql = "{call SP1 (?, ?)}"; cstmt = conn.prepareCall(sql); // Set IN and register OUT params cstmt.setRef(1, ref1); cstmt.registerOutParameter(2, getRefType(), "USER.OB"); // Execute cstmt.execute();
JDBCアプリケーションにREFオブジェクトは作成できません。単に、データベースから既存のREFオブジェクトが検索されるだけです。ただし、文またはプリペアド文を使用して、データベースにREFを作成できます。例:
conn = ds.getConnection(); stmt = conn.createStatement(); cmd = "create type ob as object (ob1 int, ob2 int)" stmt.execute(cmd); cmd = "create table t1 of type ob"; stmt.execute(cmd); cmd = "insert into t1 values (5, 5)" stmt.execute(cmd); cmd = "create table t2 (col ref ob)"; stmt.execute(cmd); cmd = "insert into t2 select ref(p) from t1 where p.ob1=5"; stmt.execute(cmd);
上の例では、オブジェクト型(ob
)、このオブジェクト型の表(t1
)、ob
オブジェクトのインスタンスを示すREF列のある表(t2
)が作成され、REFがREF列に挿入されます。REFは、t1
の行を指します(最初の列の値は5
)。
この節では、OracleBlobインタフェースへのアクセス方法を示すサンプル・コードについて説明します。WebLogic Serverでサポートされるメソッドを使用している場合、この例で示す構文は、OracleBlobインタフェースで使用できます。「Oracle Thin Driverの拡張機能インタフェースとサポートされるメソッドの表」を参照してください。
注意: BLOBおよびCLOB (「LOB」と呼ばれる)を使用する場合、トランザクションの境界を考慮する必要があります。たとえば、すべての読取り/書込みをトランザクション内の特定のLOBに転送します。詳細については、Oracle Webサイト( |
BLOBロケータまたはハンドルは、Oracle Thin Driver Blobへの参照です。
String selectBlob = "select blobCol from myTable where blobKey = 666"
次のコードでは、Connectionがすでに確立されていることを前提としています。
ResultSet rs = null; Statement myStatement = null; java.sql.Blob myRegularBlob = null; java.io.OutputStream os = null;
このtry/catchブロックでは、BLOBロケータを取得して、Oracle Blob拡張機能にアクセスします。
try { // get our BLOB locator.. myStatement = myConnect.createStatement(); rs = myStatement.executeQuery(selectBlob); while (rs.next()) { myRegularBlob = rs.getBlob("blobCol"); } // Access the underlying Oracle extension functionality for // writing. Cast to the OracleThinBlob interface to access // the Oracle method. os = ((OracleThinBlob)myRegularBlob).getBinaryOutputStream(); ... } catch (SQLException sqe) { System.out.println("ERROR(general SQE): " + sqe.getMessage()); }
Oracle.ThinBlob
インタフェースにキャストしたら、Oracleがサポートするメソッドにアクセスできます。
一般に、WebLogic ServerはAPI拡張機能のサーバー側コードでの使用をサポートしています。API拡張機能をクライアント側コードで使用するには、オブジェクト型またはデータ型がシリアライズ可能でなければなりません。これに対する例外として、以下のオブジェクト型があります。
CLOB
BLOB
InputStream
OutputStream
これらのオブジェクト型についてはWebLogic Serverでデシリアライゼーションが行われるので、クライアント側コードで使用できます。
WebLogic ServerでのベンダーのJDBC拡張機能のサポート方法はWebLogic Server 8.1で変更されました。その影響で、さまざまなバージョンのクライアント/サーバー間の相互運用性が変更されています。WebLogic Server 8.1以降のクライアントがWebLogic Server 7.0以前のサーバーと対話する場合、Oracle拡張機能はサポートされません。クライアント・アプリケーションでJDBCオブジェクトをOracle拡張機能インタフェースにキャストしようとすると、ClassCastException
を受け取ります。ただし、WebLogic Server 7.0以前のクライアントがWebLogic Server 8.1以降のサーバーと対話する場合、Oracle拡張機能はサポートされます。
注意:
|
以前のリリースのWebLogic Serverでは、以下の表に示すJDBC拡張機能のみがサポートされていました。現在のリリースのWebLogic Serverは、ベンダーのJDBCドライバでパブリック・インタフェースとして公開されているほとんどの拡張機能メソッドをサポートします。API拡張機能の使用手順については、「JDBCインタフェースのAPI拡張機能の使い方」を参照してください。API拡張機能をサポートするための新しい内部メカニズムは以前の実装に依存していないため、一部のインタフェースは不要になって非推奨となりました。これらのインタフェースはWebLogic Serverの今後のリリースで削除される予定です。表6-1を参照してください。表に示された代わりのインタフェースを使用することをお薦めします。
表6-1 Oracle JDBC拡張機能の非推奨になったインタフェース
非推奨インタフェース | かわりに使用するOracleのインタフェース |
---|---|
weblogic.jdbc.vendor.oracle. OracleConnection |
oracle.jdbc.OracleConnection |
weblogic.jdbc.vendor.oracle. OracleStatement |
oracle.jdbc.OracleStatement |
weblogic.jdbc.vendor.oracle. OracleCallableStatement |
oracle.jdbc.OracleCallableStatement |
weblogic.jdbc.vendor.oracle. OraclePreparedStatement |
oracle.jdbc.OraclePreparedStatement |
weblogic.jdbc.vendor.oracle. OracleResultSet |
oracle.jdbc.OracleResultSet |
|
|
|
|
|
|
|
|
|
|
Oracleインタフェースを以下の表に示します。また、標準JDBC (java.sql.*
)インタフェースを拡張するためにOracle Thin Driver (またはこれらのメソッドをサポートする他のドライバ)で使用するメソッドのうち、サポートされているものについても示します。
表6-2 OracleConnectionインタフェース(非推奨)
拡張 | メソッド・シグネチャ |
---|---|
拡張
(このインタフェースは非推奨。) |
void clearClientIdentifier(String s) throws java.sql.SQLException; boolean getAutoClose() throws java.sql.SQLException; String getDatabaseProductVersion() throws java.sql.SQLException; String getProtocolType() throws java.sql.SQLException; String getURL() throws java.sql.SQLException; String getUserName() throws java.sql.SQLException; boolean getBigEndian() throws java.sql.SQLException; boolean getDefaultAutoRefetch() throws java.sql.SQLException; boolean getIncludeSynonyms() throws java.sql.SQLException; boolean getRemarksReporting() throws java.sql.SQLException; boolean getReportRemarks() throws java.sql.SQLException; |
拡張
(続き) (このインタフェースは非推奨。) |
boolean getRestrictGetTables()
throws java.sql.SQLException;
boolean getUsingXAFlag()
throws java.sql.SQLException;
boolean getXAErrorFlag()
throws java.sql.SQLException;
boolean isCompatibleTo816()
throws java.sql.SQLException;
(Deprecated)
byte[] getFDO(boolean b)
throws java.sql.SQLException;
int getDefaultExecuteBatch() throws
java.sql.SQLException;
int getDefaultRowPrefetch()
throws java.sql.SQLException;
int getStmtCacheSize()
throws java.sql.SQLException;
java.util.Properties getDBAccessProperties()
throws java.sql.SQLException;
short getDbCsId() throws java.sql.SQLException;
short getJdbcCsId() throws java.sql.SQLException;
short getStructAttrCsId()
throws java.sql.SQLException;
short getVersionNumber()
throws java.sql.SQLException;
void archive(int i, int j, String s)
throws java.sql.SQLException;
|
拡張
(続き) (このインタフェースは非推奨。) |
void close_statements() throws java.sql.SQLException; void initUserName() throws java.sql.SQLException; void logicalClose() throws java.sql.SQLException; void needLine() throws java.sql.SQLException; void printState() throws java.sql.SQLException; void registerSQLType(String s, String t) throws java.sql.SQLException; void releaseLine() throws java.sql.SQLException; void removeAllDescriptor() throws java.sql.SQLException; void removeDescriptor(String s) throws java.sql.SQLException; void setAutoClose(boolean on) throws java.sql.SQLException; void setClientIdentifier(String s) throws java.sql.SQLException; void clearClientIdentifier(String s) throws java.sql.SQLException; void setDefaultAutoRefetch(boolean b) throws java.sql.SQLException; void setDefaultExecuteBatch(int i) throws java.sql.SQLException; void setDefaultRowPrefetch(int i) throws java.sql.SQLException; void setFDO(byte[] b) throws java.sql.SQLException; void setIncludeSynonyms(boolean b) throws java.sql.SQLException; |
拡張
(続き) (このインタフェースは非推奨。) |
void setPhysicalStatus(boolean b) throws java.sql.SQLException; void setRemarksReporting(boolean b) throws java.sql.SQLException; void setRestrictGetTables(boolean b) throws java.sql.SQLException; void setStmtCacheSize(int i) throws java.sql.SQLException; void setStmtCacheSize(int i, boolean b) throws java.sql.SQLException; void setUsingXAFlag(boolean b) throws java.sql.SQLException; void setXAErrorFlag(boolean b) throws java.sql.SQLException; void shutdown(int i) throws java.sql.SQLException; void startup(String s, int i) throws java.sql.SQLException; |
表6-3 OracleStatementインタフェース(非推奨)
拡張 | メソッド・シグネチャ |
---|---|
拡張
(このインタフェースは非推奨。) |
String getOriginalSql() throws java.sql.SQLException; (Removed in Oracle 11g.) String getRevisedSql() throws java.sql.SQLException; ( |
拡張
(このインタフェースは非推奨。) |
void clearDefines() throws java.sql.SQLException; void defineColumnType(int i, int j) throws java.sql.SQLException; void defineColumnType(int i, int j, String s) throws java.sql.SQLException; void defineColumnType(int i, int j, int k) throws java.sql.SQLException; void describe() throws java.sql.SQLException; void setAutoRefetch(boolean b) throws java.sql.SQLException; void setAutoRollback(int i) throws java.sql.SQLException; ( |
表6-4 OracleResultSetインタフェース(非推奨)
拡張 | メソッド・シグネチャ |
---|---|
拡張
(このインタフェースは非推奨。) |
boolean getAutoRefetch() throws java.sql.SQLException; int getFirstUserColumnIndex() throws java.sql.SQLException; void closeStatementOnClose() throws java.sql.SQLException; void setAutoRefetch(boolean b) throws java.sql.SQLException; java.sql.ResultSet getCursor(int n) throws java.sql.SQLException; java.sql.ResultSet getCURSOR(String s) throws java.sql.SQLException; |
表6-5 OracleCallableStatementインタフェース(非推奨)
拡張 | メソッド・シグネチャ |
---|---|
拡張
(このインタフェースは非推奨。) |
void clearParameters() throws java.sql.SQLException; void registerIndexTableOutParameter(int i, int j, int k, int l) throws java.sql.SQLException; void registerOutParameter (int i, int j, int k, int l) throws java.sql.SQLException; java.sql.ResultSet getCursor(int i) throws java.sql.SQLException; java.io.InputStream getAsciiStream(int i) throws java.sql.SQLException; java.io.InputStream getBinaryStream(int i) throws java.sql.SQLException; java.io.InputStream getUnicodeStream(int i) throws java.sql.SQLException; |
表6-6 OraclePreparedStatementインタフェース(非推奨)
拡張 | メソッド・シグネチャ |
---|---|
拡張
(このインタフェースは非推奨。) |
int getExecuteBatch() throws java.sql.SQLException; void defineParameterType(int i, int j, int k) throws java.sql.SQLException; void setDisableStmtCaching(boolean b) throws java.sql.SQLException; void setExecuteBatch(int i) throws java.sql.SQLException; void setFixedCHAR(int i, String s) throws java.sql.SQLException; void setInternalBytes(int i, byte[] b, int j) throws java.sql.SQLException; |
表6-7 OracleArrayインタフェース(非推奨)
拡張 | メソッド・シグネチャ |
---|---|
拡張
(このインタフェースは非推奨。 |
public ArrayDescriptor getDescriptor() throws java.sql.SQLException; public Datum[] getOracleArray() throws SQLException; public Datum[] getOracleArray(long l, int i) throws SQLException; public String getSQLTypeName() throws java.sql.SQLException; public int length() throws java.sql.SQLException; public double[] getDoubleArray() throws java.sql.SQLException; public double[] getDoubleArray(long l, int i) throws java.sql.SQLException; public float[] getFloatArray() throws java.sql.SQLException; public float[] getFloatArray(long l, int i) throws java.sql.SQLException; public int[] getIntArray() throws java.sql.SQLException; public int[] getIntArray(long l, int i) throws java.sql.SQLException; public long[] getLongArray() throws java.sql.SQLException; public long[] getLongArray(long l, int i) throws java.sql.SQLException; |
拡張
(続き) (このインタフェースは非推奨。) |
public short[] getShortArray() throws java.sql.SQLException; public short[] getShortArray(long l, int i) throws java.sql.SQLException; public void setAutoBuffering(boolean flag) throws java.sql.SQLException; public void setAutoIndexing(boolean flag) throws java.sql.SQLException; public boolean getAutoBuffering() throws java.sql.SQLException; public boolean getAutoIndexing() throws java.sql.SQLException; public void setAutoIndexing(boolean flag, int i) throws java.sql.SQLException; |
表6-8 OracleStructインタフェース(非推奨)
拡張 | メソッド・シグネチャ |
---|---|
拡張
(このインタフェースは非推奨。) |
public Object[] getAttributes() throws java.sql.SQLException; public Object[] getAttributes(java.util.Dictionary map) throws java.sql.SQLException; public Datum[] getOracleAttributes() throws java.sql.SQLException; public oracle.sql.StructDescriptor getDescriptor() throws java.sql.SQLException; public String getSQLTypeName() throws java.sql.SQLException; public void setAutoBuffering(boolean flag) throws java.sql.SQLException; public boolean getAutoBuffering() throws java.sql.SQLException; |
表6-9 OracleRefインタフェース(非推奨)
拡張 | メソッド・シグネチャ |
---|---|
拡張
(このインタフェースは非推奨。) |
public String getBaseTypeName() throws SQLException; public oracle.sql.StructDescriptor getDescriptor() throws SQLException; public oracle.sql.STRUCT getSTRUCT() throws SQLException; public Object getValue() throws SQLException; public Object getValue(Map map) throws SQLException; public void setValue(Object obj) throws SQLException; |
表6-10 OracleThinBlobインタフェース(非推奨)
拡張 | メソッド・シグネチャ |
---|---|
拡張
(このインタフェースは非推奨。) |
int getBufferSize()throws java.sql.Exception int getChunkSize()throws java.sql.Exception int putBytes(long, int, byte[])throws java.sql.Exception int getBinaryOutputStream()throws java.sql.Exception |
表6-11 OracleThinClobインタフェース(非推奨)
拡張 | メソッド・シグネチャ |
---|---|
拡張
(このインタフェースは非推奨。) |
public OutputStream getAsciiOutputStream() throws java.sql.Exception; public Writer getCharacterOutputStream() throws java.sql.Exception; public int getBufferSize() throws java.sql.Exception; public int getChunkSize() throws java.sql.Exception; public char[] getChars(long l, int i) throws java.sql.Exception; public int putChars(long start, char myChars[]) throws java.sql.Exception; public int putString(long l, String s) throws java.sql.Exception; |
特定の状況下で、Oracle Thin Driverはバッチ・サイズに到達しない間、DBMSに更新を送信せず、文が閉じられるまで待機する場合があります。
プリペアド文
を閉じると、WebLogic Serverは文を閉じずに標準JDBC状態に返します。続いて文を接続のキャッシュに戻すため、次に必要な時に文を再配信できます。
すべての更新が確実に配信されるようにするには、文または接続を閉じる前に、文を最後に使用した後でsendBatch()
を明示的に呼び出す必要があります。
Oracle仮想プライベート・データベース(Oracle Virtual Private Database: VPD)は、サーバーによって強制されるアプリケーション定義のファイン・グレイン・アクセス制御と、Oracleデータベース・サーバーのセキュアなアプリケーション・コンテキストを組み合わせたものです。WebLogic ServerアプリケーションでVPDを使用するには、以下の手順に従います。
WebLogic Server構成でOracle Thinドライバを使用するJDBCデータ・ソースを作成します。Oracle WebLogic Server管理コンソール・ヘルプの第2章「アプリケーションでのWebLogic JDBCの使用」または「JDBCデータ・ソースの作成」を参照してください。
注意: XA対応のJDBCドライバを使用している場合、 |
アプリケーションで次のコードを実行します。
import weblogic.jdbc.extensions.WLConnection // get a connection from a WLS JDBC data source Connection conn = ds.getConnection(); // Get the underlying vendor connection object oracle.jdbc.OracleConnection orConn = (oracle.jdbc.OracleConnection) (((WLConnection)conn).getVendorConnection()); // Set CLIENT_IDENTIFIER (which will be accessible from // USERENV naming context on the database server side) orConn.setClientIdentifier(clientId); /* perform application specific work, preferably using conn instead of orConn */ // clean up connection before returning to WLS JDBC data source orConn.clearClientIdentifier(clientId); // As soon as you are finished with vendor-specific calls, // nullify the reference to the physical connection. orConn = null; // close the pooled connection conn.close();
注意: このコードでは、プールされた(論理的な)接続から得た基底の物理的な接続を使用します。 |
WebLogic Serverでは、oracle.jdbc.OracleConnection
.setClientIdentitfier
メソッドとoracle.jdbc.OracleConnection
.clearClientIndentifier
メソッドがサポートされています。これらを使用すると、プールされた接続から基底の物理的接続を使用せずに済みます。WebLogic ServerアプリケーションでVPDを使用するには、以下の手順に従います。
import weblogic.jdbc.vendor.oracle.OracleConnection; // get a connection from a WLS JDBC data source Connection conn = ds.getConnection(); // cast to the Oracle extension and set CLIENT_IDENTIFIER // (which will be accessible from USERENV naming context on // the database server side) ((weblogic.jdbc.vendor.oracle.OracleConnection)conn).setClientIdentifier(clientId); /* perform application specific work */ // clean up connection before returning to WLS JDBC data source ((OracleConnection)conn).clearClientIdentifier(clientId); // close the connection conn.close();