2010-10-12 12 views
15

Mam kłopotliwy problem z sqlldr, który mnie niepokoi. Mój plik kontrola wygląda mniej więcej tak:Wymagane Oracle sqlldr TRAILING NULLCOLS, ale dlaczego?

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" 
) 

danych jest mniej więcej tak:

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

Jeśli nie umieścić NULLCOLS spływu w, otrzymuję „kolumny nie znaleziono przed końcem logiczne błąd nagrywania. Ale chociaż niektóre kolumny mają wartość null, przecinki są tam wszystkie, więc nie widzę powodu, dla którego sqlldr błędnie zinterpretuje plik wejściowy i nie dojdzie do końca, w którym generuje identyfikator z sekwencji bazy danych.

Ta składnia działała wcześniej bez zerowych kolumn - dlaczego kolumna null powoduje, że sqlldr nie osiąga wygenerowanej kolumny?

Mam to działa, chcę tylko zrozumieć DLACZEGO!?!

+2

Bo Larry tak powiedział, to dlatego. Takie jest zamierzone zachowanie. –

+0

Jest ok, że jest przeznaczony, po prostu chcę zrozumieć mechanikę tego. – orbfish

Odpowiedz

14

Masz zdefiniowane 5 pól w swoim pliku kontrolnym. Twoje pola kończą się przecinkami, więc potrzebujesz 5 przecinków w każdym rekordzie dla 5 pól, chyba że podano TRAILING NULLCOLS, nawet jeśli ładujesz pole ID wartością sekwencji za pomocą ciągu SQL.

RE: Komentarz przez OP

To nie jest moje doświadczenie z krótkim teście. Z następującym pliku kontrolnego:

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,, 
,,,,, 

Produkowane następujący wynik:

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. 

pamiętaj, że jedyny wiersz, który został prawidłowo załadowany miał 5 przecinków. Nawet trzeci wiersz, ze wszystkimi wartościami danych oprócz ID, dane nie ładują się. Chyba że czegoś brakuje ...

Używam 10gR2.

+0

To nie jest tak, ponieważ jeśli dane mają zawsze 4 pola (ale nie 5 przecinków, a nawet 4), nie ma potrzeby stosowania NULLCOLS TRAILING. Chociaż jesteś na czymś, to prawie ma sens ... – orbfish

+0

Nie udało się tego potwierdzić, ale nie jest fair utrzymywanie twoich punktów w oczekiwaniu .... – orbfish

0

Spróbuj dając 5 „” w każdym wierszu, podobny do linii numer 4.

3

ostatnia kolumna w pliku wejściowym musi mieć pewne dane w nim (czy to przestrzeń lub char, ale nie null). Wydaje mi się, że pierwszy rekord zawiera wartość null za ostatnim "," którego sqlldr nie rozpozna, chyba że zostanie poproszony o rozpoznanie wartości null za pomocą opcji TRAILING NULLCOLS. Alternatywnie, jeśli nie chcesz używać TRAILING NULLCOLS, będziesz musiał zająć się tymi NULL przed przekazaniem pliku do sqlldr. Mam nadzieję, że to pomaga

0

miałem podobny problem, gdy miałem mnóstwo dodatkowych rekordów w pliku csv z pustymi wartościami.Jeśli otworzyć plik CSV w notatniku wówczas puste linie wygląda następująco: ,,,, ,,,, ,,,, ,,,,

Nie widać tych czy otwarty w programie Excel. Sprawdź Notatnik i usuń te zapisy.

Powiązane problemy