プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle WebLogic Server JDBCアプリケーションの開発
12c (12.2.1.3.0)
E90331-01
目次へ移動
目次

前
次

7 JDBCドライバでのAPI拡張機能の使い方

API拡張機能の使用およびOracle Thin Driverでのバッチ処理など、サードパーティのJDBCドライバを構成および使用する方法について説明します。

JDBCインタフェースのAPI拡張機能の使い方

WebLogic Serverには、Oracle JDBCタイプの新しいインタフェースが実装されています。新しいインタフェースおよび非推奨のOracle具象クラスへのマップ方法について説明します。
JDBCドライバで公開されている拡張機能メソッドを使用するには、アプリケーション・コードに次のような手順を組み込む必要があります。
  • データ・ソースでの接続の作成に使用するJDBCドライバから、ドライバ・インタフェースをインポートします。

  • データ・ソースから接続を取得します。

  • 接続オブジェクトをベンダーの接続インタフェース型にキャストします。

  • ベンダーのドキュメントで説明されているとおりにAPI拡張機能を使用します。

  • ルックアップの失敗を捕捉するためにJNDIルックアップをtry/catchブロックでラップし、コンテキストをfinallyブロックで閉じるようにします。

次の各項では、API拡張機能の使用方法およびサポートしているサンプル・コードについて説明します。特定のJDBCドライバの特定の拡張機能メソッドについては、JDBCドライバ・ベンダーのドキュメントを参照してください。

JDBCインタフェースのAPI拡張機能へのアクセス方法を示すサンプル・コード

以下のサンプル・コードでは、Oracle Thin Driverで利用できる拡張機能メソッドを使用して、JDBCのAPI拡張機能の使用方法を示します。使用するJDBCドライバで公開されているメソッドに合わせて、これらの例を修正することができます。

API拡張機能へアクセスするパッケージをインポートする

データ・ソースでの接続の作成に使用する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;

API拡張機能を使用する

次のコードでは、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;
. . .

Oracle JDBCタイプでのAPI拡張機能の使用

WebLogic Serverには、Oracle JDBCタイプの新しいインタフェースが実装されています。新しいインタフェースおよび非推奨のOracle具象クラスへのマップ方法について説明します。

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文の置換は、findsedを使用するスクリプトで実行できます。例:

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を使用するようにコードを変更する必要があります。

JDBCインタフェースのOracle Thin Driver拡張機能にアクセスするサンプル・コード

次の各サンプル・コードでは、次のインタフェースを含むOracle拡張機能のインタフェースにアクセスする方法を示します。

WebLogic Serverとともにサーバーのサンプルをインストールするオプションを選択した場合は、JDBCサンプルで詳細なサンプル・コードを確認できます。詳細は、JDBCサンプルとチュートリアルを参照してください。

注意:

ArrayStructおよびRefはサーバー側アプリケーションのみで使用できます。非推奨のJDBC over RMIインタフェースを使用して、リモート・クライアントでこれらにアクセスすることはできません。

Arrayによるプログラミング

WebLogic Serverのサーバー側アプリケーションでは、結果セット、またはJava配列として呼出し可能文を使用することにより、Oracle Collection (SQL Array)を実体化できます。

ArrayをWebLogic Serverアプリケーションで使用するには、次の手順に従います。

  1. 必要なクラスをインポートします。
  2. 接続を取得して、接続のための文を作成します。
  3. Arrayタイプおよびそのタイプを使用する表を作成し、その表に、配列を含むいくつかの行を作成します。
  4. 結果セット、または呼出し可能文を使用してArrayを取得します。
  5. 標準Javaメソッド(java.sql.Arrayとして使用)、またはOracle拡張機能メソッド(java.jdbc.OracleArrayにキャスト)を使用してデータを操作します。

Oracle拡張機能へアクセスするパッケージをインポートする

この例で使用する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();

データベースでArrayを作成する

最初に配列タイプ、およびそのタイプを使用する表を作成する必要があります。例:

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();

Arrayを取得する

呼出し可能文、または結果セットに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です。ArrayOracleArrayにキャストし、Oracle拡張機能メソッドgetIntArray()を使用して整数値を戻すことができます。

データベースでArrayを更新する

データベースでArrayを更新するには、次の手順に従います。

  1. データベースで配列を作成します。「データベースでArrayを作成する」を参照してください。
  2. プリペアド文または呼出し可能文に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();
    

Oracle Array拡張機能メソッドを使用する

Arrayに対してOracle Thin Driver拡張機能メソッドを利用するには、まずこの配列をoracle.jdbc.OracleArrayにキャストします。これにより、標準のメソッドに加えて、Arrayに対してOracle Thin Driver拡張機能メソッドを呼び出せるようになります。例:

OracleArray oracleArray = (OracleArray)rs.getArray(3);
String sqltype = oracleArray.getSQLTypeName();

Structによるプログラミング

