[pgsql-jp: 41170] Re: ご教授お願いします

take saitoh_takeshi @ ics.co.jp
2012年 8月 7日 (火) 16:29:22 JST


さいとうです。

At Tue, 7 Aug 2012 15:58:22 +0900 (JST),
<takart32 @ yahoo.co.jp> wrote:
> 
> さいとうさん
> 
> こんにちは。回答くださりありがとうございます。
> 
> やはり初期化を行うには『''』を格納する方法しかないのですね。
> 
> 現行のJavaロジックが以下の処理方式で作られているので、empty_blob
> の代替関数があれば、プログラムをほぼ修正せずにいけると思ったのですが残念です。
> 
> (1)新規レコードをinsertする。insert時にBLOBカラムは、empty_blob()関数で初期化する。
> (2)insertした新規レコードを、for update句を使用して、ロックを取得してselectする。
> (3)selectしたBLOBカラムのロケータから、BinaryOutputStreamを取得する。
> (4)取得したBLOBオブジェクトのOutputStreamをZip形式でinsertするので、ZipOutputStreamを作成。
> (5)ZipOutputStreamをObjectOutputStreamでラップする。
> (6)writeObjectでDBに書き込みを行う。
> 
> どういった処理方式でいけるかこれから検討してみます。
...


はなしの方向が少しずれるかもしれませんが。

わたしも高橋さんが上記に書かれた手順でblobを扱っていました。

が、最近empty_blob()関数を使わずに更新できることに気づいて手順を変更し
ました。
OracleのDBMSのバージョン、JDBCドライバのバージョン、どちらに起因してい
るのかはきっちりと検証はしませんでしたが。


# typoはご容赦を

ByteArrayOutputStream zippedbaos = ...;
ByteArrayInputStream bais = new ...(zippedbaos.getBytes());
PreparedStatement pstmt = conn.preparedStatement("insert into hoge2 values (id, bin) values (?, ?)");
pstmt.setString(1, "xx");
pstmt.setBinaryStream(2, bais);
pstmt.executeUpdate();


Oracleだったら、PostgreSQLだったら、と判断してロジックを分けていました
が、(少なくともOracle11以降なら)どちらでも同じロジックでblobの更新がで
きています。

参考になれば幸いです。


pgsql-jp メーリングリストの案内