ヘッダーをスキップ
Oracle® Database JDBC開発者ガイド
12cリリース1 (12.1)
B71308-02
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

14 LOBとBFILEの操作

この章では、データ・インタフェースまたはロケータ・インタフェースのいずれかを使用して、ラージ・オブジェクト(LOB)にアクセスし、操作するために、Java Database Connectivity(JDBC)を使用する方法について説明します。

以前のリリースでは、Oracle JDBCドライバには、Oracle Databaseで多くの操作を実行するために、標準JDBC型に対するOracle拡張機能が必要でした。JDBC 3.0ではOracle拡張機能を使用する必要が少なくなり、JDBC 4.0ではこの制限はほとんどなくなりました。java.sqlおよびjavax.sqlパッケージについてはJavasoft Javadocを、Oracle拡張機能の詳細はOracle JDBC Javadocを参照してください。

この章の内容は次のとおりです。

LOBデータ型

Oracle Database 10gより前には、LOBの最大サイズが2^32バイトでした。この制限は、Oracle Database 10gで削除されており、現在の最大サイズは使用可能な物理記憶域のサイズと同じです。


関連項目:

Oracle Database SecureFiles and Large Objects開発者ガイド

Oracle Databaseでは、次の4つのLOBデータ型をサポートします。

  • バイナリ・ラージ・オブジェクト(BLOB)

    このデータ型は、非構造バイナリ・データに使用されます。

  • キャラクタ・ラージ・オブジェクト(CLOB)

    このデータ型は、文字データに使用されます。

  • 各国語キャラクタ・ラージ・オブジェクト(NCLOB)

    このデータ型は、各国語文字データに使用されます。

  • BFILE

    このデータ型は、データベース表領域外の、オペレーティング・システム・ファイルに格納されるラージ・バイナリ・データ・オブジェクトに使用されます。

BLOB、CLOBおよびNCLOBは、データベース表領域に永続的に格納され、これらのデータ型に対する操作はすべて、トランザクション制御の下で実行されます。

BFILEは、Oracle独自のデータ型で、3次ストレージ・デバイス(ハード・ディスク、ネットワーク・マウント・ファイルシステム、CD-ROM、PhotoCDおよびDVDなど)上のデータベース表領域外にあるデータに読取り専用アクセスが可能です。BFILEデータは、トランザクション制御下にはなく、データベース・バックアップでは保存されません。

PL/SQL言語では、LOBデータ型がサポートされ、JDBCインタフェースにより、PL/SQLのプロシージャまたはファンクションへのINパラメータの引渡しや、OUTパラメータや戻り値の取出しが可能です。PL/SQLでは、LOBを含むすべてのデータ型に値セマンティクスを使用しますが、参照セマンティクスはBFILEに対してのみです。

Oracle SecureFile

Oracle Database 11gリリース1(11.1)では、LOBのまったく新しい記憶域としてOracle SecureFilesが導入されました。


関連項目:

Oracle Database SecureFiles and Large Objects開発者ガイド

Oracle SecureFilesの次の機能は、既存のAPIを介してJDBCプログラムで透過的に使用可能です。

  • SecureFile圧縮により、データを圧縮してディスク容量を節約できます。

  • SecureFile暗号化では、暗号化されたデータのランダムな読取りおよび書込みを可能にする新しい暗号化ツールが導入されました。

  • 重複では、Oracle Databaseの重複LOBデータが自動検出され、データを一部のみ保存することで容量が節約されます。

  • LOBデータ・パス・最適化には、記憶域レイヤーの上の論理キャッシュと新しいキャッシング・モードが含まれます。

  • 高いパフォーマンスの容量管理。

setLobOptionsおよびgetLobOptions APIについては『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。コール可能文を使用してJDBCからアクセスすることもできます。

Oracle SecureFilesの次の機能は、既存のAPIに対する更新により、データベース内で実装されます。

isSecureFileメソッド

