设为首页 收藏本站
查看: 1143|回复: 0

[经验分享] 一个关于更新Oracle中Blob问题

[复制链接]

尚未签到

发表于 2016-7-25 07:26:20 | 显示全部楼层 |阅读模式
前几天做项目,用到了Oracle数据库,是关于更新Blob,代码是这样写的:
/**
* 描述: 添加某张表某条记录的content字段,此字段为 blob 型
* param: 表名;主键;数据;数据库连接
* return: 添加成功返回 true ;否则返回 false
* */
public static boolean setBlob(String tableName,int ID, String data,Connection conn) {
Statement statement = null;
ResultSet ret = null;
String insertBlob = "select content from " + tableName + " where id = '"+ID+"' for update ";
boolean flg = false;
try {
statement = conn.createStatement();
ret = statement.executeQuery(insertBlob);
oracle.sql.BLOB blob = null;
if (ret.next()) {
blob = ((OracleResultSet) ret).getBLOB(1);
}
OutputStream outstream = blob.getBinaryOutputStream();
byte[] data1 = data.getBytes();
outstream.write(data1, 0, data1.length);//就是这个地方出了问题,如果是修改,之前就有了长度为100字节的数据,而这次修改只有50字节数据,那么后面50个字节就不会被修改,仍然存在数据库中
outstream.flush();
outstream.close();
flg = true;
} catch (SQLException e1) {
e1.printStackTrace();
flg = false;
} catch (IOException e1) {
e1.printStackTrace();
flg = false;
} finally {
try {
if(statement != null) {
statement.close();
}
if(ret != null) {
ret.close();
}
}catch(Exception ex) {
ex.printStackTrace();
}
}
return flg;
}
如果你更新blob字段时,该字段为空(比如之前刚刚插入新记录),则这样操作正确。
但要更新有数据的blob字段,则只能更新部分字节,原字段数据超出长度部分的字节内容不变。
如果确实需要更新有数据的blob字段(也叫覆盖式更新),则可在下面两种方法中选择其一:
1、在更新前(setBlob方法中select执行前)先将blob字段清空:
\"UPDATE \" + tableName + \" SET content=EMPTY_BLOB() WHERE id= \'\" +ID + \"\'\"
再执行你的更新代码。
2、确保每次写入的字段长度固定。即使data的字节数少,也要保证data1的长度固定,
也即data1定义长度要与data无关。
采用第一种方案的代码如下:
/**
* 描述: 添加某张表某条记录的content字段,此字段为 blob 型
* param: 表名;主键;数据;数据库连接
* return: 添加成功返回 true ;否则返回 false
* */
public static boolean setBlob(String tableName,int ID, String data,Connection conn) {
Statement statement = null;
ResultSet ret = null;
String insertBlob = "select content from " + tableName + " where id = '"+ID+"' for update ";
String flushBlob="update "+tableName+" set content=EMPTY_BLOB() where id="+ID;
boolean flg = false;
try {
statement = conn.createStatement();
statement.execute(flushBlob);//首先清空content字段
ret = statement.executeQuery(insertBlob);
oracle.sql.BLOB blob = null;
if (ret.next()) {
blob = ((OracleResultSet) ret).getBLOB(1);
}
OutputStream outstream = blob.getBinaryOutputStream();
byte[] data1 = data.getBytes();
outstream.write(data1, 0, data1.length);//就是这个地方出了问题,如果是修改,之前就有了长度为100字节的数据,而这次修改只有50字节数据,那么后面50个字节就不会被修改,仍然存在数据库中
outstream.flush();
outstream.close();
flg = true;
} catch (SQLException e1) {
e1.printStackTrace();
flg = false;
} catch (IOException e1) {
e1.printStackTrace();
flg = false;
} finally {
try {
if(statement != null) {
statement.close();
}
if(ret != null) {
ret.close();
}
}catch(Exception ex) {
ex.printStackTrace();
}
}
return flg;
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-248837-1-1.html 上篇帖子: 3 个dao sql oracle mysql 下篇帖子: Oracle 中truncate与delete的区别
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表