Oracle® Fusion Middleware Oracle WebLogic Server 12.1.3 JDBCアプリケーションの開発 12c (12.1.3) E56265-04 |
|
前 |
次 |
この章では、WebLogic Server 12.1.3でAPI拡張機能の使用およびOracle Thin Driverでのバッチ処理など、サードパーティのJDBCドライバを設定および使用する方法について説明します。
この章には次の項が含まれます:
Oracleを含む一部のデータベース・ベンダーでは、DBMSを使用するデータベースのデータを操作するための独自のメソッドが追加されています。これらのメソッドは、標準のJDBCインタフェースを拡張したものです。WebLogic Serverは、ベンダーのJDBCドライバでパブリック・インタフェースとして公開されているすべての拡張機能メソッドをサポートします。
JDBCドライバで公開されている拡張機能メソッドを使用するには、アプリケーション・コードに次のような手順を組み込む必要があります。
データ・ソースでの接続の作成に使用するJDBCドライバから、ドライバ・インタフェースをインポートします。
データ・ソースから接続を取得します。
接続オブジェクトをベンダーの接続インタフェース型にキャストします。
ベンダーのドキュメントで説明されているとおりにAPI拡張機能を使用します。
ルックアップの失敗を捕捉するためにJNDIルックアップをtry/catch
ブロックでラップし、コンテキストをfinally
ブロックで閉じるようにします。
次の各項では、API拡張機能の使用方法およびサポートしているサンプル・コードについて説明します。特定の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
インタフェースを使用します。
OracleConnection = (oracle.jdbc.OracleConnection)conn;
次のコードでは、Oracle Thin Driverで使用できるOracleのRowPrefetch
の使い方を示します。
例7-1 API拡張機能を使用する
// Cast to OracleConnection and retrieve the // default row prefetch value for this connection. int default_prefetch = ((oracle.jdbc.OracleConnection)conn).getDefaultRowPrefetch(); // 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); // 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では、匿名配列タイプはサポートされません。標準のConnection.createArrayOf メソッドもサポートされません。かわりに、前述の例に示すようにcreateOracleArray を使用します。
一部のメソッドは次の理由により使用できなくなりました。
このようなケースでは、標準APIを使用するようにコードを変更する必要があります。 |
次の各サンプル・コードでは、次のインタフェースを含むOracle拡張機能のインタフェースにアクセスする方法を示します。
Array - 「Arrayによるプログラミング」を参照してください。
Struct - 「Structによるプログラミング」を参照してください。
Ref - 「Refによるプログラミング」を参照してください。
BlobおよびClob - 「ラージ・オブジェクトによるプログラミング」を参照してください。
WebLogic Serverとともにサーバーのサンプルをインストールするオプションを選択した場合は、JDBCサンプルで詳細なサンプル・コードを確認できます。詳細は、「JDBCサンプルとチュートリアル」を参照してください。
注意: Array 、Struct およびRef はサーバー側アプリケーションのみで使用できます。非推奨のJDBC over RMIインタフェースを使用して、リモート・クライアントでこれらにアクセスすることはできません。 |
WebLogic Serverのサーバー側アプリケーションでは、結果セット、またはJava配列として呼出し可能文を使用することにより、Oracle Collection (SQL Array
)を実体化できます。
Array
をWebLogic Serverアプリケーションで使用するには、次の手順に従います。
必要なクラスをインポートします。
接続を取得して、接続のための文を作成します。
Array
タイプおよびそのタイプを使用する表を作成し、その表に、配列を含むいくつかの行を作成します。
結果セット、または呼出し可能文を使用してArray
を取得します。
標準Javaメソッド(java.sql.Array
として使用)、またはOracle拡張機能メソッド(java.jdbc.OracleArray
にキャスト)を使用してデータを操作します。
次の各項では、これらのアクションの詳細について説明します。
この例で使用するSQL
インタフェースおよびOracle
インタフェースをインポートします。
import java.math.BigDecimal;
import java.sql.*;
import java.util.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import oracle.jdbc.*;
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();
最初に配列タイプ、およびそのタイプを使用する表を作成する必要があります。例:
Statement stmt = conn.createStatement(); stmt.execute("CREATE TYPE TEST_SCORES AS VARRAY(10)OF INT"); stmt.execute("CREATE TABLE STUDENTS (STUDENT_ID INT, NAME VARCHAR2(100), SCORES TEST_SCORES)");
次の例では、学生に関連付ける最大10のテスト・スコアを含む配列を作成します。
Arrayを含む行を作成します。Statement
を使用するか、OracleConnection.createOracleArray
を使用してArray
を作成し、PreparedStatement
で使用できます。
注意: Oracleでは匿名配列タイプはサポートされないため、Connection.createArrayOf は使用できません。 |
行を2つ挿入します。最初の行ではSQL
文を使用します。2つ目の行では、Array
を作成してPreparedStatement
にバインドします。
stmt.execute("INSERT INTO STUDENTS VALUES 1,'John Doe',TEST_SCORES(100,99))"); PreparedStatement pstmt = conn.prepareStatement("INSERT INTO STUDENTS VALUES (?,?,?)"); pstmt.setInt(1,2); pstmt.setString(2,"Jane Doe"); int scores[] = {94, 95}; Array array = ((OracleConnection)conn).createOracleArray("TEST_SCORES",scores); pstmt.setArray(3,array); pstmt.execute();
呼出し可能文、または結果セットにgetArray()
メソッドを使用して、Java配列を取得できます。この配列をjava.sql.array
として使用することで標準のメソッドを利用できます。またoracle.jdbc.OracleArray
にキャストすることで、配列にOracle拡張機能メソッドを利用することもできます。
次の例では、Arrayを含む結果セットからjava.sql.Array
を取得する方法を示します。この例では、クエリーにより、オブジェクト列(学生のテスト・スコアを示すArray)を含む結果セットが返されます。
ResultSet rs = null; rs = stmt.executeQuery("SELECT * FROM STUDENTS"); while (rs.next()) { System.out.print("Name="+rs.getString(2)+": "); array = rs.getArray(3); BigDecimal scoresBD[] = (BigDecimal[])array.getArray(); OracleArray oracleArray = (OracleArray)rs.getArray(3); scores = oracleArray.getIntArray(); for (int i = 0; i < scores.length; i++) { System.out.print(""+scores[i]+" "); } System.out.println(""); }
注意: 整数の初期設定の戻り型はBigDecimal です。Array をOracleArray にキャストし、Oracle拡張機能メソッドgetIntArray() を使用して整数値を戻すことができます。 |
データベースでArrayを更新するには、次の手順に従います。
データベースで配列を作成します。第7章の「データベースでArrayを作成する」を参照してください。
プリペアド文または呼出し可能文にsetArray()
メソッドを使用して、データベース内の配列を更新します。例:
String sqlUpdate = "UPDATE STUDENTS SET SCORES = ? WHERE STUDENT_ID = ?"; int newscores[] = {94, 95, 96}; pstmt = conn.prepareStatement(sqlUpdate); array = ((OracleConnection)conn).createOracleArray("TEST_SCORES",newscores); pstmt.setArray(1, array); pstmt.setInt(2, 1); pstmt.executeUpdate();
Array
に対してOracle Thin Driver拡張機能メソッドを利用するには、まずこの配列をoracle.jdbc.OracleArray
にキャストします。これにより、標準のメソッドに加えて、Array
に対してOracle Thin Driver拡張機能メソッドを呼び出せるようになります。例:
OracleArray oracleArray = (OracleArray)rs.getArray(3); String sqltype = oracleArray.getSQLTypeName();
WebLogic Serverアプリケーションでは、Oracleデータベースからオブジェクトにアクセスしたり、オブジェクトを操作したりできます。Oracleデータベースからオブジェクトを検索したら、カスタムJavaオブジェクトまたはStruct
(java.sql.Struct
あるいはoracle.jdbc.OracleStruct
)のいずれかとしてオブジェクトをキャストできます。Struct
は、アプリケーション中のカスタム・クラスを置き換える構造化データを表す型制限の緩いデータ型です。JDBC APIにおけるStruct
インタフェースには、Struct
中の属性値を操作するための様々なメソッドが組み込まれています。Oracleでは、追加メソッドを使用してStruct
インタフェースを拡張しています。
Struct
をWebLogic Serverアプリケーションで使用するには、次の手順に従います。
必要なクラスをインポートします。(「Oracle拡張機能へアクセスするパッケージをインポートする」を参照してください。)
接続を取得します。(「接続を確立する」を参照してください。)
Struct
オブジェクト・タイプおよびそのオブジェクトを使用する表を作成し、Struct
オブジェクトを含む行を作成します。
オブジェクトをStruct
(標準のメソッドを使用する場合はjava.sql.Struct
、標準のメソッドとOracle拡張機能メソッドを使用する場合はoracle.jdbc.OracleStruct
)にキャストします。
標準メソッド、またはOracle Thin Driver拡張機能メソッドを使用して、データを操作します。
次の各項では、手順3-5について詳しく説明します。
Struct
は通常Javaアプリケーション中で、データベース・オブジェクトにマップするカスタムJavaクラスの代わりに、データベース・オブジェクトを実体化する場合に使用します。最初にタイプ、およびそのタイプを使用する表を作成する必要があります。次に例を示します(この例は説明目的にのみ使用するものであり、実際に使用できるわけではありません)。
conn = ds.getConnection(); Statement stmt = conn.createStatement(); stmt.execute("CREATE TYPE EMP_STRUCT AS OBJECT (DEPT INT, NAME VARCHAR2(100))"); stmt.execute("CREATE TABLE EMP (ID INT, EMPLOYEE EMP_STRUCT)");
Struct
オブジェクトを含む行を作成するには、SQL
文を使用するか、Connection.createStruct
を使用してStruct
を作成し、PreparedStatement
で使用できます。
行を2つ挿入します。最初の行ではSQL
文を使用します。2つ目の行では、Struct
を作成してPreparedStatement
にバインドします。
stmt.execute("INSERT INTO EMP VALUES (1001, EMP_STRUCT(10,'John Doe'))"); PreparedStatement pstmt = conn.prepareStatement("INSERT INTO EMP VALUES (?,?)"); Object attrs[] = { new Integer(20), "Jane Doe"}; Struct struct = conn.createStruct("EMP_STRUCT", attrs); pstmt.setInt(1,1002); pstmt.setObject(2,struct); pstmt.execute();
注意: Connection.createStruct() を使用してSQL 構造体を作成するときには、すべてのデータ型(Clob 、Blob 、Struct 、Ref 、Array 、NClob およびSQLXML )のラップを解除する必要があります。構造体を作成したら、構造体をアプリケーションに返す前に構造体を再度ラップする方法はありません。アプリケーションに返される構造体は、ラップ解除されたデータ型の値を持ちます。 |
Struct
の個々の属性値を取得するには、getAttributes()
およびgetAttributes(java.util.Dictionary map)
の標準JDBC APIメソッドを使用できます。
結果セットを作成し、この結果セットからStruct
を取得した後でgetAttributes()
メソッドを使用します。このメソッドにより、順序の付いた属性の配列が返されます。アプリケーションのオブジェクト(Java言語タイプなど)にStruct
(データベースのオブジェクト)の属性を割り当てることができます。この後、属性を個別に操作できるようになります。例:
conn = ds.getConnection(); stmt = conn.createStatement(); rs = stmt.executeQuery("SELECT * FROM EMP WHERE ID = 1002"); //The second column uses an object data type. if (rs.next()) { struct = (Struct)rs.getObject(2); attrs = struct.getAttributes(); String name = attrs[1]; }
上の例で、emp
表の第2列ではオブジェクト・データ型を使用しています。この例では、値の配列を含むJavaオブジェクトにgetObject
メソッドの結果を割り当て、必要に応じて配列中の個別の値を使用する方法を示しています。最初の整数属性の型は、実際にはjava.math.BigDecimal
であることに注意してください。
getAttributes(java.util.Dictionary map)
メソッドを使用してStruct
から属性を取得することもできます。このメソッドを使用する場合は、Java言語データ型にOracleオブジェクトのデータ型をマップするためのハッシュ表を用意する必要があります。例:
java.util.Hashtable map = new java.util.Hashtable(); map.put("INT", Class.forName("java.lang.Integer")); map.put("VARCHAR2", Class.forName("java.lang.String")); Object[] attrs = struct.getAttributes(map); String name = (String)attrs[1];
この例では、値がBigDecimal
ではなくInteger
として戻されます。
Struct
にOracle Thin Driver拡張機能メソッドを使用する場合、java.sql.Struct
(または元のgetObject
の結果)をoracle.jdbc.OracleStruct
にキャストする必要があります。Struct
をOracleStruct
にキャストすると、標準メソッドと拡張機能メソッドの両方を使用できるようになります。例:
OracleStruct oracleStruct = (OracleStruct)rs.getObject(2); String n = oracleStruct.getSQLTypeName(); // Standard oracle.jdbc.OracleTypeMetaData otmd = oracleStruct.getOracleMetaData(); // Extension
Struct
を使用してデータベースのオブジェクトを更新するには、プリペアド文にあるsetObject
メソッドを使用します。例:
pstmt = conn.prepareStatement("UPDATE EMP SET EMPLOYEE = ? WHERE ID =?"); attrs[0] = new Integer(30); struct = conn.createStruct("EMP_STRUCT", attrs); pstmt.setObject (1, struct); pstmt.setInt (2, 1002); pstmt.executeUpdate();
Ref
は、行オブジェクトに対する論理ポインタです。Ref
を検索すると、実際には別の表にある値(あるいは再帰的に同じ表)を指すポインタが返されます。Ref
のターゲットは、オブジェクト表の行でなければなりません。Ref
を使用して、これが参照するオブジェクトを検証したり、更新したりできます。またRef
を変更することにより、同じオブジェクト・タイプの別のオブジェクトを指示したり、null値を割り当てたりすることができます。
Ref
をWebLogic Serverアプリケーションで使用するには、次の手順に従います。
必要なクラスをインポートします。(「Oracle拡張機能へアクセスするパッケージをインポートする」を参照してください。)
データベース接続を取得します。(「接続を確立する」を参照してください。)
SQL
文を使用してRef
を作成します。
結果セット、または呼出し可能文を使用してRef
を取得します。
OracleRef
にキャストすることでOracle拡張機能メソッドを使用します。
データベースでRef
を更新します。
次の各項では、手順3-6について詳しく説明します。
JDBCアプリケーションにRef
オブジェクトは作成できません。単に、データベースから既存のRef
オブジェクトが検索されるだけです。ただし、文またはプリペアド文を使用して、データベースにRef
を作成できます。例:
conn = ds.getConnection(); stmt = conn.createStatement(); stmt.execute("CREATE TYPE OB AS OBJECT (OB1 INT, OB2 INT)"); stmt.execute("CREATE TABLE T1 OF OB"); stmt.execute("INSERT INTO T1 VALUES (5, 5)"); stmt.execute("CREATE TABLE T2 (COL REF OB)"); stmt.execute("INSERT INTO T2 SELECT REF(P) FROM T1 P WHERE P.OB1=5");
上の例では、オブジェクト型(OB
)、このオブジェクト型の表(T1
)、OB
オブジェクトのインスタンスを示すRef
列のある表(T2
)が作成され、Ref
がRef
列に挿入されます。Ref
は、T1
の行を指します(最初の列の値は5
)。
アプリケーションでRef
を取得するには、まずクエリーを使用して結果セットを作成し、次にgetRef
メソッドを使用して、結果セットからRef
を取得します。例:
rs = stmt.executeQuery("SELECT REF (S) FROM T1 S WHERE S.OB1=5"); rs.next(); Ref ref = rs.getRef(1); String name = ref.getBaseTypeName();
上の例のWHERE
句では、ドット表記法を使用して、参照するオブジェクトの属性を指定しています。Ref
を取得したら、Java APIメソッドgetBaseTypeName
を使用できます。
Ref
にOracle Thin Driver拡張機能メソッドを使用するには、Ref
をOracleRef
にキャストします。例:
OracleTypeMetaData mdata = ((OracleRef)ref). getOracleMetaData();
Ref
を更新するには、PreparedStatement
またはCallableStatement
を使用してRef
が指示する位置を変更します。
プリペアド文を使用してRefが指示する位置
を更新するには、次の基本手順に従います。
新しい位置を指示するRef
を取得します。このRef
を使用して、別のRef
の値を置き換えます。
SQL
コマンドの文字列を作成して、既存のRef
の位置を、別のRef
の値で置き換えます。
プリペアド文を作成、および実行します。
例:
//Get the Ref rs = stmt.executeQuery("SELECT REF (S) FROM T1 S WHERE S.OB1=5"); rs.next(); ref = rs.getRef(1); //Create and execute the prepared statement. String sqlUpdate = "UPDATE T2 S2 SET COL = ? WHERE S2.COL.OB1 = 20"; pstmt = conn.prepareStatement(sqlUpdate); pstmt.setRef(1, ref); pstmt.executeUpdate();
呼出し可能文を使用して、REF
が指示する位置を更新する場合は、まずストアド・プロシージャを作成し、いずれかのIN
パラメータを設定して、OUT
パラメータを登録した後、文を実行します。ストアド・プロシージャでは、実際の位置を指示するREF
値が更新されます。例:
rs = stmt.executeQuery("SELECT REF (S) FROM T1 S where S.OB1=5"); rs.next(); ref = rs.getRef(1); // Prepare the stored procedure String sql = "{call SP1 (?,?)}"; CallableStatement cstmt = conn.prepareCall(sql); // Set IN and register OUT params cstmt.setRef(1, ref); cstmt.registerOutParameter(2, Types.STRUCT, "OB"); // Execute cstmt.execute();
この項では、サンプル・コードなど、BlobおよびClobオブジェクトの操作方法に関する情報を取り上げます。詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』のLOBの操作に関する項を参照してください。
次のコードでは、Connection
がすでに確立されていることを前提としています。Blob
を第2列として表を作成します。
ResultSet rs = null; Statement stmt = null; java.sql.Blob blob = null; java.io.InputStream is = null; stmt = conn.createStatement(); stmt.execute("CREATE TABLE TESTBLOB (ID INT, COL2 BLOB )");
次のコードでは、バイト配列に変換された文字列をデータとして使用して、Blob
値が挿入されます。
String insertsql2 = "INSERT INTO TESTBLOB VALUES (?,?)"; PreparedStatement pstmt = conn.prepareStatement("INSERT INTO TESTBLOB VALUES (?,?)"); pstmt.setInt(1, 1); pstmt.setBytes(2, "initialvalue".getBytes()); pstmt.executeUpdate();
次のコードでは、Blob
値が更新されます。
rs = stmt.executeQuery("SELECT COL2 FROM TESTBLOB WHERE ID = 1 FOR UPDATE"); rs.next(); Blob blob = rs.getBlob(1); blob.setBytes(1, "newdata".getBytes());
FOR UPDATE
でBlob
値を更新できる必要があることに注意してください。
次のコードは、Blob
をOracleBlob
にキャストして拡張機能メソッドを使用できるようにします。
rs = stmt.executeQuery("SELECT COL1, COL2 FROM TESTBLOB"); rs.next(); Blob blob = rs.getBlob(2); is = blob.getBinaryStream(); // Standard is.close(); is = ((OracleBlob)blob).getBinaryStream(0); // Extended
OracleBlob
インタフェースにキャストしたら、標準のメソッドに加えて、Oracleがサポートするメソッドにアクセスできるようになります。
Clob
値はBlob
値と同様に使用できます。ただし、データがバイナリ配列ではなく文字列になります(setBytes
のかわりにsetString
、getBlob
のかわりにgetClob
、およびgetBinaryStream
のかわりにgetCharacterStream
を使用します)。
プリペアド文を使用してClob
を更新し、新しい値が以前の値より短い場合、Clob
には更新中に明示的に置換されなかった文字が保持されます。たとえば、Clob
の現在の値がabcdefghij
の場合に、プリペアド文を使用してzxyw
でClob
を更新すると、Clob
の値はzxywefghij
になります。プリペアド文で更新された値を修正するには、dbms_lob.trim
プロシージャを使用して、更新後に残った余分な文字を削除します。dbms_lob.trimプロシージャの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの「DBMS_LOB」
を参照してください。
LOBを使用する場合、トランザクションの境界を考慮する必要があります。たとえば、すべての読取り/書込みをトランザクション内の特定のLOBに転送します。
LOBが使用する領域を解放するには、lob.close()
を呼び出す必要があります。ResultSet
、Statement
またはConnection
が閉じていると、これは自動的に行われません。Oracleデータベースのみの場合、他のセッションが解放されたメモリーを使用できるように、セッションでalter session set events '60025 trace name context forever';
も実行する必要があります。
特定の状況下で、Oracle Thin Driverはバッチ・サイズに到達しない間、DBMSに更新を送信せず、文が閉じられるまで待機する場合があります。
プリペアド文
を閉じると、WebLogic Serverは文を閉じずに標準JDBC状態に返します。続いて文を接続のプールに戻すため、次に必要な時に文を再配信できます。
すべての更新が確実に配信されるようにするには、文または接続を閉じる前に、文を最後に使用した後でOraclePreparedStatement.sendBatch()
を明示的に呼び出す必要があります。