Oracle sqlldr TRAILING NULLCOLS требуется, но почему? - PullRequest
16 голосов
/ 12 октября 2010

У меня сложная проблема с 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 не достигает сгенерированного столбца?

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

Ответы [ 5 ]

14 голосов
/ 13 октября 2010

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

3 голосов
/ 17 июня 2014

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

3 голосов
/ 31 мая 2013

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

0 голосов
/ 21 марта 2017

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

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

0 голосов
/ 16 мая 2013

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

...