2009-04-01 34 views
5

Bảng T1 Cấu trúc: số col1, số col2SQL Loader: Load thành 2 bảng từ 1 controlfile và 1 CSV

Bảng T2 Cấu trúc: số col1, số col2, số col3

tập tin csv:

row1:1,2,3,4,5,6 
row2:1,2,3,4,5,6 

tôi muốn dữ liệu trong bảng T1 như:

col1 col2 
===== ==== 
1  3 
1  3 

tôi muốn dữ liệu trong bảng T2 như:

col1 col2 col3 
===== ==== ==== 
1  3  5 
1  3  5 

control file sau không hoạt động

load data 
infile * 
insert into table T1 fields terminated by ',' TRAILING NULLCOLS 
(col1,fill1 filler,col2) 
insert into table T2 fields terminated by ',' TRAILING NULLCOLS 
(col1,fill2 filler,col2,fill3 filler,col3) 
begindata 
1,2,3,4,5,6 
1,2,3,4,5,6 

Xin hãy giúp tôi để giải quyết vấn đề này.

+0

gì phiên bản của sql là điều này? thêm một thẻ xin vui lòng –

+0

Xin vui lòng chấp nhận bất kỳ câu trả lời nếu nó giải quyết vấn đề của bạn .. Nó sẽ giúp những người khác ... –

Trả lời

0

Hãy thử điều này:

LOAD DATA 
INFILE * 
INSERT INTO TABLE T1 FIELDS TERMINATED BY ',' TRAILING NULLCOLS 
(COL1, FILL2 FILLER, COL2, FILL4 FILLER, FILL5 FILLER, FILL6 FILLER) 
INSERT INTO TABLE T2 FIELDS TERMINATED BY ',' TRAILING NULLCOLS 
(COL1, FILL2 FILLER, COL2, FILL3 FILLER, COL3, FILL6 FILLER) 
BEGINDATA 
1,2,3,4,5,6 
1,2,3,4,5,6 
+0

xin lỗi nó không hoạt động –

+0

Nó nói gì? – Quassnoi

+0

xem phản hồi của tôi (dưới đây và hy vọng sớm được ở trên). Nhiều mệnh đề INTO yêu cầu bạn phải thiết lập lại con trỏ lô-gic, nếu không bạn sẽ thấy 4,5,6 đi vào t2. Lệnh position() sẽ đặt lại con trỏ. Việc tải dữ liệu vị trí vào nhiều bảng trở nên dễ dàng hơn vì lý do này. –

2

này không làm việc nhưng tôi không thích giải pháp này. Tôi thích sử dụng các bảng bên ngoài trong những tình huống này. Câu trả lời ngắn gọn là bạn gặp vấn đề vì SQLLDR không tự động quét lại dữ liệu trên nhiều hàng nhập khẩu. Một đoạn trích từ tài liệu sau.

From the SQLLDR documentation

Sử dụng Vị trí với nhiều tải Bảng

Trong một tải bảng nhiều, bạn có thể chỉ định nhiều VÀO BẢNG khoản. Khi bạn chỉ định POSITION () cho cột đầu tiên của bảng đầu tiên, vị trí được tính tương đối so với đầu của bản ghi logic. Khi bạn chỉ định POSITION () cho cột đầu tiên của các bảng tiếp theo, vị trí được tính tương đối so với cột cuối cùng của bảng cuối cùng được tải.

Do đó, khi mệnh đề INTO TABLE tiếp theo bắt đầu, vị trí không được đặt tự động vào đầu bản ghi logic. Điều này cho phép nhiều mệnh đề INTO TABLE xử lý các phần khác nhau của cùng một bản ghi vật lý. Ví dụ, xem Extracting Multiple Logical Records.

Bản ghi logic có thể chứa dữ liệu cho một trong hai bảng, nhưng không chứa cả hai. Trong trường hợp này, bạn sẽ đặt lại POSITION. Thay vì bỏ qua đặc tả vị trí hoặc sử dụng POSITION (* + n) cho trường đầu tiên trong mệnh đề INTO TABLE, sử dụng POSITION (1) hoặc POSITION (n).

load data 
    infile * 
    truncate 
    into table T1 
    fields terminated by ',' trailing nullcols 
    (col1 
    , fill1 filler 
    , col2 ) 
    into table T2 
    fields terminated by ',' trailing nullcols 
    (col1 position(1) 
    , filler filler 
    , col2  
    , filler2 filler 
    , col3) 

BEGINDATA 
1,2,3,4,5,6 
1,2,3,4,5,6 

SQL> select * From t1; 

     COL1  COL2 
---------- ---------- 
     1   3 
     1   3 

SQL> select* From t2; 

     COL1  COL2  COL3 
---------- ---------- ---------- 
     1   3   5 
     1   3   5 
+0

Cảm ơn Neil +1 về mã chi tiết của bạn và đặc biệt cho vị trí col1 (1) –

2

Hãy thử điều này

LOAD DATA 
INFILE * "STR '|EndRec|'" 
INSERT INTO TABLE T1 FIELDS TERMINATED BY ',' TRAILING NULLCOLS 
(COL1, FILL2 FILLER, COL2, FILL4 FILLER, FILL5 FILLER, FILL6 FILLER) 
INSERT INTO TABLE T2 FIELDS TERMINATED BY ',' TRAILING NULLCOLS 
(COL1 POSITION(1), FILL2 FILLER, COL2, FILL3 FILLER, COL3, FILL6 FILLER) 

BEGINDATA 
1,2,3,4,5,6|EndRec|1,2,3,4,5,6|EndRec| 
Các vấn đề liên quan