sql loader- файлы с возвратом каретки, загрузкой перевода строки в oracle с cr/lf
У меня есть извлечение данных с сервера SQL, где данные в большинстве столбцов имеют возврат каретки и перевод строки. Мне нужно загрузить их в оракула с помощью возврата каретки и перевода строки; в основном я должен отразить данные SQL Server 2012 в Oracle 11g.
ниже приведен пример моего файла извлечения
[#BOR#][#EOC#]109[#EOC#]4[#EOC#]testdata_Duplicate[#EOC#]testdata_Duplicate из чата [# EOC#] этого
является
carriage return field[#EOC]test2[#EOR#]
Здесь [# EOC#] - разделитель столбцов, [#EOR#] - разделитель строк. [#BOR#] указывает начало строки. Первоначально мои загрузки не удалось из-за пустых строк в плоском файле (извлечение данных). Затем я использовал [# BOR #] с оператором continueIf preserve, чтобы sqlldr не обрабатывал пустые строки (cr/lf) как физическую строку.
с [# BOR #] в качестве столбца-заполнителя моя загрузка работает нормально, но возврат каретки или перевод строки не загружаются в таблицы оракула.
Мой файл CTL, как показано ниже
load data
truncate
CONTINUEIF NEXT preserve (1:7) <> "[#BOR#]"
into table sch1.tbl1
fields terminated by '[#EOC#]'
trailing nullcols (
field filler,
a_id integer external,
h_id integer external,
title char(128),
descn char(4000),
risk char(4000),
comment char(4000) terminated by '[#EOR#]')
В оракуле sch1.tbl1 столбец таблицы риска имеет данные как "это поле возврата каретки" вместо "это
является
carriage return field'
Я попытался заменить char(10) на строку [#crlF#] и использовать функцию замены в ctl, как показано ниже
load data
truncate
CONTINUEIF NEXT preserve (1:7) <> "[#BOR#]"
into table sch1.tbl1
fields terminated by '[#EOC#]'
trailing nullcols (
field filler,
a_id integer external,
h_id integer external,
title char(128),
descn char(4000),
risk char(4000) "replace(:risk,[#crlf#],chr(10))"
comment char(4000) terminated by '[#EOR#]')
ошибка загрузчика sql, сообщающая, что SQL*Loader-309: строка SQL не разрешена как часть спецификации поля; Я считаю, потому что мои столбцы типа данных CLOB, я не могу использовать функцию замены.
Пожалуйста, помогите мне загрузить данные с сервера sql с помощью cr/lnFeed в таблицы Oracle с помощью sqlloader. Заранее спасибо.
1 ответ
Вот решение, которое работает для меня. Вместо замены возврата каретки / перевода строки (cr/lf) в извлеченном плоском файле на [#crlF#] я сохраняю cr / lf в извлеченном файле данных. А затем я изменил свой файл ctl для обработки cr / lf с предложением INFILE с именем файла и " str '\n' ". Для Unix env нам нужно \ n, где для окон мы можем использовать \ n или \ r \ n.
увидеть ниже
load data INFILE 'filename.dat' "str '\n'"
truncate
CONTINUEIF NEXT preserve (1:7) <> "[#BOR#]"
into table sch1.tbl1
fields terminated by '[#EOC#]'
trailing nullcols (
field filler,
a_id integer external,
h_id integer external,
title char(128),
descn char(4000),
risk char(4000),
comment char(4000) terminated by '[#EOR#]')
Я проверил это, и данные были загружены с помощью cr \ lf. Мне нужно провести более детальное тестирование, так как на данный момент я проверил одну таблицу, у меня есть еще много. Между тем, если у кого-то есть лучшее решение, я был бы более чем счастлив попробовать.