为什么我得到“数据映射错误的[SQL0802]数据转换”异常?

时间:2012-10-25 19:13:29

标签: sql ibm-midrange data-conversion

我对iseries / DB2不太熟悉。但是,我在一个使用它作为主数据库的网站上工作。

最近在现有表中添加了一个新列。当我通过AS400查看它时,我看到以下数据类型:

Type: S
Length: 9
Dec: 2

这告诉我这是一个数字字段,小数点前有6位数字,小数点后有2位数字。

当我使用简单的SELECT(SELECT MYCOL FROM MYTABLE)查询数据时,我会毫无问题地收回所有记录。但是,当我尝试在同一列上使用DISTINCTGROUP BYORDER BY时,我会遇到以下异常:

[SQL0802] Data conversion of data mapping error

我推断出至少有一条记录包含无效数据 - 我的DBA称之为“空白”或“4 O”。这怎么可能呢?当尝试将无效数据添加到该列时,数据库是否应该抛出异常?

有什么方法可以解决这个问题,例如在查询中过滤掉那些不良记录吗?

4 个答案:

答案 0 :(得分:5)

“4 O”表示0x40,它是空格或空白字符的EBCDIC代码,是放入记录中任何新空间的默认值。

传统程序/操作可能会引入十进制数据错误。例如,如果使用带有CPYF选项的FMTOPT(*NOCHK)命令创建并填充了新文件。

最简单的解决方法是编写HLL程序(RPG)来读取文件并更正记录。

答案 1 :(得分:3)

我能找到的唯一解决方案是编写一个脚本来检查列中的空白值,然后在找到它们时将它们更新为零。

答案 2 :(得分:2)

如果文件的记录格式级别检查已关闭[即。 LVLCHK(*NO)]或被覆盖,然后是HLL程序。未使用新记录重新编译的(例如RPG,COBOL等)可能会在此列中写出包含无效数据的记录,特别是如果新列不在记录的末尾。

确保重新编译使用本机I / O编写或更新此文件上的记录的所有程序。

答案 3 :(得分:0)

我能够通过强制将键列强制转换为整数来解决此错误。我改变了这个联接......

FROM DAILYV INNER JOIN BXV ON DAILYV.DAITEM=BXV.BXPACK

......对此...

FROM DAILYV INNER JOIN BXV ON CAST(DAILYV.DAITEM AS INT)=CAST(BXV.BXPACK AS INT)

......我没有必要对表格进行任何更正。这是一个非常古老,非常混乱的数据库,里面有很多垃圾。我做了很多更正,但这是一项正在进行中的工作。