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

    系统运行时总报"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来选择对应的驱动包。
  

你可能感兴趣的:(jdbc,driver,batch,streams)