2012-03-24 111 views
0
SQL> desc FLIGHTS; 
Name          Null? Type 
----------------------------------------- -------- ---------------------------- 
FLNO            NUMBER(38) 
FROM            VARCHAR2(64) 
TO             VARCHAR2(64) 
DISTANCE           NUMBER(38) 
DEPARTS           DATE 
ARRIVES           DATE 
PRICE            FLOAT(63) 

數據文件:的Oracle SQL SQLLDR無法正確導入

99,Los Angeles,Washington D.C.,2308,2005/04/12 09:30,2005/04/12 21:40,235.98 
13,Los Angeles,Chicago,1749,2005/04/12 08:45,2005/04/12 20:45,220.98 
346,Los Angeles,Dallas,1251,2005/04/12 11:50,2005/04/12 19:05,225.43 
387,Los Angeles,Boston,2606,2005/04/12 07:03,2005/04/12 17:03,261.56 

和SQLLDR控制文件:

LOAD DATA INFILE 'flights.txt' 
INTO TABLE Flights 
    FIELDS TERMINATED BY "," 
    (FLNO 
    , FROM 
    , TO 
    , DISTANCE 
    , DEPARTS 
    , ARRIVES 
    , PRICE) 

從錯誤日誌中的exerpt:

Table FLIGHTS, loaded from every logical record. 
Insert option in effect for this table: INSERT 

    Column Name     Position Len Term Encl Datatype 
------------------------------ ---------- ----- ---- ---- --------------------- 
FLNO        FIRST  * ,  CHARACTER    
FROM         NEXT  * ,  CHARACTER    
TO         NEXT  * ,  CHARACTER    
DISTANCE        NEXT  * ,  CHARACTER    
DEPARTS        NEXT  * ,  CHARACTER    
ARRIVES        NEXT  * ,  CHARACTER    
PRICE        NEXT  * ,  CHARACTER    

Record 1: Rejected - Error on table FLIGHTS, column FROM. 
ORA-01747: invalid user.table.column, table.column, or column specification 

我不知道我的SQL有什麼問題,但我假設它是因爲FROM條目?

回答

2

首先,調用列fromto是一個壞主意,它們是關鍵詞。像origindestination可能會更好...

其次,float,這真的不是必要的。你需要價格到63位小數的機會是遙遠的。像number(18,2)應該是綽綽有餘(實際上是荒謬的),但如果你想絕對最大使用number(38,2)

我最後的回答是你的數據文件。如果可能的話讓你的供應商改變這一點。逗號分隔的文件只是要求麻煩......數據中逗號的方式太多了。如果你能擁有它,|¬分隔它更好,因爲它們很少用在文本中。

根據您的NLS_PARAMETERS,不能保證文件中的日期將被更改爲表中所需的日期。這是最好的入境明確指定爲這樣的數據庫這樣的:

LOAD DATA 
INFILE 'flights.txt' 
INTO TABLE Flights 
    FIELDS TERMINATED BY "," 
    (FLNO 
    , FROM 
    , TO 
    , DISTANCE 
    , DEPARTS "to_date(:departs,'yyyy/mm/dd hh24:mi')" 
    , ARRIVES "to_date(:arrives,'yyyy/mm/dd hh24:mi')" 
    , PRICE DECIMAL EXTERNAL 
    ) 

請注意,我也改變了PRICE成十進制,如果你看看你的日誌文件,一切都是假想一個字符,這意味着你'正在進行隱式轉換,這可能無法保證。

爲什麼你得到了你的具體錯誤信息?我其實不知道。我也懷疑這是因爲你有一個名爲FROM的專欄。根據control file documentation,沒有SQL * Loader關鍵字from,所以我只能認爲這是SQL * Loader與Oracle通信的一些問題。

這是another good resource on syntax

+0

非常感謝:)我的工作! – 2012-03-25 01:40:35