BLOBまたはCLOBデータによってOracle SecureFile記憶域が使用されているかどうかをチェックできます。このチェックを行うには、oracle.jdbc.OracleBlobクラスまたはoracle.jdbc.OracleClobクラスの次のメソッドを使用します。

public boolean isSecureFile() throws SQLException

このメソッドからtrueが戻された場合、データはSecureFile記憶域を使用しています。

Oracle SecureFilesのゼロコピーI/O

Oracle Database 12cリリース1 (12.1)JDBCドライバの発表により、Oracle SecureFiles操作のパフォーマンスが大幅に向上しました。これは、Oracle Net Servicesで、バッファ管理を改善するためにゼロコピーI/Oフレームワークが使用されるようになったためです。

Oracle Database 11gリリース2では、新しい接続プロパティoracle.net.useZeroCopyIOが導入されました。このプロパティは、ゼロコピーI/Oプロトコルを有効または無効にするために使用できます。この接続プロパティは、定数OracleConnection.CONNECTION_PROPERTY_THIN_NET_USE_ZERO_COPY_IOとして定義されています。ゼロコピーI/Oフレームワークを無効にする場合は、この接続プロパティの値をfalseに設定してください。この接続プロパティのデフォルト値はtrueです。

LOBのデータ・インタフェース

この項の内容は次のとおりです。

効率的なメカニズム

Oracle Database 12cリリース1 (12.1) JDBCドライバでは、LOBの内容全体の書込みと読取りができる効率的なメカニズムを提供しています。これは、データ・インタフェースと呼ばれます。このデータ・インタフェースでは、標準JDBCメソッド(getStringsetBytesなど)を使用して、LOBデータの読取りと書込みを行います。多くの場合、これによってコーディングが簡素化され、処理が速くなります。標準のjava.sql.Blobjava.sql.Clobおよびjava.sql.NClobインタフェースと異なり、これにはランダム・アクセス機能はなく、LOBロケータを使用していないので、2147483648要素を超えるデータにはアクセスできません。

入力

Oracle Database 12cリリース1 (12.1)では、PreparedStatementsetBytessetBinaryStreamsetStringsetCharacterStreamおよびsetAsciiStreamメソッドが、BLOBCLOBおよびNCLOBターゲット列を処理する機能を強化するために拡張されています。


注意:

この強化は、読取り専用のBFILEデータには影響がありません。

JDBC Oracle Call Interface(OCI)とThinドライバには、byte配列やStringのサイズに制限はなく、ストリーム・ファンクションに指定された長さには、Java言語の制限を除けば、制限はありません。


注意:

Javaでは、配列サイズは正のJava intまたは2147483648要素に制限されています。

サーバー側内部ドライバについては、現在INSERT文などのSQL文の操作に32767バイトという制限があります。この制限はPL/SQL文には適用されません。INSERT文については、次のようにPL/SQLブロックにラップするという簡単な回避方法があります。

BEGIN
 INSERT id, c INTO clob_tab VALUES(?,?);
END;

