2012-04-30 46 views
8

Tôi có một tập tin SQL Loader Control,Lỗi trình tải SQL: "Trường độ dài thay đổi vượt quá độ dài tối đa".

LOAD DATA 
INFILE 'test.txt' 
INTO TABLE TEST replace 
fields terminated "|" optionally enclosed by '"' TRAILING NULLCOLS 
(DOCUMENTID INTEGER(10), 
    CUSTID INTEGER(10), 
    USERID INTEGER(10), 
    FILENAME VARCHAR(255), 
    LABEL VARCHAR(50), 
    DESCRIPTION VARCHAR(2000), 
    POSTDATE DATE "YYYY-MM-DD HH24:MI:SS" NULLIF POSTDATE="", 
    USERFILENAME VARCHAR(50), 
    STORAGEPATH VARCHAR(255) 
) 

và nó đem lại cho tôi một lỗi khi tôi chạy SQL Loader trên nó,
Record 1: Rejected - Error on table TEST, column FILENAME. Variable length field exceeds maximum length.

Dưới đây là hàng đó .. chiều dài của cột đó là cách dưới 255 ..

1|5001572|2|/Storage/Test/5001572/test.pdf|test.pdf||2005-01-13 11:47:49||

Và đây là một kỳ quặc tôi nhận thấy bên trong file log

Column Name | Position | Len | Term | Encl | Datatype
FILENAME | NEXT | 257 | | | VARCHAR

tôi xác định độ dài như 255 trong cả hai bàn của tôi và control file. Tuy nhiên, đăng nhập spits nó ra như 257? Tôi đã cố gắng gõ xuống chiều dài trong tập tin điều khiển đến 253, do đó, nó xuất hiện như 255 trong tập tin đăng nhập, nhưng cùng một vấn đề.

Bất kỳ trợ giúp nào? Điều này đã làm phiền tôi trong hai ngày nay.

Cảm ơn.

Trả lời

13

Không xác định trường dữ liệu của bạn là VARCHAR2 và INTEGER. Sử dụng CHAR. Hầu hết thời gian, khi tải dữ liệu từ một tập tin văn bản, bạn muốn sử dụng CHAR, hoặc có thể là DATE, mặc dù ngay cả khi được chuyển đổi từ một dạng văn bản. Hầu hết thời gian bạn thậm chí không cần một specifier độ dài. Chiều dài mặc định cho một lĩnh vực CHAR là 255. control file của bạn sẽ giống như:

LOAD DATA 
INFILE 'test.txt' 
INTO TABLE TEST replace 
fields terminated "|" optionally enclosed by '"' TRAILING NULLCOLS 
(DOCUMENTID, 
CUSTID, 
USERID , 
FILENAME, 
LABEL, 
DESCRIPTION CHAR(2000), 
POSTDATE DATE "YYYY-MM-DD HH24:MI:SS" NULLIF POSTDATE="", 
USERFILENAME, 
STORAGEPATH) 
+1

Và .. đó là nó. Chỉ định độ dài với char cũng không làm điều đó cho tôi, nhưng những gì bạn đã đăng hoạt động hoàn hảo. Cảm ơn bạn! – tjsimmons

5

+1 cho DCookie, nhưng để mở rộng trên rằng điều quan trọng để phân biệt giữa các loại dữ liệu như quy định trong một bảng và dữ liệu các loại trong tệp kiểm soát trình tải SQL * vì chúng có nghĩa là những thứ khá khác nhau, gây nhầm lẫn.

Bắt đầu bằng cách xem documentation và lưu ý rằng khi tải các tệp văn bản thông thường, bạn cần phải sử dụng loại dữ liệu "di động".

Varchar là một "phi di động" loại, trong đó:

... consists of a binary length subfield followed by a character string of the specified length

Vì vậy, khi DCookie nói, CHAR là điều để đi cho, và INTEGER EXTERNAL là một SQL * kiểu dữ liệu Loader rất thường được sử dụng mà bạn có thể muốn chỉ định cho DOCUMENTID, v.v.

+1

Cảm ơn! Tôi cũng sẽ ghi nhớ điều đó. Tôi không nhận ra rằng họ là hai điều riêng biệt - tôi cho rằng họ nên toán. Trường con có độ dài nhị phân + chiều dài được chỉ định giải thích tại sao 255 cũng trở thành 257. – tjsimmons

+1

+1, Đồng ý với David tại đây. Sự khác biệt giữa thông số kỹ thuật loại tệp điều khiển Trình tải SQL và thông số kỹ thuật trong các bảng của chúng luôn có vẻ gây nhầm lẫn cho mọi người. Tôi không nghĩ rằng tôi đã từng sử dụng bất cứ điều gì ngoài CHAR và DATE trong tập tin điều khiển. – DCookie

+0

Nhân tiện, bạn có biết tại sao có những loại khác nhau trong các tập tin và bảng điều khiển không? – ady

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