当前位置: 技术问答>java相关
用oracle.sql.BLOB的getOutputBinaryStream(),向里面写入一个byte[],接进去的是长度一样的全0,怎么回事?
来源: 互联网 发布时间:2015-06-21
本文导语: getBinaryStream()读出来就没有问题(BLOB的内容在sql plus中直接生成) | 搞定了! //向BLOB写入数据 database.setAutoCommit(false); query="select PortraitData from portrait where personcode=1 for ...
getBinaryStream()读出来就没有问题(BLOB的内容在sql plus中直接生成)
|
搞定了!
//向BLOB写入数据
database.setAutoCommit(false);
query="select PortraitData from portrait where personcode=1 for update";
ps=database.createPreparedStatement(query);
ResultSet rs=ps.executeQuery();
rs.next();
BLOB blob=((OracleResultSet)rs).getBLOB("PortraitData");
OutputStream os=blob.getBinaryOutputStream();
os.write(fbyte);
os.flush();
ps.execute("commit");
database.setAutoCommit(true);
/*问题分析:
这里有两个问题:
1、由于BLOB是从SELECT语句中选出来的,要修给BLOB,必须加FOR UPDATE语句(否则出现“LOB未锁定...”的错误)。
(不知有没有简便的方法取得BLOB并向它写入数据)。
2、因为JB中对数据库的操作默认为“每执行一句SQL都当作事务提交”,提交后就无法对提交前取得的BLOB修改,
(否则出现“读取顺序不一致”的错误)。所以要setAutoCommit(false),再写入BLOB,最后execute("commit")。
*/
//向BLOB写入数据
database.setAutoCommit(false);
query="select PortraitData from portrait where personcode=1 for update";
ps=database.createPreparedStatement(query);
ResultSet rs=ps.executeQuery();
rs.next();
BLOB blob=((OracleResultSet)rs).getBLOB("PortraitData");
OutputStream os=blob.getBinaryOutputStream();
os.write(fbyte);
os.flush();
ps.execute("commit");
database.setAutoCommit(true);
/*问题分析:
这里有两个问题:
1、由于BLOB是从SELECT语句中选出来的,要修给BLOB,必须加FOR UPDATE语句(否则出现“LOB未锁定...”的错误)。
(不知有没有简便的方法取得BLOB并向它写入数据)。
2、因为JB中对数据库的操作默认为“每执行一句SQL都当作事务提交”,提交后就无法对提交前取得的BLOB修改,
(否则出现“读取顺序不一致”的错误)。所以要setAutoCommit(false),再写入BLOB,最后execute("commit")。
*/