很长时间没更新了,最近换了一家公司,数据库方面也从原先的 sqlserver 变成了麻烦一匹的 Oracle ,既然使用了 Oracle 那肯定或多或少的会遇到一些莫名其妙的问题。除了 Oracle 很多独特的语法之外,还有一些奇怪的规则,比如我的标题。
遇到问题的过程是这样的,我在调试一体机的时候一体机扫描图片之后不是存图片路径,而是把图片转换成 Base 64 的字符串格式存到数据库中,这中奇葩方式真的是没有见过,不过一体机不是我们这边做的,我也没办法改变。所以只能适应。在一开始测试的时候,我用的测试数据长度很短,所以在存入的时候没有问题,但是后来前端给我传来的真实数据存不进去报错的时候,着实蒙了一比。后来经过浏览各种帖子,最后还是解决了这个问题。
在贴代码之前,有几点要注意:
1.在存 Base 64 的时候,虽然也是字符串,但是由于长度过大,在 Oracle 中我们常用的 Varchar2 类型是存不进去的,该类型只能存长度在 4000 以内的数据,所以我使用了 CLOB 类型
2.存 CLOB 类型的时候不能直接使用 sql 语法,而是要使用 Oracle 的参数绑定的方式
上图是我使用的第一版本代码,然后在第一次实际数据测试的时候华丽丽的报错了。报错是字符换长度过长。仔细观看传参,不是参数的错误。然后直接复制代码以及传参到 plsql 中直接执行,发现还是报错,后来在网上查询各种解答,明白了,原来是在单引号之间的字符串长度超过了 4000 。这跟 Varchar2 类型的长度上限是不同的。Varchar2 是因为本省只能存 4000 以内的字符串,但是这次报错的原因是因为两个单引号之间的字符串不能超过 4000 。
找到病因,接下来就是对症下药,既然一次存不下那么多,(顺便说一下,我传的数据长度是 11w7k 左右)那就拆开存就成了,遇事下面的版本新鲜出炉:
请忽略块注释标题,,,。这次我的想法是首先在程序里把 11w7k 的数据拆分成 4000 一组的。然后统计出一共多少组,然后循环。就是先:数据长度/4000取整数,然后数据长度%4000如果不等于0就在上面的取整数+1。然后前 4000 个字符是新增一条数据,之后的 29 组全是在第一组的基础上更新。
但是因为业务的需求,需要把多种材料的的扫描件一起存到数据库里边去,这样一个材料存30次,10个材料就是200次,于是在实际数据测试的时候又华丽丽的炸了。
最后因为业务需求,我放弃了循环存入的方式,再一次阅读网上帖子和文档,最后确定了下面这一版。
同样是数据绑定的方式,但是因为asp程序内是没有 4000 上限的规则的。于是我就可以通过设定参数类型的方式直接一次性将 11w+ 的数据长度一次性全部存进去(这么简单的方法为什么我一开始没有找到)。
至此,本次问题完美解决。最后容我吐槽一下 Oracle 这数据库。
新手一个,如有错误请留言,多交流