[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 メーリングリストの案内