大量のデータに対する次のような入力モードの自動切替えは留意する必要があります。

  • 次の3つの入力モードがあります。

    • 直接バインディグ

      このバインディングは、サイズに制限がありますが、最も効率的です。すべての入力列のデータを、サーバーに送信するデータのブロックにインラインで配置します。バッチの複数回実行を含め、すべてのデータは1回のネットワーク操作で送信されます。

    • ストリーム・バインディング

      このバインディングでは、データが最後に配置されます。バッチ・サイズは1つに制限され、完了に複数回のラウンドトリップが必要になる場合があります。

    • LOBバインディング

      このバインディングでは、一時LOBを作成し、データをLOBにコピーして、LOBロケータをバインドします。一時LOBは、実行後、自動的に解放されます。一時LOBを作成してから、LOBに書き込む操作には、複数回のラウンドトリップが必要です。ロケータの入力はバッチ処理されます。

  • SQL文の場合

    • setBytesおよびsetBinaryStreamメソッドでは、32767バイト未満のデータには直接バインディングを使用します。

    • setBytesおよびsetBinaryStreamメソッドでは、32767バイトを超えるデータにはストリーム・バインディングを使用します。

    • JDBC 4.0では、新しい形式のsetAsciiStreamsetBinaryStreamおよびsetCharacterStreamメソッドが導入されました。メソッドが長さとして長い引数を取る形式では、2147483648を超える長さにはLOBバインディングを使用します。長さを指定しない形式では、常にLOBバインディングを使用します。

    • setStringsetCharacterStreamおよびsetAsciiStreamメソッドでは、32767文字未満のデータには直接バインディングを使用します。

    • setStringsetCharacterStreamおよびsetAsciiStreamメソッドでは、32766文字を超えるデータにはストリーム・バインディングを使用します。

    • 新しい形式のsetCharacterStreamメソッドは、長さの引数としてlong引数を取り、JDBC 4.0では、2147483647を超える長さにLOBバインディングを使用します。長さを指定しない形式では、常にLOBバインディングを使用します。

  • PL/SQL文

    • setBytesおよびsetBinaryStreamメソッドでは、32767バイト未満のデータには直接バインディングを使用します。


      注意:

      基礎となるデータベースがOracle Databaseリリース10.xの場合、12cリリース1 (12.1) JDBCドライバを使用していても、データ・サイズ制限は32512バイトです。

    • setBytesおよびsetBinaryStreamメソッドでは、32766バイトを超えるデータにはLOBバインディングを使用します。

    • setStringsetCharacterStreamおよびsetAsciiStreamメソッドでは、データベース・キャラクタ・セットで32767バイト未満のデータには直接バインディングを使用します。


      注意:

      基礎となるデータベースがOracle Databaseリリース10.xの場合、12cリリース1 (12.1) JDBCドライバを使用していても、データ・サイズ制限は32512バイトです。

    • setStringsetCharacterStreamおよびsetAsciiStreamメソッドでは、データベース・キャラクタ・セットで32766バイトを超えるデータにはLOBバインディングを使用します。

大量データの入力モードの自動切替えは、一部のプログラムに影響を与えます。以前は、32766文字を超えるString値にsetStringを使用しようとすると、ORA-17157エラーが発生していました。現在は、ターゲット・パラメータの型に応じて、文の実行中にエラーが発生する場合と、操作が成功する場合があります。

もう1つの影響は、自動切替えの結果、パラメータの型の変更に適合させるために追加のサーバー側解析が実行される場合があることです。その結果、文が繰り返し実行されてデータ・サイズが制限の上下に変動すると、パフォーマンスに影響が生じます。ストリーム・モードへの切替えはバッチ処理にも影響を与えます。

LOBへの変換の強制

oracle.jdbc.OraclePreparedStatementインタフェースにあるsetBytesForBlobおよびsetStringForClobメソッドでは、すべてのデータ・サイズにLOBバインディングを使用します。

Oracle Database 10gリリース1のSetBigStringTryClob接続プロパティは、使用されなくなるか不要になりました。

出力

ResultSetおよびCallableStatementgetBytesgetBinaryStreamgetStinggetCharacterStreamおよびgetAsciiStreamメソッドは、BLOBCLOBおよびBFILE列またはOUTパラメータと連係するよう拡張されています。これらのメソッドは、2147483648未満の長さのすべてのLOBに機能します。


注意:

getStringメソッドとgetNStringメソッドを使用してBLOB列値を取得することはできません。getNStringメソッドの詳細は、「JDK 6での各国語キャラクタ・セット用の新しいメソッド」を参照してください。

データ・インタフェースはドライバ内でのLOBロケータへのアクセスにより動作し、アプリケーション・プログラミングに対して透過的に行われます。サポートされているすべてのバージョンのデータベース(Oracle Database 10.1.x以降)で機能します。Oracle Database 11gリリース1以降のバージョンでは、LOBのプリフェッチを使用して、必要なデータベース・ラウンドトリップを減らすかなくすことができます。詳細は、「LOBのプリフェッチ」を参照してください。

