Как я могу усечь данные, чтобы уместить их в поле, используя 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;
надеюсь, что это полезно