WebLogic Serverアプリケーションでは、Oracleデータベースからオブジェクトにアクセスしたり、オブジェクトを操作したりできます。Oracleデータベースからオブジェクトを検索したら、カスタムJavaオブジェクトまたはStruct (java.sql.Structあるいはoracle.jdbc.OracleStruct)のいずれかとしてオブジェクトをキャストできます。Structは、アプリケーション中のカスタム・クラスを置き換える構造化データを表す型制限の緩いデータ型です。JDBC APIにおけるStructインタフェースには、Struct中の属性値を操作するための様々なメソッドが組み込まれています。Oracleでは、追加メソッドを使用してStructインタフェースを拡張しています。

StructをWebLogic Serverアプリケーションで使用するには、次の手順に従います。

  1. 必要なクラスをインポートします。(「Oracle拡張機能へアクセスするパッケージをインポートする」を参照してください。)
  2. 接続を取得します。(「接続を確立する」を参照してください。)
  3. Structオブジェクト・タイプおよびそのオブジェクトを使用する表を作成し、Structオブジェクトを含む行を作成します。
  4. オブジェクトをStruct (標準のメソッドを使用する場合はjava.sql.Struct、標準のメソッドとOracle拡張機能メソッドを使用する場合はoracle.jdbc.OracleStruct)にキャストします。
  5. 標準メソッド、またはOracle Thin Driver拡張機能メソッドを使用して、データを操作します。

データベース・オブジェクトを作成する

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構造体を作成するときには、すべてのデータ型(ClobBlobStructRefArrayNClobおよびSQLXML)のラップを解除する必要があります。構造体を作成したら、構造体をアプリケーションに返す前に構造体を再度ラップする方法はありません。アプリケーションに返される構造体は、ラップ解除されたデータ型の値を持ちます。

Structの属性を取得する

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として戻されます。

OracleStruct拡張機能メソッドを使用する

StructにOracle Thin Driver拡張機能メソッドを使用する場合、java.sql.Struct (または元のgetObjectの結果)をoracle.jdbc.OracleStructにキャストする必要があります。StructOracleStructにキャストすると、標準メソッドと拡張機能メソッドの両方を使用できるようになります。例:

OracleStruct oracleStruct = 
  (OracleStruct)rs.getObject(2);
String n = oracleStruct.getSQLTypeName(); // Standard
oracle.jdbc.OracleTypeMetaData otmd =
  oracleStruct.getOracleMetaData();    // Extension

Structによってデータベース・オブジェクトを更新する

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を使用して、これが参照するオブジェクトを検証したり、更新したりできます。またRefを変更することにより、同じオブジェクト・タイプの別のオブジェクトを指示したり、null値を割り当てたりすることができます。

RefをWebLogic Serverアプリケーションで使用するには、次の手順に従います。

  1. 必要なクラスをインポートします。(「Oracle拡張機能へアクセスするパッケージをインポートする」を参照してください。)
  2. データベース接続を取得します。(「接続を確立する」を参照してください。)
  3. SQL文を使用してRefを作成します。
  4. 結果セット、または呼出し可能文を使用してRefを取得します。
  5. OracleRefにキャストすることでOracle拡張機能メソッドを使用します。
  6. データベースでRefを更新します。

データベースでRefを作成する

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)が作成され、RefRef列に挿入されます。Refは、T1の行を指します(最初の列の値は5)。

Refを取得する

アプリケーションで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を使用できます。

WebLogic OracleRef拡張機能メソッドを使用する

RefにOracle Thin Driver拡張機能メソッドを使用するには、RefOracleRefにキャストします。例:

OracleTypeMetaData mdata = ((OracleRef)ref). getOracleMetaData();

Ref値を更新する

Refを更新するには、PreparedStatementまたはCallableStatementを使用してRefが指示する位置を変更します。

プリペアド文を使用してRefが指示する位置を更新するには、次の基本手順に従います。

  1. 新しい位置を指示するRefを取得します。このRefを使用して、別のRefの値を置き換えます。
  2. SQLコマンドの文字列を作成して、既存のRefの位置を、別のRefの値で置き換えます。
  3. プリペアド文を作成、および実行します。

例:

//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の操作に関する項を参照してください。

データベースでBlobを作成する

次のコードでは、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を更新する

次のコードでは、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 UPDATEBlob値を更新できる必要があることに注意してください。

OracleBlob拡張機能メソッドを使用する

次のコードは、BlobOracleBlobにキャストして拡張機能メソッドを使用できるようにします。

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がサポートするメソッドにアクセスできるようになります。BLOB#freeTemporaryOracleBlob#freeで置き換える必要があります。

Clob値によるプログラミング

Clob値はBlob値と同様に使用できます。ただし、データがバイナリ配列ではなく文字列になります(setBytesのかわりにsetStringgetBlobのかわりにgetClob、およびgetBinaryStreamのかわりにgetCharacterStreamを使用します)。

プリペアド文を使用してClobを更新し、新しい値が以前の値より短い場合、Clobには更新中に明示的に置換されなかった文字が保持されます。たとえば、Clobの現在の値がabcdefghijの場合に、プリペアド文を使用してzxywClobを更新すると、Clobの値はzxywefghijになります。プリペアド文で更新された値を修正するには、dbms_lob.trimプロシージャを使用して、更新後に残った余分な文字を削除します。dbms_lob.trimプロシージャの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスのDBMS_LOBを参照してください。CLOB#freeTemporaryOracleClob#freeで置き換える必要があります。

