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

takart32 @ yahoo.co.jp takart32 @ yahoo.co.jp
2012年 8月 7日 (火) 19:47:29 JST


さいとうさん

アドバイスありがとうございます。

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

 ⇒empty_blob()関数を使用しなくて良い方式もあるのですね。
   貴重な情報ありがとうございます。
   私の技量不足で下記処理についてうまく理解できませんでした。
   大変恐縮なのですが「・・・」で省略している部分の処理を教えていただけないでしょうか?

  よろしくお願いします。


--- On Tue, 2012/8/7, take <saitoh_takeshi @ ics.co.jp> wrote:

> さいとうです。
> 
> 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 メーリングリストの案内