2011-02-04 64 views
0

我已经使用关联的DB2控制文件获得了DB2数据导出(大约7 GB)。我的目标是将所有数据上传到Oracle数据库。我几乎在这方面取得了成功 - 我将控制文件转换为SQL * Loader CTL文件的路线,它大部分工作。将DB2数据上传到Oracle数据库 - 修复垃圾数据

但是,我发现一些数据文件在某些​​列中包含终止符和垃圾数据,这些列被加载到数据库中,导致与该数据匹配的明显问题。例如,列应该包含'9930027130',将显示长度(trim(col))= 14:4字节的垃圾数据。

我的问题是,从系统中消除这些垃圾数据的最佳方法是什么?我希望这只是CTL文件的一个简单补充,它允许它用空格替换垃圾 - 否则我只能想到编写一个分析数据的脚本,并在运行SQL * Loader之前用空格替换空值/垃圾。

回答

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度之间,或者州代码必须在状态查找表中。根据验证的复杂性,您可能会有更多的流程将数据移动到其他临时表以应用更严格的验证规则集。

+0

垃圾数据为'\ 0',随机字节位于真实数据之后。我接受了关于'Stip_NonNumeric'清理函数的建议:**创建或替换函数StripJunkData(strDat,char) 返回字符 是 开始 返回substr(strDat,1,instr(strDat,chr(0)) - 1 ); 结束; **它似乎工作,感谢您的帮助。 – MatthewToday 2011-02-04 04:06:32

1

“A列应包含 '9930027130',将显示长度(修剪(COL))= 14:垃圾数据的4字节”

做一个SELECT DUMP(COL),以确定奇怪的字符。然后决定是否总是无效,在某些情况下有效或有效,但解释错误。