2010-10-12 6 views
15

У меня проблема с sqlldr, которая меня беспокоит. Мой файл управления выглядит следующим образом:Требуется Oracle sqlldr TRAILING NULLCOLS, но почему?

load data 
infile 'txgen.dat' 
into table TRANSACTION_NEW 
fields terminated by "," optionally enclosed by '"' 
TRAILING NULLCOLS 
(A, 
    B, 
    C, 
    D, 
    ID "ID_SEQ.NEXTVAL" 
) 

данных является чем-то вроде этого:

a,b,c, 
a,b,,d 
a,b,, 
a,b,c,d 

Если я не ставлю роспускного NULLCOLS, я получаю «столбец не найден до конца логического запись ". Но хотя некоторые из столбцов являются нулевыми, все запятые есть, поэтому я не вижу причины, по которым sqlldr неправильно интерпретирует входной файл, и не добираться до конца, где он генерирует идентификатор из последовательности базы данных.

Этот синтаксис работал до этого без нулевых столбцов - почему нулевой столбец заставляет sqlldr не доходить до сгенерированного столбца?

У меня это работает, я просто хочу понять, ПОЧЕМУ!?!

+2

Потому что Ларри так сказал, вот почему. Это намеченное поведение. –

+0

Это нормально, что он предназначен, я просто хочу понять его механику. – orbfish

ответ

14

Вы определили 5 полей в управляющем файле. Ваши поля заканчиваются запятой, поэтому вам нужно 5 запятых в каждой записи для 5 полей, если не указано TRAILING NULLCOLS, даже если вы загружаете поле ID с помощью значения последовательности через SQL String.

RE: Комментарий OP

Это не мой опыт работы с кратким тестом. При следующем файле управления:

load data 
infile * 
into table T_new 
fields terminated by "," optionally enclosed by '"' 
(A, 
    B, 
    C, 
    D, 
    ID "ID_SEQ.NEXTVAL" 
) 
BEGINDATA 
1,1,,, 
2,2,2,, 
3,3,3,3, 
4,4,4,4,, 
,,,,, 

Произведенных следующий вывод:

Table T_NEW, loaded from every logical record. 
Insert option in effect for this table: INSERT 

    Column Name     Position Len Term Encl Datatype 
------------------------------ ---------- ----- ---- ---- --------------------- 
A         FIRST  * , O(") CHARACTER    
B         NEXT  * , O(") CHARACTER    
C         NEXT  * , O(") CHARACTER    
D         NEXT  * , O(") CHARACTER    
ID         NEXT  * , O(") CHARACTER    
    SQL string for column : "ID_SEQ.NEXTVAL" 

Record 1: Rejected - Error on table T_NEW, column ID. 
Column not found before end of logical record (use TRAILING NULLCOLS) 
Record 2: Rejected - Error on table T_NEW, column ID. 
Column not found before end of logical record (use TRAILING NULLCOLS) 
Record 3: Rejected - Error on table T_NEW, column ID. 
Column not found before end of logical record (use TRAILING NULLCOLS) 
Record 5: Discarded - all columns null. 

Table T_NEW: 
    1 Row successfully loaded. 
    3 Rows not loaded due to data errors. 
    0 Rows not loaded because all WHEN clauses were failed. 
    1 Row not loaded because all fields were null. 

Обратите внимание, что только строки, которые были загружены правильно 5 запятых. Даже 3-я строка со всеми значениями данных, кроме ID, данные не загружаются. Если я что-то не хватает ...

Я использую 10gR2.

+0

Это не так, потому что, если в данных всегда есть 4 поля (но не 5 запятых или даже 4), вам не нужны TRAILING NULLCOLS. Хотя вы на что-то там, это почти имеет смысл .... – orbfish

+0

Не удалось проверить это, но это несправедливо держать ваши очки в ожидании .... – orbfish

0

Try дает 5 «» в каждой строке, аналогично линии № 4.

3

Последняя колонка в вашем входном файле должны быть какие-то данные в нем (будь то пространство или символ, но не нулевой). Я предполагаю, что первая запись содержит null после последнего ',', который sqlldr не распознает, если специально не попросить распознать нули, используя параметр TRAILING NULLCOLS. Альтернативно, если вы не хотите использовать TRAILING NULLCOLS, вам нужно будет позаботиться об этих NULL, прежде чем передавать файл на sqlldr. Надеюсь, это поможет

3

Проблема в том, что вы определили ID как поле в своем файле данных, когда вы хотите просто использовать выражение без каких-либо данных из файла данных. Вы можете исправить это, определив ID как выражение (или последовательности в данном случае)

ID EXPRESSION "ID_SEQ.nextval" 

или

ID SEQUENCE(count) 

См: http://docs.oracle.com/cd/B28359_01/server.111/b28319/ldr_field_list.htm#i1008234 для всех вариантов

0

Я имел подобный вопрос, когда у меня было много дополнительных записей в csv-файле с пустыми значениями.Если открыть CSV-файл в блокноте, то пустые строки выглядит следующим образом: ,,,, ,,,, ,,,, ,,,,

Вы не можете увидеть их, если открыть в Excel. Пожалуйста, зайдите в Блокнот и удалите эти записи.

Смежные вопросы