defineColumnTypeメソッドを使用して、BFILEデータの読取り、およびBLOBまたはCLOBデータの読取りと書込みを行うことができます。読み取るには、列に対してdefineColumnType(nn, Types.LONGVARBINARY)またはdefineColumnType(nn,Types.LONGVARCHAR)を使用します。これによって、ダイレクト・ストリームがデータに対してLONG RAWまたはLONG列であるかのように作成されます。この技術はOracle Database 10gリリース1(10.1)以降に限定されます。

CallableSatementとIN OUTパラメータ

PL/SQLの要件は、IN OUTパラメータの入力と出力に同じJava型を使用する必要があります。この章で説明した拡張機能による型の自動切替えが原因で、これに関して問題が発生する場合があります。

ストアド・プロシージャのIN OUT CLOBパラメータがあり、このパラメータの値を設定するためにsetStringを使用するとします。INおよびOUTパラメータについて、バインドを同じ型にする必要があります。データ・サイズが判明していないかぎり、入力モードの自動切替えによって問題が発生します。たとえば、入力データおよび出力データの両方が32766バイトを超えないことが判明している場合は、入力パラメータにsetStringメソッドを使用し、OUTパラメータをTypes.VARCHARとして登録し、出力パラメータにgetStringメソッドを使用できます。

よりよい解決方法は、ストアド・プロシージャを変更してINパラメータとOUTパラメータを個別にすることです。たとえば、次のストアド・プロシージャがあったとします。

CREATE PROCEDURE clob_proc( c IN OUT CLOB );

これを次のように変更します。

CREATE PROCEDURE clob_proc( c_in IN CLOB, c_out OUT CLOB );

もう1つの回避方法は、コンテナ・ブロックを使用してコールすることです。次のようにclob_procプロシージャをJava文字列でラップすると、prepareCall文に使用できます。

"DECLARE c_temp; BEGIN c_temp := ?; clob_proc( c_temp); ? := c_temp; END;"

どちらの場合でも、最初のパラメータにsetStringメソッドを使用し、2番目のパラメータにregisterOutParameterメソッドとTypes.CLOBを使用できます。

サイズの制限

非常に大きなbyte配列またはStringが作成されるために、Javaメモリー管理システムのパフォーマンスに影響が生じることに注意してください。Java仮想マシン(JVM)ベンダーが提供する情報を参照して、大量のデータ要素がメモリー管理に与える影響を理解し、かわりにストリーム・インタフェースを使用することを検討してください。

LOBロケータ・インタフェース

ロケータは少量データ構造体で、LOBの実際のデータへのアクセスに使用できる情報が格納されます。データベース表で、ロケータは表に直接格納されるのに対し、データはその表または別の記憶域に格納できます。大型のLOBの場合は、別の表領域を使用するのが一般的です。

JDBC 4.0では、LOBは、java.sql.Blobjava.sql.Clobおよびjava.sql.NClobインタフェースを使用して読込みまたは書込みを行います。これにより、LOBのデータにはランダム・アクセスできます。

Oracle実装クラスのoracle.sql.BLOBoracle.sql.CLOBおよびoracle.sql.NCLOBではロケータを格納し、それを使用してデータにアクセスします。oracle.sql.BLOBクラスとoracle.sql.CLOBクラスは、それぞれjava.sql.Blobインタフェースとjava.sql.Clobインタフェースを実装します。ojdbc6.jarでは、oracle.sql.NCLOBjava.sql.NClobを実装しますが、ojdbc5.jarでは、java.sql.Clobインタフェースを実装します。


注意:

Oracle Database 12cリリース1 (12.1)以降、oracle.sql.BLOBクラスおよびoracle.sql.CLOBクラスは非推奨となり、oracle.jdbc.OracleBlobインタフェースおよびoracle.jdbc.OracleClobインタフェースに置き換えられています。標準互換性には(可能であれば)java.sqlパッケージの使用可能なメソッドを使用し、Oracle固有の拡張機能にはoracle.jdbcパッケージの使用可能なメソッドを使用することをお薦めします。これらのインタフェースの詳細は、My Oracle Supportノート1364193.1を参照してください。

