準備済み文と列のストリーミング

setXXXStreamにより、アプリケーションとデータベース間で情報を通信させることができます。

JDBCではINの引数に、Javaの入力ストリームをとって、大規模な情報を小分けにして渡すことができます。文が実行されると、JDBCドライバはこの入力ストリームへの呼び出しを繰り返します。 DerbyではJDBC 1.2が提供する三種類のストリームを利用することができます。 この三種類のストリームとは、
  • setBinaryStream

    解釈されないバイトストリームに使われます。

  • setAsciiStream

    ASCII文字のストリームに使われます。

  • setUnicodeStream

    Unicode文字のストリームに使われます。

JDBC 2.0やJDBC 3.0ではストリームの長さを指定する必要があります。DerbyではアプリケーションがJDK 1.5以前の環境で動作している時、この事は要件です。JDK1.6以降の環境では、DerbyはJDBC4.0の実装を提供します。これによりストリーム長を指定する必要のないストリームのインターフェイスを使うことができます。 これらの三つのメソッドに渡すストリームオブジェクトは、標準のJavaストリームオブジェクトあるいは標準のjava.io.InputStreamインターフェイスを実装する、ユーザが定義したサブクラスの何れであっても構いません。

JDBCの標準に従い、ストリームは以下の表に記すデータ型の列に対してのみ記録できます。
表 1. ストリーム可能なJDBCのデータ型
列のデータ型 対応するJavaの型 AsciiStream UnicodeStream BinaryStream
CLOB java.sql.Clob x x  
CHAR   x x  
VARCHAR   x x  
LONGVARCHAR   X X  
BINARY   x x x
BLOB java.sql.Blob x x x
VARBINARY   x x x
LONGVARBINARY   x x X
注:
  • この表にて大文字のXは、ストリームの型として推奨される対照型である事を表します。SQL型とjava.sql.Typesの対応を参照してください。
  • もしストリームの記録される列の型がLONG VARCHARないしLONG VARCHAR FOR BIT DATAの何れでも無い場合、ストリーム全体が一括してメモリに収まらなければなりません。 LONG VARCHARおよびLONG VARCHAR FOR BIT DATAの列に記録されるストリームについては、この制限はありません。
  • ストリームを他の組み込みデータ型やユーザが定義したデータ型に記録することはできません。
以下の例はjava.io.Fileをストリーム経由でLONG VARCHAR型の列に格納する方法を示します。
Statement s = conn.createStatement();
s.executeUpdate("CREATE TABLE atable (a INT, b LONG VARCHAR)");
conn.commit();
java.io.File file = new java.io.File("derby.txt");
int fileLength = (int) file.length();
// まず入力ストリームを作ります。
java.io.InputStream fin = new java.io.FileInputStream(file);
PreparedStatement ps = conn.prepareStatement(
    "INSERT INTO atable VALUES (?, ?)");
ps.setInt(1, 1);
// 入力パラメータに入力ストリームを代入します。
ps.setAsciiStream(2, fin, fileLength);
ps.execute();
conn.commit();