Не удалось импортировать большой объект в Oracle с помощью SQL Loader - PullRequest
0 голосов
/ 02 октября 2009

Я пытаюсь экспортировать из SQL Server в Oracle таблицу, которая состоит из идентификатора и действительно длинной строки XML, хранящейся как nvarchar (max).

SQL Table -- CREATE TABLE MyStuff (MyID int, MyText nvarchar(max))<br> Oracle Table -- CREATE TABLE MyStuffImported (MyID int, MyText NCLOB)

Я использую утилиту SQL Server bcp для экспорта в текстовый файл (MyStuff.bcp), который затем импортирую в Oracle через SQL Loader. Но SQL Loader дает сбой с этим сообщением: «Физическая запись в файле данных (MyStuff.bcp) длиннее максимальной (1048576)» , и 0 записей импортируются.

Я не уверен, в чем именно заключается проблема. Наиболее очевидная возможность состоит в том, что MyText длиннее максимального значения 1048576, и действительно некоторые записи, но не все, так почему же не импортировать хотя бы некоторые записи? И есть ли способ обойти это ограничение?

Другая возможность, о которой я читал на некоторых форумах, состоит в том, что в MyText есть разрывы строк, которые Oracle не может обработать. Я надеялся, что уже обошел эту проблему, (1) удалив \ r и \ n при экспорте из SQL, и (2) используя \ n в качестве разделителя записей в управляющем файле SQL Loader (полный файл см. Ниже) , Я делаю что-то неправильно или не обрабатываю все случаи?

Вот текст моего файла управления SQL Loader. Обратите внимание, что я использую \ в качестве разделителя, что кажется странным, но это единственный символ, не используемый в поле MyText. Следовательно, вы увидите \\, где я имею в виду \, потому что я избегаю этого.

LOAD DATA  
INFILE "MyStuff.bcp" "str '\\\n'"  
APPEND INTO TABLE MyStuffImported  
(  
 MyID INTEGER EXTERNAL TERMINATED BY "\\",  
 MyText CHAR TERMINATED BY "\\"  
)

Есть предложения? Возможно, есть лучший способ импортировать в NCLOB через SQL Loader?

Ответы [ 2 ]

1 голос
/ 02 октября 2009

Мне удалось решить проблему, выполнив следующие действия:

1) установка параметров READSIZE и BINDSIZE в sqlldr для изменения максимального предела 1048576 (чтобы обойти ошибку «Физическая запись в файле данных ... длиннее максимального»)
2) в моем контрольном файле задаю конкретную длину в CHAR (чтобы обойти ошибку «Поле в файле данных превышает максимальную длину»). Смотрите ниже:

LOAD DATA  
INFILE "MyStuff.bcp" "str '\\\n'"  
APPEND INTO TABLE MyStuffImported  
(  
    MyID INTEGER EXTERNAL TERMINATED BY "\\",  
    MyText CHAR(10000000) TERMINATED BY "\\"  
)
0 голосов
/ 02 октября 2009

Могу поспорить, что вы не делаете коммит после каждой записи, поэтому, как только вы получите сообщение об ошибке, и SQL Loader не выполнится, он отменит ваши предыдущие вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...