ヘッダーをスキップ
Oracle Database JDBC開発者ガイドおよびリファレンス
11gリリース1(11.1)
E05720-02
  目次
目次
索引
索引

戻る
戻る
次へ
次へ
 

3 JDBC標準のサポート

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標準のサポート

標準のJDBC 2.0の機能は、JDK 1.2とそれより後のバージョンでサポートされています。考慮すべき点が3つあります。

この項には、次の項目が含まれます。


注意:

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)ファイルに格納されています。

JDBC2.0 Standard Extension APIとオラクル社独自のパフォーマンス強化API

JDBC 2.0では、以前はOracle拡張機能として提供されていた次のパフォーマンス拡張要素を使用できます。

  • バッチ更新

  • フェッチ・サイズまたは行プリフェッチ

どちらの場合でも、標準モデルまたはOracleモデルを使用するオプションがあります。可能なかぎりJDBC標準モデルの使用をお薦めします。ただし、これらの機能のために、単一のアプリケーション内で標準モデルとOracleモデルを同時に使用しないでください。

JDBC 3.0標準のサポート

標準の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例外がスローされます。

セーブポイントの解放

セーブポイントを削除するには、Connection.releaseSavepoint(Savepoint svpt)メソッドを使用します。

セーブポイント・サポートのチェック

使用中のデータベースでセーブポイントがサポートされているかどうかを調べるには、oracle.jdbc.OracleDatabaseMetaData.supportsSavepointsメソッドをコールします。セーブポイントが使用可能な場合はtrue、そうでない場合はfalseが戻されます。

セーブポイントに関する注意事項

セーブポイントを使用する場合は、次の点に注意する必要があります。

  • セーブポイントの解放後、ロールバック操作でそのセーブポイントを参照しようとすると、SQLException例外がスローされます。

  • トランザクションがコミットまたはロールバックされると、そのトランザクション内の作成済セーブポイントはすべて自動的に解放され、無効になります。

  • あるセーブポイントまでトランザクションをロールバックすると、そのセーブポイントより後に作成されたセーブポイントはすべて自動的に解放され、無効化されます。

自動生成キーの取出し

多くのデータベース・システムでは、行が挿入される際に一意のキー・フィールドが自動的に生成されます。Oracle Databaseでは、順序とトリガーにより、この機能が提供されます。JDBC 3.0には、自動生成キーの取出し機能が導入され、生成された値を取り出せるようになりました。JDBC 3.0では、自動生成キーの取出し機能をサポートするために、次のインタフェースが拡張されました。

  • java.sql.DatabaseMetaData

  • java.sql.Connection

  • java.sql.Statement

これらのインタフェースには、自動生成キーの取出しをサポートするメソッドが用意されています。ただし、この機能はINSERT文が処理される場合にのみサポートされます。その他のデータ操作言語(DML)文の処理では、自動生成キーの取出しは実施されません。


注意:

Oracleのサーバー側内部ドライバでは、自動生成キーの取出し機能をサポートしていません。

java.sql.Statement

キー列を明示的に指定しないと、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オブジェクトが作成されます。

制限事項

自動生成キーはDMLリターニング句を使用して実装されます。このため、次の制限事項があります。

  • 自動生成キーとバッチ更新を組み合せることはできません。

  • getGeneratedKeysメソッドから戻されるResultSetオブジェクトには位置によってのみアクセスする必要があります。ResultSetオブジェクトの列としてはバインド変数名を使用しないでください。

JDBC 3.0のLOBインタフェース・メソッド

表3-2および表3-3に、Oracle独自のメソッドとJDBC 3.0標準メソッドとの間の変換を示します。

表3-2 等価のBLOBメソッド

Oracle独自のメソッド JDBC 3.0標準メソッド

putBytes(long pos, byte [] bytes)

setBytes(long pos, byte[] bytes)

putBytes(long pos, byte [] bytes, int length)

setBytes(long pos, byte[] bytes, int offset, int len)

getBinaryOutputStream(long pos)

setBinaryStream(long pos)

trim (long len)

truncate(long len)


表3-3 等価のCLOBメソッド

Oracle独自のメソッド JDBC 3.0標準メソッド

putString(long pos, String str)

setString(long pos, String str)

該当なし

setString(long pos, String str, int offset, int len)

getAsciiOutputStream(long pos)

setAsciiStream(long pos)

getCharacterOutputStream(long pos)

setCharacterStream(long pos)

trim (long len)

truncate(long len)


結果セットの保持機能

JDBC 3.0から結果セット保持機能が導入されました。この機能を使用すると、コミット操作の実行時にResultSetオブジェクトをオープンするか、クローズするかをアプリケーションで決定できます。コミット操作は、暗黙的または明示的に実行できます。

Oracle Databaseでサポートしているのは、HOLD_CURSORS_OVER_COMMITのみです。したがって、これが、Oracle JDBCドライバのデフォルト値です。保持機能を変更しようとすると必ず、SQLException例外がスローされます。

JDBC 4.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つのメソッドが提供されています。

SQLデータを表すものを除く他のJDBC4.0インタフェースはすべてこのインタフェースを実装しています。これには、ConnectionStatementとそのサブタイプ、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オブジェクトは、次の場合にも有効なことがあります。

DatabaseMetaData.getRowIdLifetimeメソッドをコールすると、RowIDオブジェクトの存続期間を特定できます。

LOBの作成

JDBC 4.0では、BLOBCLOBおよびNCLOBオブジェクトの作成をサポートするために、Connectionインタフェースが機能拡張されています。このインタフェースでサポートされているcreateBlobcreateClobおよびcreateNClobメソッドを使用すると、BlobClobおよびNClobオブジェクトを作成できます。

作成されたLOB(Large OBject)にデータは含まれません。適切なsetXXXメソッドをコールすると、これらのオブジェクト内にデータを追加できます。これらのオブジェクトからデータを取り出すには、ResultSetおよびCallableStatementインタフェースで定義されているgetBlobgetClobおよび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);
...

setBlobsetClobおよびsetNClobメソッドを使用して、PreparedStatementオブジェクトにLOBを入力パラメータとして渡すこともできます。updateBlobupdateClobおよびupdateNClobメソッドを使用すると、更新可能結果セット内の列値を更新できます。

LOBは、作成元のトランザクションの期間中は少なくとも有効です。ただし、トランザクションの実行期間が長いと、メモリーの使用が保証されない場合があります。次のようにLOBのfreeメソッドをコールすると、LOBを解放できます。

...
Clob aClob = con.createClob();
int numWritten = aClob.setString(1, val);
aClob.free();
...

各国語キャラクタ・セットのサポート

JDBC 4.0では、各国語キャラクタ・セットの型にアクセスするためのNCHARNVARCHARLONGNVARCHARおよびNCLOBというJDBC型が導入されています。これらの型は、各国語キャラクタ・セットを使用して値がエンコードされる点を除き、CHARVARCHARLONGVARCHARおよびCLOB型に類似しています。