从ORA-22993谈起---论解决问题的方法论

今天写了个程序要实现:让用户创作模板,而且是带格式的模板,保存起来留作以后使用。所以这些模板的数据要保存到数据库了。 我是这么写的<code>templateVO.setBlobID(blobService.addBlob(blobVO));</code> 基本上意思很清楚就是向Oracle的blob字段里添加一条记录。但是问题来: 每次执行完毕总是报:<code>java.io.IOException: ORA-22993: specified input amount is greater than(ORA-22993: 指定的输入总数大于实际的来源总数)</code> 一番Google,http://blog.csdn.net/lihan6415151528/archive/2009/07/15/4351142.aspx .询问同事后知是Oracle版本的问题,自己使用: <code>select * from v$version; 查询结果: <TABLE BORDER="1"> <TR><TH>BANNER</TH></TR> <TR><TD>Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod</TD></TR> <TR><TD>PL/SQL Release 10.2.0.1.0 - Production</TD></TR> <TR><TD>CORE 10.2.0.1.0 Production</TD></TR> <TR><TD>TNS for 32-bit Windows: Version 10.2.0.1.0 - Production</TD></TR> <TR><TD>NLSRTL Version 10.2.0.1.0 - Production</TD></TR> </TABLE> </code> 果然是驱动不对,我自己的是oracle 9.0.2的驱动classes12.jar 而链接的服务器是10.2.0.1。 寻找到数据库服务器copy到本机,原想就圆满了吧。但:错误码: <code>Cannot create JDBC driver of class 'oracle.jdbc.driver.OracleDriver'/no suitable driver</code> 纵使我找到n多帖子,但是大多数是这个问题都是"Cannot create JDBC driver of class 'oracle.jdbc.driver.OracleDriver' for connect 'null'" 引起的,不是我的情况。自己反复使用9i和10g的包替换,重启,发现只是包的差别,9i就是正常10g不行,也就是这条路也是不行的。 但是我忽然意识到许多人也使用了导入附件的功能,为什么他们好使呢?带着这样的疑问,查看了别人写的导入功能。发现在我的系统上别人的功能也是不好使的;但是在别人的机器上确实好使的。。 这下好办了,就是比较我们两个系统的运行环境呗。jdk都是1.5;tomcat,我的是6,她的是5,这个导致问题的可能性不大;最后发现她使用的Oracle驱动是ojdbc14.jar,查询MANIFEST.MF,Oracle版本是9.0.2.,传到我机器和我的ojdbc比较发现她的是<code>Implementation-Title: "ojdbc14.jar" Implementation-Version: "Oracle JDBC Driver version - 9.0.2.0.0" Implementation-Vendor: "Oracle Corporation" Implementation-Time: "Tue Apr 6 01:10:57 2004"</code> 而我的是<code>Implementation-Title: "ojdbc14.jar" Implementation-Version: "Oracle JDBC Driver version - 9.0.2.0.0" Implementation-Vendor: "Oracle Corporation" Implementation-Time: "Thu Apr 25 23:14:02 2002"</code> 时间跨了2年,大小差30k,最重要的是前者的<code>Name: oracle/sql/BLOB.class Digest-Algorithms: SHA MD5 SHA-Digest: pKeIUjbb0bG29Fp+YyMUnpXdqL0= MD5-Digest: 84Ixh0QhrIJFPxfQJQSlAw==</code> 而我的<code>Name: oracle/sql/BLOB.class Digest-Algorithms: SHA MD5 SHA-Digest: YdCoSwsZJODsKxo8/Im33SiW0eg= MD5-Digest: DG0ZZCIRtwfrRDZ3i6Pslg==</code> 问题找到了使用blob文件不一样,说明我的不兼容的。 之后由遇到了如何判断一字段输入是否大于数据库里的存储——典型的中文字符集问题。 1.页面使用utf8传值到servlet,servlet使用utf8解释,在servlet里看到的是正常的汉字,但是有个问题,这些bytes(不是Byte)是如何被保存到数据库的,使用(<a href="http://phoenix007.iteye.com/blog/278004#comments">这里</a>); <code>select userenv('language') from dual;</code> 发现是gbk的,这下好,知道是1个存2个字段。 问题就到这里。。 其实我想表达是: 我前面使用的策略是——1.直面问题,直到找到原因。可以理解为是直线。就是看产生结果的原因。 2。我使用的绕过的原则。我不需要知道为什么不好使,我只需要知道一种方法,让他好使,那就是抄别人的东西。 两种方式是各有千秋,我喜欢第一种直接,干脆,彻底。但是时间耗费。。 第二种迂回,但是能马上解决问题。。 所以合适的选择解决问题的方案是日常工作生活学习的必备技能。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值