LOBを使用したトランザクションの境界

LOBを使用する場合、トランザクションの境界を考慮する必要があります。たとえば、すべての読取り/書込みをトランザクション内の特定のLOBに転送します。

LOB領域のリカバリ

LOBが使用する領域を解放するには、lob.close()を呼び出す必要があります。ResultSetStatementまたはConnectionが閉じていると、これは自動的に行われません。Oracleデータベースのみの場合、他のセッションが解放されたメモリーを使用できるように、セッションでalter session set events '60025 trace name context forever';も実行する必要があります。

Opaqueオブジェクトによるプログラミング

ここでは、Opaqueオブジェクトを使用するユース・ケースについて説明します。

新しいOracleタイプ・インタフェースには、重要と見なされるメソッド、または標準のJDBC APIで利用できないメソッドのみがあります。oracle.sql.OPAQUEoracle.jdbc.OracleOpaqueに置き換えられました。新しいインタフェースには、オブジェクトとして値を取得するメソッド、およびメタデータおよびタイプ名を取得する2つのメタ情報メソッドのみがあります。他のOracleタイプ・インタフェース(oracle.jdbc.OracleStructjava.sql.Structを拡張し、oracle.jdbc.OracleArrayjava.sql.Arrayを拡張します)と異なり、oracle.jdbc.OracleOpaqueはJDBCインタフェースを拡張しません。

XMLTypeは再生データソースとともに動作せず、oracle.xdbパッケージはXMLTypeを広範に使用するため、このパッケージはApplication Continuity再生に使用できなくなりました。

Application Continuity (AC)とともに使用するには、変更する必要がある関連する非常に一般的な1つのユースケースがあります。SQLXMLの初期の使用方法では、次のXDB APIが使用されていました。

SQLXML sqlXml = oracle.xdb.XMLType.createXML(

((oracle.jdbc.OracleResultSet)resultSet).getOPAQUE("issue"));

oracle.xdb.XMLTypeoracle.sql.OPAQUEを拡張しているため、使用した場合はAC再生が無効になります。これは標準のJDBC APIに置き換える必要があります。

SQLXML sqlXml = resultSet.getSQLXML("issue");

JDeveloper JPublisher機能はリリース12.2.1から非推奨となり削除されました。この機能により生成されたコードには具象クラスが含まれ、前述のようにコードの書換えが必要です。ここで、その書換えについていくつかの追加のヒントを説明します。

MutableArray#toDatumOracleDataMutableArray.toJDBCObjectで置き換える必要があります。

MutableStruct#toDatumOracleDataMutableStruct.toJDBCObjectで置き換える必要があります。次に、新しいインタフェースを持つ追加クラスを示します。これらには対応するWLSインタフェースがなく、JDBCタイプにマッピングされません。

- -
oracle.sql.ORAData oracle.jdbc.OracleData
oracle.sql.ORADataFactory oracle.jdbc.OracleDataFactory
oracle.sql.OPAQUE oracle.jdbc.OracleOpaque
oracle.sql.NCLOB oracle.jdbc.OracleNClob
oracle.sql.BFILE oracle.jdbc.OracleBfile
oracle.sql.Datum java.lang.Objectの後、その他のインタフェース・タイプの場合はinstanceOfを使用します
oracle.jpub.runtime.MutableStruct oracle.jpub.runtime.OracleDataMutableStruct
oracle.jpub.runtime.MutableArray oracle.jpub.runtime.OracleDataMutableArray

Oracle Thin Driverでのバッチ処理の使用

特定の状況下で、Oracle Thin Driverはバッチ・サイズに到達しない間、DBMSに更新を送信せず、文が閉じられるまで待機する場合があります。プリペアド文を閉じると、WebLogic Serverは文を閉じずに標準JDBC状態に返します。続いて文を接続のプールに戻すため、次に必要な時に文を再配信できます。

すべての更新が確実に配信されるようにするには、文または接続を閉じる前に、文を最後に使用した後でOraclePreparedStatement.sendBatch()を明示的に呼び出す必要があります。

Oracle Thin Driverを使用したJavaセキュリティ・マネージャの使用

Oracle Thin Driverを使用したJavaセキュリティ・マネージャを使用して、アプリケーションのセキュリティ・ポリシーを作成する方法について説明します。

Javaセキュリティ・マネージャを有効化してOracle Thin Driverを使用する場合、java.policyファイルで権限を更新する必要があります。

  1. Oracle Technology Networkから、Oracle JDBC driver用のDemoのjarファイルをダウンロードします。
  2. ojdbc.policyファイルを確認します。このファイルでドライバに必要な権限を指定しています。
  3. これらの権限をサーバーを稼働するのに使用するポリシー・ファイルに追加します。たとえば、ojdbc.jarファイルには java.util.PropertyPermission "oracle.jdbc.*", "read";が必要です。