欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

非lob字段引起的streams type cannot be used in batching错误原因

程序员文章站 2022-05-08 20:25:08
...
    系统运行时总报"streams type cannot be used in batching"错误,从字面错误来看sql肯定是本batching和streams有关,即批量操作和设计大字段(blob,clob),以下以lob代替。
    问题原因直接判断lob字段问题,结果实际表根本没有lob类型的字段
    翻查insert into语句来看,确实用了batch操作,而sql中并未按照lob的操作方式来处理,即要先插入一个empty_clob()值,再使用select col from table for upate方式, 例
    update FX_FA_JCB set JC_BG = ? WHERE FA_DM = ?
    SELECT JC_BG FROM FX_FA_JCB WHERE FA_DM=? FOR UPDATE
到此感觉就是insert语句错误,但是问题挺奇怪,本次sql错误大部分都能执行成功,个别几个不行,就仔细看了看要插入的表,表里根本没有lob类型的字段,那不可能报streams字样的错误提示呀,问题很怪异。网上搜了一把,都是关于lob字段的描述。决定调试一下看看。
 
   怪异问题的前因找到了:插入值中有乱码
    调试时,查看了sql的参数值,都是字符串类型,且都不长,不应该报这个错误呀。重新调试了一下,逐个查看参数值,发现有个参数值是这样的"<?xml version="1.0" encoding="UTF-8"?><zbkzxx><zbyxx><zby dcxxsbm="wcjyd" mc="外出经营地" value="��������������"/><zby dcxxsbm="yswdjd" mc="税务登记地" value=""/><zby dcxxsbm="yxqq" mc="外出经营活动税收管理证明有效期起" value="20130311"/><zby dcxxsbm="yxqz" mc="外出经营活动税收管理证明有效期止" value="20130811"/><zby dcxxsbm="wszg" mc="文书字轨" value="������"/></zbyxx></zbkzxx>",值中有乱码,理论上乱码也不应该有问题呀,抱着尝试的心理,就在调试阶段直接把内存中的乱码值改为了正常的字符,f8直接下去,sql执行成功了,问题发现了,查询数据库,表中中文列都是乱码,把表数据重新了一下后,再运行,一切正常,看来就是数据问题造成的。但还是觉得怪异,普通的varchar2类型怎么抛出这样的错误信息。
  
 怪异问题的原因找到了:classes12.jar驱动包问题
   使用plsql,分别把客户端设置为gbk,utf-8字符集,使用乱码的字符串做insert,都没有问题,那这肯定跟数据库无关。焦点又盯上了驱动包,查找应用使用的驱动包,发现用的是classes12.jar,把jar换成ojdbc14.jar,使用乱码数据尝试了一下insert,果然没有问题,问题就在classes12.jar身上。
 
   应用在选择jdbc驱动包时一定要慎重,查了一下,classes12.jar是在低级JDK版本1.2与1.3中使用的驱动,虽然实际上在1.4,1.5中使用大部分情况也是OK的。建议驱动包还是根据jdk来选择对应的驱动包。