Oracle® Fusion Middleware Oracle WebLogic Server JDBCのプログラミング 11gリリース1 (10.3.6) B60995-04 |
|
前 |
次 |
この章では、サードパーティのJDBCドライバの設定方法と使用方法について、API拡張機能の使用、Oracle仮想プライベート・データベース、Oracle Thin Driverに対するバッチ処理も含めて説明します。
注意: 後続の項に記載されているweblogic.jdbc.vendor.oracle.* インタフェースは非推奨で、WebLogic Serverの今後のリリースで削除される可能性があります。 |
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; }
OracleでのJDBCの実装時、Oracle JDBC型用にインタフェースではなく具象クラスが使用されました。具象クラスの使用にはデメリットが多く、11.2.0.3のドライバには、Oracle型に対応する新規インタフェースが用意されています。具象クラスでは、現在oracle.jdbc
パッケージのパブリック・インタフェースが実装されます。プログラマは可能なかぎりjava.sql
の公開されているメソッドを使用する必要があります。Oracle拡張機能のメソッドの場合、oracle.jdbc
を使用します。
また、WebLogic Serverで、具象クラスの制限を回避するために使用できる、対応するインタフェースが実装されていました。これらは現在推奨されず、対応するoracle.jdbc
インタフェースで置き換える必要があります。
バージョン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
)を使用するようインポート文を変更します。
宣言
: 宣言には、可能なかぎり標準Javaインタフェースを使用します。Oracle拡張機能を使用する必要がある場合、oracle.jdbc
下の新規Oracleインタフェースを使用します。
メソッド
: 可能なかぎり標準Javaインタフェースを使用します。
(Oracle型): 可能なかぎり標準Javaインタフェースのメソッドを使用します。必要に応じて、oracle.jdbc
下のOracleインタフェースのメソッドを使用します。
(定義): Oracle固有のメソッド(getARRAY
など)を使用しないようにします。かわりに、標準Javaメソッド(getArray
、getObject
など)を標準Javaインタフェースがないものに対して使用します。
(バインド): Oracle固有のメソッド(setARRAY
など)を使用しないようにします。かわりに、標準Javaメソッド(setArray
、setObject
など)を標準Javaインタフェースがないものに対して使用します。
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では匿名配列型がサポートされないため、標準のConnection.createArrayOf メソッドはサポートされません。
次の理由から、使用できなくなったメソッドがあります。
これらの場合、標準のAPIを使用するようコードを変更する必要があります。 |
Oracle Thin Driverのほとんどの拡張機能では、「JDBCインタフェースのAPI拡張機能の使い方」で説明したような標準的な方法を使用できます。ただし、バージョン11.2.0.3以前は、Oracle Thin Driverで、次のクラスの拡張機能メソッドに対するパブリック・インタフェースを提供していません。
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では、次のjava.sql.Connection は記述子なしにアプリケーション内でSTRUCTおよびARRAYオブジェクトを作成するために使用できます。
|
以下のサンプル・コードでは、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サイト(http://www.oracle.com )にあるOracleのドキュメントの「LOB Locators and Transaction Boundaries」を参照してください。 |
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.jdbc.vendor.oracle.* インタフェースは非推奨で、WebLogic Serverの今後のリリースで削除される可能性があります。標準のJDBCインタフェースは、クライアントまたはサーバーのバージョンに関係なくサポートされます。 |
以前のリリースの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ドライバを使用している場合、KeepXAConnTillTxComplete=true に設定する必要があります。Oracle WebLogic Server管理コンソール・ヘルプの「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();