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

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

親トピック: java.sql.PreparedStatementインターフェイス