我已经获得了DB2数据导出(大约7 GB)和相关的DB2控制文件。我的目标是将所有数据上传到Oracle数据库。我几乎成功了 - 我采取了将控制文件转换为SQL * Loader CTL文件的路线,它在大多数情况下都有效。
但是,我发现一些数据文件在某些列中包含终结符和垃圾数据,这些列被加载到数据库中,导致与该数据匹配的明显问题。例如,一列应包含'9930027130',将显示长度(trim(col))= 14:4垃圾数据字节。
我的问题是,从系统中消除这些垃圾数据的最佳方法是什么?我希望这是对CTL文件的一个简单补充,允许它用空格替换垃圾 - 否则我只能想到编写一个分析数据的脚本,并在运行SQL * Loader之前用空格替换nulls / junk。
答案 0 :(得分:2)
您对“垃圾”的定义究竟是什么?
例如,如果您知道列应该只包含10个字符的数据,则可以在控制文件中添加NULLIF( LENGTH( <<column>> ) > 10 )
。如果你知道该列只应包含数字字符(或字母数字),你可以编写一个自定义数据清理函数(即STRIP_NONNUMERIC)并从你的控制文件中调用它,即
COLUMN_NAME position(1:14) CHAR "STRIP_NONNUMERIC(:LAST_NAME)",
根据您的要求,这些清理功能和清理逻辑会变得相当复杂。在每晚加载和清理大量数据的数据仓库中,数据通常通过一系列临时表移动,因为应用了连续几轮的数据清理和验证规则,而不是尝试在一个步骤中加载和清理所有数据。例如,一种常见的方法是将所有数据加载到VARCHAR2(4000)列中,而不通过SQL * Loader(或外部表)进行清理。然后,您将有一个单独的进程将数据移动到具有正确数据类型的临时表中,这些数据类型为无法转换的数据(即NUMBER列中的非数字数据,不可能的日期等)。另一个过程会出现并将数据移动到另一个应用域规则的临时表中 - 社会安全号码必须是9位数,纬度必须介于-90和90度之间,或者州代码必须是在状态查找表中。根据验证的复杂程度,您可能有更多进程将数据移动到其他临时表,以应用更严格的验证规则集。
答案 1 :(得分:1)
“列应包含'9930027130',将显示长度(trim(col))= 14:4垃圾数据字节。”
执行SELECT DUMP(col)以确定奇怪的字符。然后决定是否总是无效,在某些情况下有效或有效但解释错误。