Oracle Database 12cリリース1 (12.1)では、Oracle JDBCドライバは、ojdbc6.jarおよびojdbc7.jarでJDBC 4.0 java.sql.NClobインタフェースをサポートしています。これらのファイルは、それぞれ、JDK 6(JRE 6とともに使用する必要があります)とJDK 7 (JRE 7とともに使用する必要があります)でコンパイルされます。

これに対し、oracle.sql.BFILEはOracle拡張機能で、対応するjava.sqlインタフェースはありません。


関連項目:

詳細は、JDBC Javadocを参照してください。

LOBのプリフェッチ

Oracle Database 12cリリース1 (12.1) JDBCドライバの場合、通常のフェッチ操作中にロケータとともにLOBデータの始めをプリフェッチするのと同様に、LOBの長さやチャンク・サイズなどのメタデータをプリフェッチすることで、ラウンドトリップの回数を減らします。LOB列を選択して結果セットに入れる場合、ロケータがフェッチされると、データの一部またはすべてをクライアントにプリフェッチできます。ロケータからフェッチするまで、前述の操作を保留することによって、最初のラウンドトリップを行わずにデータを取得します。


注意:

LOBのプリフェッチはLOBデータのサイズに反比例しています。つまり、プリフェッチの利点は小さなLOBの場合は大きく、大きなLOBの場合は小さくなります。

プリフェッチ・サイズは、BLOBの場合はバイトで、CLOBの場合は文字数で指定されます。接続プロパティoracle.jdbc.defaultLobPrefetchSizeを設定することで指定できます。このプロパティの値は、次の2つの方法でオーバーライドできます。

  • 文レベル: oracle.jdbc.OracleStatement.setLobPrefetchSize(int)メソッドを使用

  • 列レベル: 長さを引数として取るdefineColumnTypeメソッドの形式を使用

デフォルトのプリフェッチ・サイズは4000です。


注意:

大型LOBのプリフェッチ・サイズを、行プリフェッチ・サイズや多数のLOB列と一緒に設定するときには、予想されるメモリー消費に注意してください。


関連項目:

詳細は、JDBC Javadocを参照してください。

JDBC 4.0の新しいLOB API

Oracle Database 11gリリース1では、java.sql.NClobインタフェースが導入されました。Oracleドライバが、ojdbc6.jarojdbc7.jaroracle.sql.NCLOBおよびjava.sql.NCLOBインタフェースを実装します。

Oracleドライバにより、新しいファクトリ・メソッドcreateBlobcreateClobおよびcreateNClobが、一時LOBを作成するためにjava.sql.Connectionインタフェースで実装されます。

JDK 6から、java.sql.Blobjava.sql.Clobおよびjava.sql.NClobインタフェースに、LOBを解放し、関連付けられたリソースを解放する新しいfreeメソッドが導入されました。Oracleドライバはこのメソッドを使用して、一時LOBを解放します。

一時LOBの使用

一時LOBは、一時データの格納に使用できます。データは、通常の表領域ではなく、一時表領域に格納されます。不要になった一時LOBは解放する必要があります。解放しない場合、LOBによって使用されている一時表領域は再生されません。

一時LOBは、表に挿入できます。挿入すると、LOBの永続的なコピーが作成されて格納されます。


注意:

一時LOBを挿入する方が便利な場合があります。たとえば、LOBデータが相対的に小さい場合は、空のロケータを取り出すデータベース・ラウンドトリップのコストに比べて、データをコピーするオーバーヘッドが小さくなります。データは、最初はサーバーの一時表領域に格納され、その後永続記憶域に移されるためです。

一時LOBは、oracle.sql.BLOBクラスとoracle.sql.CLOBクラスの両方で定義されているstaticメソッドcreateTemporaryで作成します。一時LOBを解放するには、freeTemporaryメソッドを使用します。

