Как я могу усечь данные, чтобы уместить их в поле, используя SQL*Loader? (ОР-12899)

Используя Oracle SQL*Loader, я пытаюсь загрузить столбец переменной строки (lob) в другой базе данных в столбец varchar2(4000) в Oracle. У нас есть строки намного длиннее 4000 символов, но все согласились с тем, что эти строки могут и должны быть усечены при переносе (мы рассмотрели данные, которые выходят за пределы 4000 символов, это не имеет смысла). Для этого я указал столбец таким образом в контрольном файле:

COMMENTS CHAR(65535) "SUBSTR(:COMMENTS, 1, 4000)",

Однако SQL * Loader по-прежнему отклоняет любую строку, в которой эта запись длиннее 4000 символов в файле данных:

Запись 6484: отклонено - ошибка таблицы LOG_COMMENT, столбец COMMENTS. ORA-12899: слишком большое значение для столбца КОММЕНТАРИИ (фактическое значение: 11477, максимальное: 4000)

Запись 31994: отклонено - ошибка таблицы LOG_COMMENT, столбец COMMENTS. ORA-12899: слишком большое значение для столбца КОММЕНТАРИИ (фактическое значение: 16212, максимальное значение: 4000)

Запись 44063: отклонено - ошибка таблицы LOG_COMMENT, столбец COMMENTS. ORA-12899: слишком большое значение для столбца КОММЕНТАРИИ (фактическое значение: 62433, максимальное: 4000)

Я попытался взять намного меньшую подстроку и все еще получил ту же ошибку. Как я могу изменить свой контрольный файл, чтобы обрезать строковые данные длиннее 4000 символов в столбец varchar2(4000)?

2 ответа

Убедитесь, что ваши данные ENCODING и Oracle ENCODING не конфликтуют. В этом случае используйте опцию CHARACTERSET при загрузке.

По всем счетам

COMMENTS CHAR(65535) "SUBSTR(:COMMENTS, 1, 4000)",

правильный синтаксис используя sqlldr 11.2.0.1, он успешно работает для меня вплоть до точки, где столбец входной записи> 4000, где я получаю

ORA-01461: can bind a LONG value only for insert into a LONG column

если я переключаюсь на прямую загрузку, то получаю ошибку smae, как и вы.

ORA-12899: value too large for column COMMENTS (actual: 4005, maximum: 4000)

в конце я разделил его на 2 этапа загрузки. Теперь у меня есть промежуточная таблица со столбцом типа CLOB, который я загружаю с

COMMENTS CHAR(2000000000) 

который затем вставляется в главную таблицу eth с

insert into propertable
select dbms_lob.substr(comments,1,4000)
from staging_table;

надеюсь, что это полезно

Другие вопросы по тегам