| Oracle® Fusion Middleware Oracle WebLogic Server JDBCアプリケーションの開発 12c (12.1.2) E48089-02 |
|
![]() 前 |
![]() 次 |
この章では、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では、匿名配列タイプはサポートされません。標準の 一部のメソッドは次の理由により使用できなくなりました。
このようなケースでは、標準APIを使用するようにコードを変更する必要があります。 |
次の各サンプル・コードでは、次のインタフェースを含むOracle拡張機能のインタフェースにアクセスする方法を示します。
Array - 「Arrayによるプログラミング」を参照してください。
Struct - 「Structによるプログラミング」を参照してください。
Ref - 「Refによるプログラミング」を参照してください。
BlobおよびClob - 「BlobとClobを使用したプログラミング」を参照してください。
WebLogic Serverとともにサーバーのサンプルをインストールするオプションを選択した場合は、JDBCサンプルで詳細なサンプル・コードを確認できます。詳細は、「JDBCサンプルとチュートリアル」を参照してください。
|
注意:
|
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では匿名配列タイプはサポートされないため、 |
行を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("");
}
|
注意: 整数の初期設定の戻り型は |
データベースで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();
|
注意:
|
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オブジェクトの操作方法を示すサンプル・コードについて説明します。
次のコードでは、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」を参照してください。
特定の状況下で、Oracle Thin Driverはバッチ・サイズに到達しない間、DBMSに更新を送信せず、文が閉じられるまで待機する場合があります。
プリペアド文を閉じると、WebLogic Serverは文を閉じずに標準JDBC状態に返します。続いて文を接続のプールに戻すため、次に必要な時に文を再配信できます。
すべての更新が確実に配信されるようにするには、文または接続を閉じる前に、文を最後に使用した後でOraclePreparedStatement.sendBatch()を明示的に呼び出す必要があります。