2011-02-04 3 views
0

Мне предоставлен экспорт данных DB2 (около 7 ГБ) с соответствующими файлами управления DB2. Моя цель - загрузить все данные в базу данных Oracle. Я почти преуспел в этом - я взял путь преобразования файлов управления в файлы SQL * Loader CTL, и он работал по большей части.Загрузить данные DB2 в базу данных Oracle - исправление данных мусора

Однако некоторые из файлов данных содержат терминаторы и нежелательные данные в некоторых столбцах, которые загружаются в базу данных, что вызывает очевидные проблемы с сопоставлением данных. Например, столбец должен содержать «9930027130», будет отображаться длина (обрезка (col)) = 14: 4 байта нежелательных данных.

Мой вопрос в том, что это лучший способ устранить эти мусорные данные из системы? Я надеюсь, что это простое дополнение к CTL-файлу, которое позволяет ему заменить мусор с пробелами - в противном случае я могу думать только о написании сценария, который анализирует данные и заменяет nulls/junk пробелами перед запуском SQL * Loader.

ответ

2

Что именно, это ваше определение «мусор»?

Если вы знаете, что столбец должен содержать только 10 символов данных, например, вы можете добавить NULLIF(LENGTH(<<column>>) > 10) в свой файл управления. Если вы знаете, что столбец должен содержать только числовые символы (или алфавитно-цифровые символы), вы можете написать очистительную функцию пользовательских данных (т.е. STRIP_NONNUMERIC) и называют, что из файла управления, т.е.

COLUMN_NAME position(1:14) CHAR "STRIP_NONNUMERIC(:LAST_NAME)", 

В зависимости от ваших требований, они функции очистки и логика очистки могут стать довольно сложными. В хранилищах данных, которые загружают и очищают большие объемы данных каждую ночь, данные обычно перемещаются по серии промежуточных таблиц, так как применяются последовательные раунды чистки данных и правила проверки, а не попытки загрузить и очистить все данные за один шаг , Общим подходом было бы, например, загрузить все данные в столбцы VARCHAR2 (4000) без очистки с помощью SQL * Loader (или внешних таблиц). Затем у вас будет отдельный процесс, перемещающий данные в промежуточную таблицу с правильными типами данных. NULL-вывод данных, которые не могут быть преобразованы (т. Е. Нечисловые данные в столбце NUMBER, невозможные даты и т. Д.). Другой процесс придет и перенесет данные в другую промежуточную таблицу, где вы применяете правила домена - такие вещи, как номер социального страхования, должны быть 9 цифр, широта должна быть между -90 и 90 градусов или код состояния должен быть в таблице поиска состояния. В зависимости от сложности проверок у вас может быть больше процессов, которые перемещают данные в дополнительные табличные таблицы, чтобы применять все более строгие наборы правил проверки.

+0

Данные мусора были «\ 0» и случайными байтами, соответствующими реальным данным. Я принял ваш совет по функции очистки Stip_NonNumeric: ** создать или заменить функцию StripJunkData (strDat in char) return char is начало return substr (strDat, 1, instr (strDat, chr (0)) - 1); end; ** Кажется, что это работает, спасибо за вашу помощь. – MatthewToday

1

"колонна должна содержать '9930027130', покажет длину (обрезки (цв)) = 14:. 4 байта данных бросовых"

Выполните ВЫБЕРИТЕ DUMP (Col), чтобы определить, странные символы. Затем решите, являются ли они всегда недействительными, действительными в некоторых случаях или действительными, но неправильно интерпретированными.