9

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

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

Type: S
Length: 9
Dec: 2

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

当我使用简单的 SELECT ( SELECT MYCOL FROM MYTABLE) 查询数据时,我可以毫无问题地取回所有记录。但是,当我尝试在同一列上使用 、 或 时,出现以下DISTINCT异常GROUP BYORDER BY

[SQL0802] Data conversion of data mapping error

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

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

4

4 回答 4

5

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

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

修复它的最简单方法是编写一个 HLL 程序 (RPG) 来读取文件并更正记录。

于 2012-10-25T20:05:38.643 回答
3

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

于 2012-12-14T15:40:35.243 回答
2

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

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

于 2012-10-25T20:07:56.620 回答
1

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

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)

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

于 2018-01-03T13:58:26.543 回答