Oracle Java Database Connectivity(JDBC)ドライバでは、様々なバージョンのJDBC標準機能をサポートしています。Oracle Database 11gリリース1(11.1)では、JDBC 4.0標準をサポートするために、Oracle JDBCドライバが機能拡張されています。これらの機能は、oracle.jdbcおよびoracle.sqlパッケージに用意されています。これらのパッケージでは、Java Development Kit(JDK)リリース1.5および1.6をサポートしています。この章では、Oracle JDBCドライバでサポートされているJDBC標準について説明します。次の項があります。
標準のJDBC 2.0の機能は、JDK 1.2とそれより後のバージョンでサポートされています。考慮すべき点が3つあります。
オブジェクト、配列、ラージ・オブジェクト(LOB)などのデータ型に対するサポート。このサポートは、標準java.sqlパッケージを介して処理されます。
結果セット拡張やバッチ更新などの標準機能に対するサポート。このサポートは、JDK 1.2.x以上では、Connection、ResultSetおよびPreparedStatementなどの標準オブジェクトを介して処理されます。
JDBC 2.0 Optional Packageの機能など、Standard Extension Application Program Interface(API)とも呼ばれる拡張機能に対するサポート。たとえばデータソース、接続プーリングおよび分散トランザクションなどがあげられます。
この項には、次の項目が含まれます。
|
注意: 1.5より前のJDKのバージョンは、もうサポートされていません。oracle.jdbc2パッケージは削除されました。 |
Oracle JDBCは、標準java.sqlパッケージ内のインタフェースの実装による標準JDBC 2.0機能を含む、JDK 1.5およびJDK 1.6を完全にサポートしています。これらのインタフェースは、oracle.sqlパッケージとoracle.jdbcパッケージ内のクラスによって、適宜実装されます。
ojdbc5.jarのJDBCクラスを使用するJDK 1.5環境では、スクロール可能結果セット、更新可能結果セット、バッチ更新などのJDBC 2.0機能は、標準のJDBC 2.0インタフェースによって指定されたメソッドを介してサポートされます。
データソース、接続プーリングおよび分散トランザクションなどのJDBC 2.0 Optional Packageの各機能は、JDK 1.2.x以上の環境でサポートされます。
標準javax.sqlパッケージとそのインタフェースを実装するクラスは、Oracle Databaseでパッケージ化されたJavaアーカイブ(JAR)ファイルに格納されています。
標準のJDBC 3.0の機能は、JDK 1.4とそれより後のバージョンでサポートされています。表3-1に、Oracle Database 11gリリース1(11.1)でサポートしているJDBC 3.0機能をリストし、各機能に関する詳細の参照先を示します。
表3-1 JDBC 3.0機能の主な領域
| 機能 | コメントと参照 |
|---|---|
|
トランザクション・セーブポイント |
詳細は、「トランザクション・セーブポイント」を参照してください。 |
|
文キャッシュ |
接続プーリングによってコンパイルされたSQL文を再使用します。第20章「文キャッシュと結果セット・キャッシュ」を参照してください。 |
|
ローカル・トランザクションとグローバル・トランザクションの切替え |
「ローカル・トランザクションとグローバル・トランザクションの切替え」を参照してください。 |
|
LOBの変更 |
「JDBC 3.0のLOBインタフェース・メソッド」を参照してください。 |
|
名前付きSQLパラメータ |
「インタフェースoracle.jdbc.OracleCallableStatement」および「インタフェースoracle.jdbc.OraclePreparedStatement」を参照してください。 |
|
RowSet |
第18章「JDBC RowSet」を参照してください。 |
|
自動生成キーの取出し |
「自動生成キーの取出し」を参照してください。 |
|
結果セットの保持機能 |
「結果セットの保持機能」を参照してください。 |
この項では、Oracle JDBCドライバによってサポートされている次のJDBC 3.0機能について説明します。
JDBC 3.0仕様では、セーブポイントがサポートされます。このセーブポイントによって、トランザクション内で境界をより細かく設定できます。アプリケーションで、トランザクション内にセーブポイントを設定すると、そのセーブポイント以降に実行したすべての作業をロールバックできます。セーブポイントによって、トランザクションの原子性が緩和されます。セーブポイントを設定したトランザクションは、トランザクションのコンテキスト外では1単位としてみなされるという点で原子的ですが、そのトランザクション内で動作するコードは部分的な状態を保持できます。
|
注意: セーブポイントがサポートされるのは、ローカル・トランザクションのみです。グローバル・トランザクション内でセーブポイントを指定すると、SQLException例外が発生します。 |
セーブポイントを作成するには、java.sql.Savepointインスタンスを戻すConnection.setSavepointを使用します。
セーブポイントには名前がある場合とない場合があります。セーブポイントの名前を指定するには、setSavepointメソッドに文字列を指定します。名前が未指定の場合は、整数のIDが割り当てられます。名前の取出しにはgetSavepointNameメソッドを使用します。IDの取出しにはgetSavepointIdメソッドを使用します。
|
注意: 名前付けされていないセーブポイントから名前を取り出そうとしたり、名前付けされているセーブポイントからIDを取り出そうとすると、SQLException例外がスローされます。 |
セーブポイントまでロールバックするには、Connection.rollback(Savepoint svpt)メソッドを使用します。解放されているセーブポイントまでロールバックしようとすると、SQLException例外がスローされます。
多くのデータベース・システムでは、行が挿入される際に一意のキー・フィールドが自動的に生成されます。Oracle Databaseでは、順序とトリガーにより、この機能が提供されます。JDBC 3.0には、自動生成キーの取出し機能が導入され、生成された値を取り出せるようになりました。JDBC 3.0では、自動生成キーの取出し機能をサポートするために、次のインタフェースが拡張されました。
java.sql.DatabaseMetaData
java.sql.Connection
java.sql.Statement
これらのインタフェースには、自動生成キーの取出しをサポートするメソッドが用意されています。ただし、この機能はINSERT文が処理される場合にのみサポートされます。その他のデータ操作言語(DML)文の処理では、自動生成キーの取出しは実施されません。
|
注意: Oracleのサーバー側内部ドライバでは、自動生成キーの取出し機能をサポートしていません。 |
キー列を明示的に指定しないと、Oracle JDBCドライバでは取り出す列を特定できません。特定できるのは、列名または列索引の配列が使用されている場合です。ただし、int型のStatement.RETURN_GENERATED_KEYSフラグが使用されている場合、Oracle JDBCドライバではこれらの列を特定できません。int型フラグを使用して自動生成キーが戻るように指定した場合は、ROWID擬似列がキーとして戻ります。このROWIDは、ResultSetオブジェクトからフェッチして、他の列を取り出すために使用できます。
次のコードは、自動生成キーの取出しを示しています。
/** SQL statements for creating an ORDERS table and a sequence for generating the
* ORDER_ID.
*
* CREATE TABLE ORDERS (ORDER_ID NUMBER, CUSTOMER_ID NUMBER, ISBN NUMBER,
* DESCRIPTION NCHAR(5))
*
* CREATE SEQUENCE SEQ01 INCREMENT BY 1 START WITH 1000
*/
...
String cols[] = {"ORDER_ID", "DESCRIPTION"};
// Create a PreparedStatement for inserting a row into the ORDERS table.
OraclePreparedStatement pstmt = (OraclePreparedStatement)
conn.prepareStatement("INSERT INTO ORDERS (ORDER_ID, CUSTOMER_ID, ISBN, DESCRIPTION) VALUES (SEQ01.NEXTVAL, 101,
966431502, ?)", cols);
char c[] = {'a', '\u5185', 'b'};
String s = new String(c);
pstmt.setNString(1, s);
pstmt.executeUpdate();
ResultSet rset = pstmt.getGeneratedKeys();
...
この例では、ORDER_ID列の値を生成するために、順序SEQ01が作成されます。この値は1000から開始され、次の値は、順序の処理ごとに1ずつ増分して生成されます。また、ORDERS表に行を挿入するOraclePreparedStatementオブジェクトが作成されます。
表3-2および表3-3に、Oracle独自のメソッドとJDBC 3.0標準メソッドとの間の変換を示します。
表3-2 等価のBLOBメソッド
| Oracle独自のメソッド | JDBC 3.0標準メソッド |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
表3-3 等価のCLOBメソッド
| Oracle独自のメソッド | JDBC 3.0標準メソッド |
|---|---|
|
|
|
|
該当なし |
|
|
|
|
|
|
|
|
|
JDBC 4.0標準は、JDK 1.6以降のバージョンでサポートされています。Oracle Database 11gリリース1(11.1)のJDBCドライバでは、JDBC 4.0標準がサポートされています。
|
注意: JDBC 4.0を標準サポートするには、classpath環境変数でojdbc6*.jarを指定しておく必要があります。 |
Oracle Database 11gリリース1(11.1)のJDBCドライバでは、次のような新機能を利用できます。
このドキュメントでは、これら新機能の概要のみを示します。これらの機能の詳細は、次のサイトの『Java 2 Platform, Standard Edition (JSE) 6.0 specification』を参照してください。
http://java.sun.com/javase/6/docs/
ラッパー・パターンのサポート
ラッパー・パターンは、Javaアプリケーションで使用される一般的なコーディング・パターンで、データ・ソース固有の従来のJDBC APIを超える機能を提供します。実際のリソースを表すプロキシ・クラス・インスタンスとしてラップされているリソースにアクセスする場合に、これらの拡張機能を使用する必要があることがあります。JDBC4.0では、リソース代理への直接アクセスを許可するために、プロキシによって表されるこれらのラップされたリソースにアクセスするための標準メカニズムを記述するWrapperインタフェースが導入されています。
Wrapperインタフェースでは、次の2つのメソッドが提供されています。
public boolean isWrapperFor(Class<?> iface) throws SQLException;
public <T> T unwrap(Class<T> iface) throws SQLException;
SQLデータを表すものを除く他のJDBC4.0インタフェースはすべてこのインタフェースを実装しています。これには、Connection、Statementとそのサブタイプ、ResultSetおよびメタデータ・インタフェースが含まれます。
機能拡張された例外階層とSQLException
JDBC 3.0では、SQLExceptionという単一の例外しかサポートされていません。ただし、エラーは、カテゴリが多く存在しているので、簡単に分類できます。この機能では、様々なカテゴリのエラーを特定するために、SQLExceptionクラスのサブクラスがサポートされています。永続エラーと一時エラーの切分けが、主要な切分けになります。永続エラーは、システムの正しい動作の結果であり、常に発生します。一時エラーは、タイムアウトなど、システムの一部で障害が発生した結果であり、再発しない場合もあります。
一時エラー、永続エラーおよびそれらエラーの様々なカテゴリを表現するために、新しい例外が追加されています。
また、SQLExceptionクラスとそのサブクラスは、J2SE関連の例外機能をサポートするために機能拡張されています。
ROWIDデータ型
JDBC 4.0では、SQLのROWID値を表現するために、java.sql.RowIdデータ型がサポートされています。ResultSetインタフェースおよびCallableStatementインタフェースで定義されているgetterメソッドを使用すると、RowId値を取り出すことができます。開発者は、パラメータ化されたPreparedStatementの中でRowId値を使用して、RowIdオブジェクトのパラメータを設定したり、更新可能な結果セットの中で使用して、列を特定のRowId値に更新したりできます。
RowIdオブジェクトは、指定された行が削除されるまで有効です。RowIdオブジェクトは、次の場合にも有効なことがあります。
作成元トランザクションの期間中。
作成元セッションの期間中。
RowIdオブジェクトが永続的に有効である期間(未定義)。
DatabaseMetaData.getRowIdLifetimeメソッドをコールすると、RowIDオブジェクトの存続期間を特定できます。
LOBの作成
JDBC 4.0では、BLOB、CLOBおよびNCLOBオブジェクトの作成をサポートするために、Connectionインタフェースが機能拡張されています。このインタフェースでサポートされているcreateBlob、createClobおよびcreateNClobメソッドを使用すると、Blob、ClobおよびNClobオブジェクトを作成できます。
作成されたLOB(Large OBject)にデータは含まれません。適切なsetXXXメソッドをコールすると、これらのオブジェクト内にデータを追加できます。これらのオブジェクトからデータを取り出すには、ResultSetおよびCallableStatementインタフェースで定義されているgetBlob、getClobおよびgetNClobメソッドをコールします。これらのオブジェクトからは、内容の全体または一部を取り出すことができます。次のコードでは、BLOBオブジェクトのオフセット200の位置から100バイトのデータを取り出す方法を示しています。
... Connection con = DriverManager.getConnection(url, props); Blob aBlob = con.createBlob(); // Add data to the BLOB object. ... // Retrieve part of the data from the BLOB object. InputStream is = aBlob.getBinaryStream(200, 100); ...
setBlob、setClobおよびsetNClobメソッドを使用して、PreparedStatementオブジェクトにLOBを入力パラメータとして渡すこともできます。updateBlob、updateClobおよびupdateNClobメソッドを使用すると、更新可能結果セット内の列値を更新できます。
LOBは、作成元のトランザクションの期間中は少なくとも有効です。ただし、トランザクションの実行期間が長いと、メモリーの使用が保証されない場合があります。次のようにLOBのfreeメソッドをコールすると、LOBを解放できます。
... Clob aClob = con.createClob(); int numWritten = aClob.setString(1, val); aClob.free(); ...
各国語キャラクタ・セットのサポート
JDBC 4.0では、各国語キャラクタ・セットの型にアクセスするためのNCHAR、NVARCHAR、LONGNVARCHARおよびNCLOBというJDBC型が導入されています。これらの型は、各国語キャラクタ・セットを使用して値がエンコードされる点を除き、CHAR、VARCHAR、LONGVARCHARおよびCLOB型に類似しています。