ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JDBCのプログラミング
11g リリース1 (10.3.6)
B60995-05
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

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

この章では、API拡張機能の使用、Oracle仮想プライベート・データベース、Oracle Thinドライバでのバッチ処理など、サードパーティのJDBCドライバを設定および使用する方法について説明します。


注意:

この後の項で示すweblogic.jdbc.vendor.oracle.*インタフェースは非推奨になりました。将来のWebLogic Serverリリースでは削除される場合があります。


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

Oracleを含む一部のデータベース・ベンダーでは、DBMSを使用するデータベースのデータを操作するための独自のメソッドが追加されています。これらのメソッドは、標準のJDBCインタフェースを拡張したものです。WebLogic Serverは、ベンダーのJDBCドライバでパブリック・インタフェースとして公開されているすべての拡張機能メソッドをサポートします。

JDBCドライバで公開されている拡張機能メソッドを使用するには、アプリケーション・コードに次のような手順を組み込む必要があります。

以降の節では、サンプル・コードで詳細を示します。特定の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インタフェースを使用します。

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;

API拡張機能を使用する

次のコードでは、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タイプでのAPI拡張機能の使用

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文の置換は、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メソッドもサポートされません。

一部のメソッドは次の理由により使用できなくなりました。

  • 標準のメソッドまたはパブリック・メソッドを使用して同じ結果を実現できます。

  • メソッドが非推奨のタイプを参照しています。

  • メソッドに重要な価値がありません。

このようなケースでは、標準APIを使用するようにコードを変更する必要があります。


Oracle Thinドライバでの非推奨API拡張機能の使い方

Oracle Thin Driverのほとんどの拡張機能では、「JDBCインタフェースのAPI拡張機能の使い方」で説明したような標準的な方法を使用できます。ただし、バージョン11.2.0.3よりも前では、Oracle Thinドライバで、以下のクラスの拡張機能メソッドに対するパブリック・インタフェースを提供していません。

WebLogic Serverでは、これらのクラスの拡張機能メソッドにアクセスするために、独自のインタフェースを提供しています。

以降の節では、これらの拡張機能のWebLogic Serverインタフェースを使用するためのサンプル・コードを示します。サポートされるメソッドのリストについては、「Oracle Thin Driver拡張機能インタフェースとサポートされるメソッドの表」を参照してください。詳細については、Oracleのドキュメントを参照してください。


注意:

このプロセスを使用すると、「Oracle Thin Driver拡張機能インタフェースとサポートされるメソッドの表」で示す拡張機能向けのWebLogic Serverインタフェースを使用できます。ただし、上記のインタフェースはすべて非推奨になっており、WebLogic Serverの今後のリリースで削除される予定です。


Oracle Thin Driver拡張機能を使用する際の特別な考慮事項

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オブジェクトを作成するために使用できます。

    • java.sql.Connection.createStruct(): Connection.createStruct()を使用してSQL構造体を作成するときには、すべてのデータ型(java.sql.Clobjava.sql.Blobjava.sql.Structjava.sql.Refjava.sql.Arrayjava.sql.NClob、およびjava.sql.SQLXML)のラップを解除する必要があります。構造体を作成したら、構造体をアプリケーションに返す前に構造体を再度ラップする方法はありません。アプリケーションに返される構造体は、ラップ解除されたデータ型の値を持ちます。

    • java.sql.Connection.createArrayOf(): SQL仕様では匿名の配列型が必要になります。配列を使用する前の名前を持つ配列型をデータベース内に作成します。クライアント側からは配列を作成できません。


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

以下のサンプル・コードでは、11.2.0.3よりも前の、パブリック・インタフェースとして利用できないOracle拡張機能に対するWebLogic Serverインタフェースにアクセスする方法を示します。次のようなインタフェースがあります。

WebLogic Serverと共にサーバー・サンプルをインストールするオプションを選択した場合は、JDBCサンプルの詳細なサンプル・コードを参照してください。JDBCサンプルは通常、WL_HOME\samples\server\src\examples\jdbcにあります。WL_HOMEはWebLogic Serverをインストールしたフォルダです。

