Перегрузка текстов 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
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
Дата: 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".