2013-03-06 1 views
0

Клиентский сайт предоставил нам следующий файл экстента для загрузки в нашу базу данных.Oracle SQL loader - загрузка несогласованных форматов даты в том же столбце

Проблема в том, что для некоторых строк (например, вторая строка) CREATED_DATE и LAST_UPDATE_DATE находятся в формате даты «dd Mmm YYYY ...», когда остальные строки (например, верхние) находятся в формате из "YYYY-MM-DD HH24.MI.SSXFF"

PRIMARY_ID ID VALUE  CREATED_DATE   LAST_UPDATE_DATE 
20166267 20834830491 2012-04-30 08:18:00 2012-04-30 08:18:00 
20166536 9112   01 Oct 2010 17:27:04 01 Oct 2010 17:27:04 

Мои вопросы: Q1. Чтобы избежать необходимости запрашивать экстракт, можно ли манипулировать этими датами «dd Mmm YYYY ...» во время импорта в SQL Loader с использованием сценария .ctl? В настоящее время мой .ctl является

Мой файл .ctl является сценарий для импорта с помощью:

IDENTIFIER_START_DATE TIMESTAMP "YYYY-MM-DD HH24.MI.SSXFF", 
LAST_UPDATE_DATE  TIMESTAMP "YYYY-MM-DD HH24.MI.SSXFF" 

Q2. Просто спрашивает их о повторном извлечении со всеми форматами дат в соответствии с лучшей практикой в ​​таких ситуациях?

+2

Вы можете загрузить в промежуточную таблицу как столбцы varchar и преобразовать оттуда (или использовать внешнюю таблицу). Не уверен, что вы можете многое сделать в .ctl. Меня беспокоят менее очевидные проблемы в других столбцах или даже - хотя это не похоже на проблему из образца - путаница между мм/дд и дд/мм, что может привести к тонкому повреждению или сбоям. Я не думаю, что неразумно ожидать разумные данные. Разумность не всегда приходит к нему, конечно ... –

ответ

2

Независимо от того, требуется ли повторное извлечение данных, зависит от ряда факторов.

  • Это одноразовый процесс или постоянная передача данных? Может быть вполне разумно попытаться сделать все возможное с одноразовой загрузкой данных, где легче выявить выбросы. Если вы собираетесь управлять текущим фидом данных, обычно имеет смысл договориться о строгом стандарте для файла, а не пытаться вручную проверять проблемные строки.
  • Есть ли у клиента стимул сделать процесс загрузки простым и повторяемым? Или клиент продавался по фиксированной цене для загрузки данных в любом формате, который они хотят предоставить? Если у клиента есть стимул сделать процесс загрузки простым и повторяемым, имеет смысл потратить время на создание чистого файла. Если вы продали им фиксированную цену за любую работу, которую нужно сделать, чтобы превратить файл в согласованные данные, с другой стороны, они, вероятно, не будут рады, если вы нажмете на них много работы.
  • Есть ли строки, где данные неоднозначны? Например, «01-02-03» может ссылаться на 2 января 2003 года или 2 января 1903 года или 3 февраля 2001 года или на другие даты. Если есть двусмысленность, имеет смысл запросить повторный извлечение.

Что касается загрузки данных, в то время как это возможно сделать за один шаг, вы, как правило, не захотите. Как правило, имеет смысл загружать данные в промежуточную таблицу (или использовать внешнюю таблицу), где все столбцы объявляются как VARCHAR2, а затем записывать некоторую логику ETL, которая преобразует данные в соответствующие типы данных (и регистрирует ошибки для данные, которые не могут быть преобразованы). Например, если вы загрузили данные в промежуточную таблицу, где все столбцы были определены как VARCHAR2, вы можете использовать что-то вроде my_to_date function in this thread, чтобы попробовать несколько различных масок формата, чтобы найти ту, которая работает (если есть много возможных масок , вы можете захотеть итерации по коллекции, а не жесткого кодирования двух масок, как это было в этом примере).

Еще одна точка ... Oracle DATE хранит время до второго, которое, по-видимому, является точностью данных, которые вы даете. Поэтому было бы разумнее загрузить данные в столбец DATE, а не в столбец TIMESTAMP.

1

Используйте это.ctl-скрипт:

load data 
append 
into table schema_name.table_name 
fields terminated by ';' optionally enclosed by '"' 
(
PRIMARY_ID, 
ID_VALUE, 
CREATED_DATE "to_date(:CREATED_DATE, case when regexp_substr(:CREATED_DATE,'\w+',1,2)=regexp_substr(:CREATED_DATE,'\d+',1,2) then 'YYYY-MM-DD HH24:MI:SS' else 'dd Mon YYYY HH24:MI:SS' end)", 
LAST_UPDATE_DATE "to_date(:LAST_UPDATE_DATE, case when regexp_substr(:LAST_UPDATE_DATE,'\w+',1,2)=regexp_substr(:LAST_UPDATE_DATE,'\d+',1,2) then 'YYYY-MM-DD HH24:MI:SS' else 'dd Mon YYYY HH24:MI:SS' end)" 
) 
Смежные вопросы