ARRAYによるプログラミング

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

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

  1. 必要なクラスをインポートします。

  2. 接続を取得して、接続のための文を作成します。

  3. 結果セット、または呼出し可能文を使用してARRAYを取得します。

  4. ARRAYをjava.sql.Arrayまたはweblogic.jdbc.vendor.oracle.OracleArrayのいずれかとして使用します。

  5. 標準Javaメソッド(java.sql.Arrayとして使用)、またはOracle拡張機能メソッド(weblogic.jdbc.vendor.oracle.OracleArrayにキャスト)を使用して、データを操作します。

以下の節では、これらのアクションの詳細について説明します。


注意:

ARRAYはサーバー側アプリケーションでのみ使用できます。リモート・クライアント・アプリケーションではARRAYは使用できません。


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

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

ARRAYを取得する

呼出し可能文、または結果セットに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を更新する

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

  1. 更新する配列がデータベースにない場合、PL/SQLを使用してデータベースに配列を作成します。

  2. 結果セット、または呼出し可能文を使用してARRAYを取得します。

  3. Javaアプリケーション内の配列をjava.sql.Arrayまたはweblogic.jdbc.vendor.oracle.OracleArrayとして扱います。

  4. プリペアド文または呼出し可能文にsetArray()メソッドを使用して、データベース内の配列を更新します。例:

    String sqlUpdate = "UPDATE SCOTT." + tableName + " SET col1 = ?";
    conn  = ds.getConnection();
    pstmt = conn.prepareStatement(sqlUpdate);
    pstmt.setArray(1, array);
    pstmt.executeUpdate();
    

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

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

STRUCTによるプログラミング

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を使用する場合、次の制限があります。

  • STRUCTは、Oracle専用としてサポートされるデータ型。アプリケーション中でSTRUCTを使用するには、Oracle Thin Driverを使用して(通常はデータ・ソースを介して)データベースとやり取りします。

  • STRUCTはサーバー側アプリケーションでのみ使用できます。クライアント・アプリケーションではSTRUCTは使用できません。


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

  1. 必要なクラスをインポートします。(「WebLogic Oracle拡張機能へアクセスするパッケージをインポートする」を参照。)

  2. 接続を取得します(「接続を確立する」を参照)。

  3. getObjectを使用してSTRUCTを取得します。

  4. STRUCTをSTRUCT (標準のメソッドを使用する場合はjava.sql.Struct、標準のメソッドとOracle拡張機能メソッドを使用する場合はweblogic.jdbc.vendor.oracle.OracleStruct)にキャストします。

  5. 標準メソッド、またはOracle Thin Driver拡張機能メソッドを使用して、データを操作します。

以下の節では、手順3 - 5について詳しく説明します。

STRUCTを取得する

データベース・オブジェクトを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にキャストすると、標準メソッドと拡張機能メソッドの両方を使用できるようになります。

WebLogic 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属性を取得する

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によってデータベース・オブジェクトを更新する

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属性を自動バッファリングする

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


注意:

REFを使用する場合、次の制限があります。

  • REFは、Oracleデータベースでのみ使用できます。アプリケーション中でREFを使用するには、Oracle Thin Driverを使用して(通常はデータ・ソースを介して)データベースとやり取りします。

  • REFはサーバー側アプリケーションでのみ使用できます。


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

  1. 必要なクラスをインポートします。(「WebLogic Oracle拡張機能へアクセスするパッケージをインポートする」を参照。)

  2. データベース接続を取得します(「接続を確立する」を参照)。

  3. 結果セット、または呼出し可能文を使用してREFを取得します。

  4. 結果をSTRUCT、またはJavaオブジェクトにキャストします。これにより、STRUCTメソッド、またはJavaオブジェクトのメソッドを使用して、データを操作できるようになります。

また、データベースでREF作成したり、更新したりできます。

手順3と4について以下の節で詳しく説明します。

REFを取得する

アプリケーションで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.Refweblogic.jdbc.vendor.oracle.OracleRefにキャストする場合に限り使用できます。

WebLogic 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値を更新する

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が指示する位置を更新するには、次の基本手順に従います。

  1. 新しい位置を指示するREFを取得します。このREFを使用して、別のREFの値を置き換えます。

  2. SQLコマンドの文字列を作成して、既存のREFの位置を、別のREFの値で置き換えます。

  3. プリペアド文を作成、および実行します。

例:

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

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

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)。

BLOBとCLOBを使用したプログラミング

