Oracle sqlldr трейлинг NULLCOLS требуется, но почему?

у меня есть заумная проблема sqlldr, которая меня беспокоит. Мой файл управления выглядит примерно так:

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, я получаю ошибку "столбец не найден до конца логической записи". Но хотя некоторые столбцы имеют значение null, запятые все есть, поэтому я не вижу причин для sqlldr неправильно интерпретировать входной файл и не доходить до конца, где он генерирует идентификатор из последовательность баз данных.

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

у меня это работает, я просто хочу понять, почему!?!

5 ответов


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

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.


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


проблема здесь в том, что вы определили 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 для всех вариантов


попробуйте дать 5 ', ' в каждой строке, аналогично строке Номер 4.


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

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