今天国外网友使用SQLULDR2时遇到了ORA-24345错误, 遇到这个错误的根本原因是, 在OCI程序中为列分配的缓冲区不够大, 不够存放返回的值. 得到这个信息后, 去排查了一下, 发现了两处代码有可能引起这个问题. 在ociuldr中则不存在这个问题.

    第一处是RAW列, 对于这种列, 当成字符串类型处理时, 返回的是十六进制代码, 因此最大长度会是原来的2倍. 在先前的程序中分配缓冲区时没有加一倍, 而ociuldr程序不遇到这个问题, 则是因为直接将缓冲区大小设成了4000字节. 新版本为了更好的固定长度格式导出, 在列长度上更精打细算, 所以形成了这个Bug.

    第二处是数字类型, 没有考虑到负数时的情况, 未将负号这一个字节计算在缓冲区长度之内, 这个网友遇到的就是这种怀况, 声明了"NUMBER(2)", 结果里面存了二位数的负数, 所以真实的返回字符串时长度是3, 而不是从列属性中取到的2, 少算了负符字节造就了这个Bug.

    如何跳过? 可以增大数字类型的字段的精度, 或者用"width"选项来指定列宽度, 就可以解决. 这个Bug将于本周修复, 请下周重下载可执行文件更新.