Перегрузка текстов c разрывами строк из MySQL в Oracle

maiorshin
Дата: 06.12.2007 13:36:07
Есть веб-приложение на MySQL, решили переходить на Oracle. В приложении есть текстовые поля (например, комментарии), в которые может вноситься длинный текст, естесственно какие-то предложения могут начинаться с новой строки. Соответственно в базу сохраняются и разделительные символы.

Выгружаются данные с помощью mysqldump, по умолчанию разделителем полей является <TAB>, никаких кавычек. Пробую загружать данные с помощью sqlloader и возникла следующая проблема:

При выполнении загрузки sqlloader воспринимает разделительные символы в тексте как окончание записи, говорит что нет данных для следующего поля и пытается с этого места грузить следующую запись, что соответственно тоже приводит к некорректной работе.

Как можно это побороть? Может нужно как-то использовать экранирующие символы? Но тогда придется при выгрузке данных делать массовые замены в полученном файле, причем для многих таблиц, и пока точно непонятно в скольких таблицах это может встретиться.
andrey_anonymous
Дата: 06.12.2007 13:40:25
установите корректный терминатор строки.
maiorshin
Дата: 06.12.2007 13:45:48
А можно поподробнее? Каким параметром это выставляется?
По умолчанию как я понимаю стоит разрыв строки. А так можно ставить любой символ? Но они же тоже могут все использоваться?
semenar
Дата: 06.12.2007 13:57:13
Oracle® Database Utilities
Обратить внимание на:
FIELDS TERMINATED BY ''
Mikst
Дата: 06.12.2007 14:04:12
maiorshin
А можно поподробнее? Каким параметром это выставляется?
По умолчанию как я понимаю стоит разрыв строки. А так можно ставить любой символ? Но они же тоже могут все использоваться?


Тогда ответьте на простой вопрос: как определить где кончается многострочное поле и где начинается следующая запись?
maiorshin
Дата: 06.12.2007 14:52:12
Вот в том то и загвоздка..
Разделителем полей является Tab, запись заканчивается грубо говоря Enter'ом. Получается когда символ этого Enter'а встречается в тексте, то он воспинимается как окончание строки. Если даже поменять разделитель полей или ограничить поле кавычками, то ничего не изменится. Т.е. остается менять символ окончания строки?? А это уже как я понимаю параметр операционки??

Для наглядности проблемы могу привести конкретный пример:

Возьмем простую таблицу:

create table comments
(
comment_id numeric(3),
comment_text varchar2(255),
user_id numeric(3)
);


Контрол-файл для загрузки имеет следующий вид:

LOAD DATA
INFILE 'comments.txt'
APPEND
INTO TABLE COMMENTS
FIELDS TERMINATED BY X'09'
(COMMENT_ID,
COMMENT_TEXT,
USER_ID)

Файл с тестовыми данными прикладываю

лоадер запускаю следующим образом:
sqlldr CONTROL='comments.CTL' USERID=user/password
Elic
Дата: 06.12.2007 14:58:20
maiorshin
Файл с тестовыми данными прикладываю
RTFM Assembling Logical Records from Physical Records (FAQ)
maiorshin
Дата: 06.12.2007 16:50:19
Спасибо, это уже похоже на то что нужно, но как я понимаю, данная функция подходит только если известна конкретная позиция символа, на который будет проверка. В данном же случае я не могу это определить заранее.

Или я что-то не так понял?
Elic
Дата: 06.12.2007 16:55:07
maiorshin
только если известна конкретная позиция символа, на который будет проверка. В данном же случае я не могу это определить заранее.
RTFM CONTINUEIF LAST (FAQ)
maiorshin
Дата: 06.12.2007 18:06:30
Спасибо за помощь, пока криво, но хоть как-то начало загружаться.
Если просто указываю "\\", то тогда в строке появляется этот символ "\"

Однако, если пробую указать для сравнения шестнадцатиричное значение символа переноса строки или возврата каретки, выдается ошибка "CONTINUEIF LAST must be non-whitespace"

И как сделать сравнение с последовательностью из этих 2-х символов?
В указанном документе сказано, что X'1FB033 would represent the three bytes with values 1F, B0, and 33. Но когда я пытаюсь указать оба символа, то выдается ошибка "Comparison text of CONTINUEIF LAST must have length 1 not 2".