Требуется Oracle sqlldr TRAILING 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

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

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

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

Ответы

Ответ 1

В файле управления вы определили 5 полей. Ваши поля заканчиваются запятой, поэтому вам нужно 5 запятых в каждой записи для 5 полей, если не указано TRAILING NULLCOLS, даже если вы загружаете поле идентификатора с помощью значения последовательности через строку 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.

Ответ 2

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

Ответ 4

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

Ответ 5

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

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