一直以来,我们都把北大和浙大的考试科目数据上传作为检验系统的指标,所以各位重视这两个学校给我们的数据。前两天10335的浙大经过了多次验证,是没有问题的,可是昨天北大给我们出了个难题。
上传专业研究方向没有问题,上传考试科目的时候出了错,6127条数据,只能传上去5394条。
查错,因为数据太多了,想从其中发现错误,大海捞针一样。
首先考虑到按照异常提示,进行查找。系统报错ora-01401 插入的数值相对列过长,于是迅速怀疑其数据是否过长,打开dbf文件一看,过长的数据都已经被截掉了,但是是否会在半角全角上出问题了,这就不得而知了。为了证明这个问题,我在另外一个数据上把那个较长的字段长度改长,这时不再报ora-01401的错误了,报ora-00917错误,缺少逗号。于是立刻怀疑是数据中有不法字符,但是茫茫数据,如何定位错误数据呢?
我决定单写一个导入程序,逐条作检查,每次打印sql语句以定位错误数据。中间遇到了无法访问系统dbf数据库的问题,为了节省时间我采用了jdbc-odbc来访问,打印出来的结果一下在证明了一部分问题,关于缺少逗号这个错误,是因为在其中一个字段上存在单引号造成的。最终写入数据库中的数据成了6123条,有三条数据是因为单引号问题。
但是这仍然存在着问题,就是另外差的那条数据:
java.sql.SQLException: ORA-00001: unique constraint (APPLY.KSKM) violated
就是这个错误,这个有时候发生在第511条数据上,有时候发生在第767条数据上,而这两天数据根本就不一样,而以第767条数据出错时候居多。于是我在数据库和dbf文件中分别查找这条数据,结果发现dbf中这条数据是唯一的,而在日oracle中这条数据也存在,但select count(*)的结果分明告诉我除了那三条因为单引号没有被写入的数据以外,还有一条数据没有被写入,并且报错就报在第767条数据这里。
除了这一点比较奇怪以外,还有就是错误的不确定性,中间有一次尝试的时候就没有报错,6124条数据被导入。然后我再试,无论是删掉前导入的数据后导入,还是在原来的基础上通过程序删除数据后导入都无济于事。
我晕,以后写程序一定要在底层考虑周全,防患于未然.
Trackback: http://tb.donews.net/TrackBack.aspx?PostId=54820