JDBC 4.0で利用できる接続ファクトリ・メソッドを使用することにより、一時LOB/CLOBまたはNCLOBを作成することもできます。詳細は、「LOBの作成」を参照してください。

isTemporaryメソッドをコールすることで、LOBが一時LOBかどうかをテストできます。LOBがcreateTemporaryメソッドをコールして作成された場合、isTemporaryメソッドは、trueを戻し、それ以外の場合はfalseを戻します。

一時LOBを解放するには、freeTemporaryメソッドをコールします。セッションまたはコールを終了する前に、一時LOBを解放してください。


注意:

  • 一時LOBを解放しない場合は、データベース内でそのLOBによって使用されている記憶域を使用できないようにします。頻繁に一時LOBを解放しないと、一時表領域が使用できないLOB記憶域でいっぱいになってしまいます。

  • 一時LOB列のあるReultSetからデータをフェッチする場合は、getStringまたはgetBytesのかわりに、getClobまたはgetBlobメソッドを使用してください。

  • java.sql.Blobjava.sql.Clobおよびjava.sql.NClobインタフェースにあるJDBC 4.0のfreeメソッドは、freeTemporaryメソッドに優先します。


OpenおよびCloseメソッドによる通常のLOBのオープン

この項では、LOBのオープンとクローズの方法について説明します。この機能は、oracle.sql.BLOBおよびoracle.sql.CLOBインタフェースの次のメソッドを使用して、JDBC実装されます。


注意:

  • Oracle Database 12cリリース1 (12.1)以降、oracle.sql.BLOBクラスおよびoracle.sql.CLOBクラスは非推奨となり、oracle.jdbc.OracleBlobインタフェースおよびoracle.jdbc.OracleClobインタフェースに置き換えられています。標準互換性には(可能であれば)java.sqlパッケージの使用可能なメソッドを使用し、Oracle固有の拡張機能にはoracle.jdbcパッケージの使用可能なメソッドを使用することをお薦めします。これらのインタフェースの詳細は、My Oracle Supportノート1364193.1を参照してください。

  • LOBは必ずしもオープンおよびクローズする必要はありません。パフォーマンス上の理由から、LOBのオープンとクローズを選択できます。



関連項目:

Oracle Database SecureFiles and Large Objects開発者ガイド

  • void open (int mode)

  • void close()

  • boolean isOpen()

Open/Closeコール操作内部でLOB操作をラップしない場合、LOBは変更のたびに暗黙的にオープンおよびクローズされ、ドメイン索引上でトリガーが起動されます。この場合、LOBを変更するとただちに、LOBのドメイン索引がすべて更新されることに注意してください。したがって、ドメインLOB索引は常に有効となり、同じトランザクション内でいつでも使用できます。

Open/Closeコール操作の内部でLOB操作をラップすると、LOBが変更されるたびにトリガーが起動されることはありません。かわりに、Closeがコールされた時点で、ドメイン索引に関するトリガーが起動します。たとえば、closeメソッドをコールするまでドメイン索引が更新されないようにアプリケーションを設計できます。ただし、これは、LOB上のドメイン索引がOpen/Closeコールの間は無効であることを意味します。

LOBを開くには、openメソッドまたはopen(int)メソッドをコールします。その後、そのLOBに関連付けられたトリガーを起動することなく、LOBの読取りまたは書込み操作を実行できます。LOBへのアクセスが終了後、closeメソッドをコールしてLOBをクローズします。LOBをクローズすると、そのLOBに関連付けられたトリガーが起動します。

isOpenメソッドをコールすると、LOBがオープンまたはクローズしているかどうかを確認できます。open(int)メソッドをコールしてLOBをオープンした場合は、引数の値がoracle.sql.BLOBクラスおよびoracle.sql.CLOBクラスで定義されたMODE_READONLYまたはMODE_READWRITEである必要があります。MODE_READONLYを使用してLOBをオープンした場合は、そのLOBに書込みを試みるとSQL例外が発生します。


