Как я могу обрезать данные, чтобы они поместились в поле, используя 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: слишком большое значение для столбца COMMENTS (фактическое: 11477, максимальное: 4000)

Запись 31994: отклонено — ошибка в таблице LOG_COMMENT, столбце COMMENTS. ORA-12899: слишком большое значение для столбца COMMENTS (фактическое: 16212, максимальное: 4000)

Запись 44063: отклонено — ошибка в таблице LOG_COMMENT, столбец COMMENTS. ORA-12899: слишком большое значение для столбца COMMENTS (фактическое: 62433, максимальное: 4000)

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


person John    schedule 30.06.2010    source источник


Ответы (2)


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

person pinichi    schedule 07.10.2010

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

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

правильный синтаксис. используя sqldr 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)

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

COMMENTS CHAR(2000000000) 

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

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

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

person ShoeLace    schedule 19.02.2016