- PR -

Blob型データのサイズ取得について

1
投稿者投稿内容
未記入
会議室デビュー日: 2004/05/10
投稿数: 6
投稿日時: 2004-05-10 18:11
はじめまして。shuichiと申します。

下記の環境でjavaプログラムを動作させています。

OS:Win2K
DB:Oracle9i(OCI)
JDK:1.4

BLOB型のデータをDBからInputStream型で取得した後、このInputStreamの
サイズをavairableメソッドで取得すると、データが存在するにもかかわら
ず常に「0」となります。
ファイル等にこのストリームを出力すると、空ではないファイルが作成
されるので、何故サイズが「0」になるのか原因が解りません。

どなたかご存知でしたら、お教え願います。
いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2004-05-10 19:07
どうもこんにんちは。
私もOracleでLOBを扱った時はINSERT,SELECT両方苦労した覚えがあります。

ResultSetからBLOB型をとりだして、length()メソッドでサイズが取れたと思いますが、
Stream型だと大きいサイズの取り扱いがうまく行かなかった覚えがあります。

後、java.sql.Blobではなくoracle.sql.BLOBの方がいいと思います。
未記入
会議室デビュー日: 2004/05/10
投稿数: 6
投稿日時: 2004-05-10 20:04
いっきゅうさん 返答ありがとうございました。

説明が不足していてすいません。
使用しているクラスは、oracle.sql.BLOBです。

length()だと、ストリームを取得する前の段階で
BLOB自体のサイズが取得できるんですね(javadocで
確認しました)。
ちなみに、BLOBにはnullを設定できるのでしょうか。
又、nullが設定されたBLOBに値をセットすることは
可能でしょうか。

稚拙な質問ばかりで申し訳ございません。
ご回答お待ちしております。
ふーばー
大ベテラン
会議室デビュー日: 2003/06/05
投稿数: 163
投稿日時: 2004-05-11 10:11
引用:

ちなみに、BLOBにはnullを設定できるのでしょうか。



EMPTY_BLOB() というキーワードで調べましょう。
いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2004-05-11 13:11
> ちなみに、BLOBにはnullを設定できるのでしょうか。
設定できます。が後々面倒です。

> 又、nullが設定されたBLOBに値をセットすることは
> 可能でしょうか。
ふーばーさんの書かれているようにEMPTY_BLOB()で
1度アップデートすれば値を書き込むことができます。

なぜかというとNULLをセットしてしまうとBlobを取得することは
できますがその後Streamを取得することはできません。
EMPTY_BLOB()でインスタンスを作成しておく必要があります。

@CREATE TABLE LOBTable ( ID NUMBER(3), LOBCOL BLOB );
AINSERT INTO LOBTable VALUES( 1, NULL );
BUPDATE LOBTable SET LOBCol=EMPTY_BLOB() WHERE ID=1;
CSELECT LOBCol FROM LOBTable WHERE ID=1 FOR UPDATE;

@というテーブルがあり、AでNULLをセットしたらBのようにする必要があります。
だから、BLOBにNULLをSETする時はEMPTY_BLOB()に置き換えておいた方が良いです。

又、BLOBデータを書き込むときはUPDATEではなくSELECTを使います。
CのようにSELECTからBLOBオブジェクトを取得して値を書き込みます。
その時SQL文の最後に“FOR UPDATE”をつけることでUPDATE時のロックが
かかっていないというエラーが起こること回避します。

以上。
未記入
会議室デビュー日: 2004/05/10
投稿数: 6
投稿日時: 2004-05-11 17:10
shuichiです。

いっきゅうさん 有難う御座いました。
大変参考になりました。
もう少し調べて知識を確実にしようと思います。
1

スキルアップ/キャリアアップ(JOB@IT)