注意:

  • トランザクションでオープンしたすべてのLOBをクローズする前に、そのトランザクションをコミットしようとすると、エラーが発生します。オープンしているLOBのオープン状態は破棄され、トランザクションは正常にコミットされます。このため、トランザクション内でLOBおよび非LOBデータに対して行われた変更はすべてコミットされますが、ドメイン索引に関するトリガーは確実には実行されません。

  • openおよびcloseメソッドは、通常のLOBに対してのみ適用されます。closeメソッドは、一時LOBに使用されるfreeまたはfreeTemporaryメソッドとは異なります。freeおよびfreeTemporaryメソッドは、記憶域を解放し、LOBを使用不可にします。他方、closeメソッドは、LOBでの変更が完了したのでトリガーを起動し索引を更新する必要があることを、データベースに指示します。LOBは、closeメソッドへのコール後もまだ使用可能です。


BFILEの操作

この項では、ファイル・ロケータを使用してBFILEからデータを読み取る方法を説明します。この項の内容は次のとおりです。

BFILEロケータの取出し

BFILEデータ型とoracle.sql.BFILEクラスは、Oracle独自のものです。したがって、これらには標準インタフェースはありません。この型のデータには、Oracle拡張機能を使用する必要があります。

標準JDBC結果セットまたはBFILEロケータを含むコール可能文オブジェクトがある場合は、標準結果セットのgetObjectメソッドを使用して、ロケータにアクセスできます。このメソッドは、oracle.sql.BFILEオブジェクトを戻します。

また、結果セットをOracleResultSetにキャストするか、コール可能文をOracleCallableStatementにキャストし、getOracleObjectまたはgetBFILEメソッドを使用することにより、ロケータにアクセスすることもできます。


注意:

getObjectまたはgetOracleObjectメソッドを使用している場合は、必要に応じて出力をキャストしてください。

ロケータがあれば、oracle.sql.BFILE内のAPIによりBFILEデータにアクセスできます。これらのAPIは、java.sql.BLOBインタフェースの読取りメソッドに似ています。

BFILESへの書込み

BFILEの内容にデータは書き込めませんが、oracle.sql.BFILEのインスタンスをSQL文またはPL/SQLプロシージャへの入力として使用できます。これは次のいずれかを実行することで行えます。

  • 標準のsetObjectメソッドを使用します。

  • 文をOraclePreparedStatementまたはOracleCallableStatementにキャストし、setOracleObjectまたはsetBFILEメソッドを使用します。これらのメソッドは、パラメータ索引およびoracle.sql.BFILEオブジェクトを入力として取ります。


    注意:

    • BFILE用の標準java.sqlインタフェースはありません。

    • getBFILEメソッドをOracleResultSetおよびOracleCallableStatementインタフェースで使用して、oracle.sql.BFILEオブジェクトを取り出します。OraclePreparedStatementおよびOracleCallableStatementインタフェースのsetBFILEメソッドは、引数としてoracle.sql.BFILEオブジェクトを受け入れます。これらのメソッドを使用してBFILEに書き込みます。

    • getBfilesetBfileおよびupdateBfileメソッドのかわりに、getBFILEsetBFILEおよびupdateBFILEメソッドを使用することをお薦めします。たとえば、setBfileメソッドのかわりにsetBFILEメソッドを使用します。


BFILEは読取り専用です。データの本体はオペレーティング・システム(OS)のファイルシステムにあり、OSのツールとコマンドを使用しないと書き込めません。JDBCから、またはSQLを実行する別の方法を使用して、適切なSQL文を実行することにより、既存の外部ファイル用のBFILEを作成できます。しかし、BFILEが参照するOSファイルSQLまたはJDBCでは作成できません。これは、サーバー・ファイルシステムにアクセスするプロセスによって外部的にしか作成されません。


注意:

旧版マニュアルのこの章で示されているサンプル・コードは、OTNでダウンロードできるサンプル・コードを参照するために削除されました。