2010-10-12 40 views
15

Tôi có một vấn đề sqlldr abstruse mà làm phiền tôi. tập tin kiểm soát của tôi trông giống như sau:Oracle sqlldr TRAILING NULLCOLS được yêu cầu, nhưng tại sao?

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

dữ liệu là một cái gì đó như thế này:

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

Nếu tôi không đưa NULLCOLS Trailing trong, tôi nhận được "cột không tìm thấy trước khi kết thúc logic không ghi nhận kỷ lục. Nhưng mặc dù một số cột là null, dấu phẩy là tất cả ở đó, vì vậy tôi không thấy lý do sqlldr giải thích sai tệp đầu vào và không đến cuối nơi tạo ID từ chuỗi cơ sở dữ liệu.

Cú pháp này đã hoạt động trước khi không có cột trống - tại sao cột trống làm cho sqlldr không tiếp cận được cột được tạo?

Tôi đã làm việc đó, tôi chỉ muốn hiểu TẠI SAO!?!

+2

Vì Larry đã nói vậy, đó là lý do. Đó là hành vi dự định. –

+0

Nó là ok mà nó dự định, tôi chỉ muốn hiểu cơ chế của nó. – orbfish

Trả lời

14

Bạn đã xác định 5 trường trong tệp điều khiển của mình. Các trường của bạn được chấm dứt bằng dấu phẩy, vì vậy bạn cần 5 dấu phẩy trong mỗi bản ghi cho 5 trường trừ khi TRAILING NULLCOLS được chỉ định, ngay cả khi bạn đang tải trường ID với giá trị chuỗi thông qua Chuỗi SQL.

RE: Nhận xét của OP

Đó không phải là kinh nghiệm của tôi với thử nghiệm ngắn gọn. Với các tập tin sau đây kiểm soát:

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

Được sản xuất đầu ra sau đây:

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. 

Lưu ý rằng hàng duy nhất mà nạp đúng cách có 5 dấu phẩy. Ngay cả hàng thứ 3, với tất cả các giá trị dữ liệu có mặt ngoại trừ ID, dữ liệu không tải. Trừ khi tôi bỏ lỡ điều gì đó ...

Tôi đang sử dụng 10gR2.

+0

Đó không phải là như vậy, bởi vì nếu dữ liệu luôn luôn có 4 trường (nhưng không phải 5 dấu phẩy, hoặc thậm chí 4), bạn không cần TRAILING NULLCOLS. Mặc dù bạn đang lên một cái gì đó ở đó, nó gần như có ý nghĩa .... – orbfish

+0

Đã không thể xác nhận điều này, nhưng nó không công bằng để giữ cho điểm của bạn chờ đợi .... – orbfish

0

Cố gắng đưa ra 5 '' trong mỗi dòng, tương tự như dòng số 4.

3

cột cuối trong tập tin đầu vào của bạn phải có một số dữ liệu trong đó (có thể là không gian hoặc char, nhưng không phải null). Tôi đoán, bản ghi đầu tiên chứa null sau lần cuối cùng ',' mà sqlldr sẽ không nhận ra trừ khi được yêu cầu cụ thể để nhận dạng null bằng cách sử dụng tùy chọn TRAILING NULLCOLS. Ngoài ra, nếu bạn không muốn sử dụng TRAILING NULLCOLS, bạn sẽ phải chăm sóc những NULL đó trước khi bạn chuyển tệp vào sqlldr. Hy vọng điều này sẽ giúp

3

Vấn đề ở đây là bạn đã xác định ID là trường trong tệp dữ liệu của bạn khi bạn muốn sử dụng biểu thức mà không có bất kỳ dữ liệu nào từ tệp dữ liệu. Bạn có thể khắc phục điều này bằng cách định nghĩa ID như là một biểu (hoặc một chuỗi trong trường hợp này)

ID EXPRESSION "ID_SEQ.nextval" 

hoặc

ID SEQUENCE(count) 

Xem: http://docs.oracle.com/cd/B28359_01/server.111/b28319/ldr_field_list.htm#i1008234 cho tất cả các tùy chọn

0

Tôi có vấn đề tương tự khi tôi đã có nhiều bản ghi bổ sung trong tệp csv có giá trị trống.Nếu tôi mở file csv bằng notepad sau đó dòng trống trông như thế này: ,,,, ,,,, ,,,, ,,,,

Bạn không thể nhìn thấy những nếu mở trong Excel. Vui lòng kiểm tra trong Notepad và xóa các bản ghi đó

Các vấn đề liên quan