Ошибка sqlldr из-за более чем двух двойных кавычек в столбце - PullRequest
0 голосов
/ 19 марта 2019

Проблема в том, что когда я помещаю более двух двойных кавычек в столбец NAME (проверьте код ниже), то sqlldr завершается неудачей. В файле data.txt первые 3 записи терпят неудачу, поскольку столбец NAME (вторая позиция в записи) содержит более 2 двойных кавычек. Пожалуйста помогите. Я думаю, что некоторые функции мне нужно поместить в контрольный файл для столбца NAME.

Вы можете запустить приведенный ниже код и проверить, что первые 3 записи потерпят неудачу и последняя запись будет вставлена, я хочу вставить все записи с двойной кавычкой или без нее:

--table creation
    create table employee
    (      
      name varchar2(4000)      
    );


--control file
load data
 infile '/tmp/swetabh/data.txt' 
 into table employee
 truncate
 fields terminated by "," OPTIONALLY ENCLOSED by '"'  TRAILING NULLCOLS 
 (
 name      
 )


--data.txt (SEE ALL RECORDS ARE HAVING MORE THAN 2 DOUBLE QUOTE AND WANT TO INSERT DATA TO THE TABLE WITH OR WITHOUT DOUBLE QUOTE)
""start with double quote       "
"end with double quote          ""
"double quote " in the middle   "

-bash-4.1 $ sqlldr userid = xxx / xxx @ xxxx control = / tmp / swetabh / control.txt log = / tmp / swetabh / control.log bad = / tmp / swetabh / bad.txt readsize = 2000000000 bindsize = 2000000000

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

Как насчет применения функции REPLACE, которая заменит двойную кавычку (CHR(34)) на ничего (NULL)?Кроме того, удалите OPTIONALLY ENCLOSED предложение.

Контрольный файл:

load data 
infile *
replace
into table employee
fields terminated by "," TRAILING NULLCOLS 
(
name "replace(:name, chr(34), null)"    
)

begindata
""start with double quote       "
"end with double quote          ""
"double quote " in the middle   "

Проверка:

SQL> $sqlldr scott/tiger control=test04.ctl log=test04.log

SQL*Loader: Release 11.2.0.2.0 - Production on Uto O×u 19 19:14:49 2019

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Commit point reached - logical record count 2
Commit point reached - logical record count 3

SQL> select * From employee;

NAME
--------------------------------------------------
start with double quote
end with double quote
double quote  in the middle

SQL>
0 голосов
/ 19 марта 2019

Есть ли у вас контроль над частью процесса извлечения? Если да, то можете ли вы указать, что двойные кавычки в данных удваиваются (Цитируем)? Или, что еще лучше, укажите использование труб в качестве разделителей, а не двойные кавычки.

...