この節では、OracleBlobインタフェースへのアクセス方法を示すサンプル・コードについて説明します。WebLogic Serverでサポートされるメソッドを使用している場合、この例で示す構文は、OracleBlobインタフェースで使用できます。「Oracle Thin Driverの拡張機能インタフェースとサポートされるメソッドの表」を参照してください。


注意:

BLOBおよびCLOB (「LOB」と呼ばれる)を使用する場合、トランザクションの境界を考慮する必要があります。たとえば、すべての読取り/書込みをトランザクション内の特定のLOBに転送します。詳細については、Oracle Webサイト(http://www.oracle.com)にあるOracleのドキュメントの「LOB Locators and Transaction Boundaries」を参照してください。


DBMSからBLOBロケータを選択する問合せを実行する

BLOBロケータまたはハンドルは、Oracle Thin Driver Blobへの参照です。

String selectBlob = "select blobCol from myTable where blobKey = 666"

WebLogic Server java.sqlオブジェクトを宣言する

次のコードでは、Connectionがすでに確立されていることを前提としています。

ResultSet rs = null; 
Statement myStatement = null; 
java.sql.Blob myRegularBlob = null; 
java.io.OutputStream os = null;

SQL例外ブロックを開始する

この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がサポートするメソッドにアクセスできます。

プリペアド文を使用したCLOB値の更新

プリペアド文を使用してCLOBを更新し、新しい値が以前の値より短い場合、CLOBには更新中に明示的に置換されなかった文字が保持されます。たとえば、CLOBの現在の値がabcdefghijの場合に、プリペアド文を使用してzxywでCLOBを更新すると、CLOBの値はzxywefghijになります。プリペアド文で更新された値を修正するには、dbms_lob.trimプロシージャを使用して、更新後に残った余分な文字を削除します。dbms_lob.trimプロシージャの詳細については、Oracleのドキュメントを参照してください。

さまざまなバージョンのWebLogic Serverクライアント/サーバー間におけるAPI拡張機能のサポート

一般に、WebLogic ServerはAPI拡張機能のサーバー側コードでの使用をサポートしています。API拡張機能をクライアント側コードで使用するには、オブジェクト型またはデータ型がシリアライズ可能でなければなりません。これに対する例外として、以下のオブジェクト型があります。

これらのオブジェクト型については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インタフェースは、クライアントまたはサーバーのバージョンに関係なくサポートされます。


Oracle Thin Driverの拡張機能インタフェースとサポートされるメソッドの表

以前のリリースの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

weblogic.jdbc.vendor.oracle.OracleArray

oracle.jdbc.OracleArray

weblogic.jdbc.vendor.oracle.OracleStruct

oracle.jdbc.OracleStruct

weblogic.jdbc.vendor.oracle.OracleRef

oracle.jdbc.OracleRef

weblogic.jdbc.vendor.oracle.OracleThinClob

oracle.jdbc.OracleBlob

weblogic.jdbc.vendor.oracle.OracleThinBlob

oracle.jdbc.OracleClob


Oracleインタフェースを以下の表に示します。また、標準JDBC (java.sql.*)インタフェースを拡張するためにOracle Thin Driver (またはこれらのメソッドをサポートする他のドライバ)で使用するメソッドのうち、サポートされているものについても示します。

表6-2 OracleConnectionインタフェース(非推奨)

拡張 メソッド・シグネチャ

weblogic.jdbc.vendor.oracle.OracleConnection

拡張

java.sql.Connectionの拡張

(このインタフェースは非推奨。)

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;

weblogic.jdbc.vendor.oracle.OracleConnection

拡張

java.sql.Connectionの拡張

(続き)

(このインタフェースは非推奨。)

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;

weblogic.jdbc.vendor.oracle.OracleConnection

拡張

java.sql.Connectionの拡張

(続き)

(このインタフェースは非推奨。)

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;

weblogic.jdbc.vendor.oracle.OracleConnection

拡張

java.sql.Connectionの拡張

(続き)

(このインタフェースは非推奨。)

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インタフェース(非推奨)

拡張 メソッド・シグネチャ

weblogic.jdbc.vendor.oracle.OracleStatement

拡張

java.sql.Statement

(このインタフェースは非推奨。)

String getOriginalSql() 
   throws java.sql.SQLException;
   (Removed in Oracle 11g.)

String getRevisedSql() 
   throws java.sql.SQLException;
   (Deprecated in Oracle 8.1.7, removed in Oracle 9i.)

boolean getAutoRefetch() 
   throws java.sql.SQLException;

boolean is_value_null(boolean b, int i) 
   throws java.sql.SQLException;

byte getSqlKind() 
   throws java.sql.SQLException;

int creationState() 
   throws java.sql.SQLException;

int getAutoRollback() 
   throws java.sql.SQLException;
   (Deprecated)

int getRowPrefetch() 
   throws java.sql.SQLException;

int getWaitOption() 
   throws java.sql.SQLException;
   (Deprecated)

int sendBatch() 
   throws java.sql.SQLException;

weblogic.jdbc.vendor.oracle.OracleStatement

拡張

java.sql.Statement

(このインタフェースは非推奨。)

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

void setRowPrefetch(int i) 
   throws java.sql.SQLException;

void setWaitOption(int i) 
   throws java.sql.SQLException;
   (Deprecated)

表6-4 OracleResultSetインタフェース(非推奨)

拡張 メソッド・シグネチャ

weblogic.jdbc.vendor.oracle.OracleResultSet

拡張

java.sql.ResultSetの拡張

(このインタフェースは非推奨。)

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インタフェース(非推奨)

拡張 メソッド・シグネチャ

weblogic.jdbc.vendor.oracle.OracleCallableStatement

拡張

java.sql.CallableStatementの拡張

(このインタフェースは非推奨。)

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インタフェース(非推奨)

拡張 メソッド・シグネチャ

weblogic.jdbc.vendor.oracle.OraclePreparedStatement

拡張

OracleStatementおよびjava.sql.PreparedStatementの拡張

(このインタフェースは非推奨。)

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インタフェース(非推奨)

拡張 メソッド・シグネチャ

weblogic.jdbc.vendor.oracle.OracleArray

拡張

java.sql.Arrayの拡張

(このインタフェースは非推奨

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;

weblogic.jdbc.vendor.oracle.OracleArray

拡張

java.sql.Arrayの拡張

(続き)

(このインタフェースは非推奨。)

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インタフェース(非推奨)

拡張 メソッド・シグネチャ

weblogic.jdbc.vendor.oracle.OracleStruct

拡張

java.sql.Structの拡張

(このインタフェースは非推奨。)

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インタフェース(非推奨)

拡張 メソッド・シグネチャ

weblogic.jdbc.vendor.oracle.OracleRef

拡張

java.sql.Refの拡張

(このインタフェースは非推奨。)

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インタフェース(非推奨)

拡張 メソッド・シグネチャ

weblogic.jdbc.vendor.oracle.OracleThinBlob

拡張

java.sql.Blobの拡張

(このインタフェースは非推奨。)

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インタフェース(非推奨)

拡張 メソッド・シグネチャ

weblogic.jdbc.vendor.oracle.OracleThinClob

拡張

java.sql.Clobの拡張

(このインタフェースは非推奨。)

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でのバッチ処理の使用

特定の状況下で、Oracle Thin Driverはバッチ・サイズに到達しない間、DBMSに更新を送信せず、文が閉じられるまで待機する場合があります。

プリペアド文を閉じると、WebLogic Serverは文を閉じずに標準JDBC状態に返します。続いて文を接続のキャッシュに戻すため、次に必要な時に文を再配信できます。

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

Oracle仮想プライベート・データベースを使用したプログラミング

Oracle仮想プライベート・データベース(Oracle Virtual Private Database: VPD)は、サーバーによって強制されるアプリケーション定義のファイン・グレイン・アクセス制御と、Oracleデータベース・サーバーのセキュアなアプリケーション・コンテキストを組み合わせたものです。WebLogic ServerアプリケーションでVPDを使用するには、以下の手順に従います。

  1. WebLogic Server構成でOracle Thinドライバを使用するJDBCデータ・ソースを作成します。Oracle WebLogic Server管理コンソール・ヘルプの第2章「アプリケーションでのWebLogic JDBCの使用」または「JDBCデータ・ソースの作成」を参照してください。


    注意:

    XA対応のJDBCドライバを使用している場合、KeepXAConnTillTxComplete=trueに設定する必要があります。Oracle WebLogic Server管理コンソール・ヘルプ「JDBCデータ・ソース: 構成: 接続プール」を参照してください。


  2. アプリケーションで次のコードを実行します。

    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 VPDの使用

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