# java.sql.Blobインターフェイスとjava.sql.Clobインターフェイスの対応

JDBC 2.0ではjava.sql.BlobはSQLのBLOB(binary large object)型に対応して、java.sql.ClobはSQLのCLOB(character large object)型に対応します。

java.sql.Blobとjava.sql.Clobは情報(large object)全体ではなく、それへの論理的なポインタを表します。Derbyでは一時に唯一つのデータページだけがメモリ上で処理されます。BLOBの情報の最初の数バイトを読み書きするのに、LOB全体が処理される必要はありません。

現在のDerbyに組み込まれた型には、BLOBとCLOBが用意されています。 またDerbyはこれらのデータ型に対して以下の機能を提供します。

- BLOBの機能 Derbyではjava.sql.Blobインターフェイスとjava.sql.PreparedStatementインターフェイス: JDBC2.0で提供されるメソッドおよびjava.sql.ResultSetのBLOBに関連したメソッドが用意されています。 CallableStatementのgetBlobメソッドは実装されていません。
- CLOBの機能 Derbyではjava.sql.Clobインターフェイスとjava.sql.PreparedStatementインターフェイス: JDBC2.0で提供されるメソッドとjava.sql.ResultSetのCLOBに関連したメソッドが用意されています。 CallableStatementのgetClobメソッドは実装されていません。

java.sql.Blobとjava.sql.Clobの機能を使うには以下のようにします。

- 情報をSQLのBLOB型で記録します。LONG VARCHAR FOR BIT DATA、BINARYおよびVARCHAR FOR BIT DATA型でも可能です。
- 情報をSQLのCLOB型で記録します。LONG VARCHAR、CHARおよびVARCHAR型でも可能です。
- java.sql.ResultSetインターフェイスのgetBlobあるいはgetClobメソッドを使って、参照される情報を扱うBLOBやCLOBを取得します。
- LOBの列に対して静的なメソッドを呼ぶことはできません。

加えて文字列とBLOBの間で型変換を行うことは推奨されません。なぜなら型変換はプラットフォーム・データベースに依存するからです。

Derbyはユニコード文字列(1文字2バイト)を使いますが、他のデータベース製品はASCII文字(1文字あたり1バイト)を使うかもしれません。使われる文字コードの種類によっては一文字が数バイトを必要とすることも考えられます。文字列を記録する為に、Derbyでは他より大きなBLOBの型を必要とする場合があります。 文字列を記録する場合はCLOB型を利用するべきです。

BLOB、CLOB、(LOB型)の制約

- LOB型は等号(=)や不等号(!=、 <>. で比較できません。
- LOB型で順序付けることはできません。また<、 <=、 >、 >=による比較も不可能です。
- LOB型への索引やLOB型の主キー列は不可能です。
- LOB型について、DISTINCT、GROUP BY、ORDER BY節は利用できません。
- 他の基本型と違い、LOB型では暗黙の型変換を行えません。

Derbyでは、CallableStatementのsetおよびgetメソッドを除いた、以下のJDBC 2.0のインターフェイスのメソッドが実装されています。

推奨事項: java.sql.Blobとjava.sql.Clobの生存期間はトランザクションがコミットされるとき終了するので、java.sql.Blobおよびjava.sql.Clobを利用するときは自動コミットを切って下さい。

表 1. 提供されるJDBC 2.0 java.sql.Blobのメソッド
返り値 | シグネチャ | 実装の覚書
--- | --- | ---
InputStream | getBinaryStream() |
byte[] | getBytes(long pos, int length) | pos < 1だったり、posがlengthより大きかったり、length <= 0であった場合、例外が発生します。
long | length() |
long | position(byte[] pattern, long start) | pattern == nullであったり、start < 1であったり、patternの配列長が0であった場合、例外が発生します。
long | position(Blob pattern, long start) | pattern == nullだったり、start < 1だったり、patternの長さが0であったり、patternの最初の数バイトを読むとき例外が起きると、例外が発生します。

表 2. 提供されるJDBC 2.0 java.sql.Clob のメソッド
返り値 | シグネチャ | 実装上の覚書
--- | --- | ---
InputStream | getAsciiStream() |
Reader | getCharacterStream() |
String | getSubString(long pos, int length) | pos < 1だったり、posが Clobの長さより大きかったり、length <= 0であった場合、例外が発生します。
long | length() |
long | position(Clob searchstr, long start) | searchStr == nullだったりstart < 1だったり、searchStr の長さが0だったり、searchStrの最初の数バイトを読むとき例外が起きると、例外が発生します。
long | position(String searchstr, long start) | searchStr == nullだったり、start < 1だったり、patternが空文字列であった場合、例外が発生します。

- java.sql.Blobとjava.sql.Clobの対応に関する但し書き

親トピック: SQL型とjava.sql.Typesの対応