2012-09-21 66 views
1

我的數據是這樣的:這個Oracle CTL文件或數據有什麼問題?

ID,SCORE_DATE,TYPE,SCORE,RAW_SCORE,RANK 
A1234,2012-09-05 23:59:59,FOOTBALL_TEAM_MIDDLE_AND_OLD_1234,10,0.123,1 
A5678,2012-09-05 23:59:59,FOOTBALL_TEAM_MIDDLE_AND_OLD_1234,20,0.456,2 

CTL FILE:

load data   
infile 'E:\Data\Sample.csv' 
badfile 'E:\Data\Sample.bad' 
APPEND into table TABLE1  
fields terminated by "," optionally enclosed by '"' 
TRAILING NULLCOLS    
( 
DRIVER, 
STARTDTE "to_date(SUBSTR(:STARTDTE,1,10),'YYYY-MM-DD') - 27", 
TYPE CONSTANT 'FOOTBALL', 
SCORE , 
RANKSCORE ":SCORE", 
RANK , 
ENDDTE "to_date(SUBSTR(:STARTDTE,1,10),'YYYY-MM-DD')", 
LOADDT  "sysdate" 
) 

這裏是我的表結構:

CREATE TABLE "TABLE1" 
    (
    "DRIVER" VARCHAR2(50 BYTE), 
    "STARTDTE" DATE, 
    "SCORE"   NUMBER, 
    "ENDDTE" DATE, 
    "TYPE" VARCHAR2(20 BYTE), 
    "RANK"  NUMBER, 
    "RANKSCORE" NUMBER, 
    "LOADDT"  VARCHAR2(20 BYTE) 
); 

我收到的每一行的錯誤信息加載: 記錄3:拒絕 - 表格1,列SCORE出錯。 ORA-01722:無效號碼

什麼問題?

回答

1
  1. TYPE是一個oracle關鍵字,你最好不要使用這樣的列名。

  2. 表定義中沒有TYPE列。如果該列存在,則在讀取完所有字段後,將常量分配移至控制文件的末尾。

    STARTDTE 「TO_DATE(SUBSTR(:STARTDTE,1,10), 'YYYY-MM-DD') - 27」, 類型常量 '足球', 得分,

而且如果你想忽略了「FOOTBALL_TEAM_MIDDLE_AND_OLD_1234」作爲數據領域,你需要

THIRD_COLUMN FILLER, 

添加到您的控制文件忽略該數據。就像..

load data   
infile 'E:\Data\Sample.csv' 
badfile 'E:\Data\Sample.bad' 
APPEND into table TABLE1  
fields terminated by "," optionally enclosed by '"' 
TRAILING NULLCOLS    
( 
DRIVER, 
STARTDTE "to_date(SUBSTR(:STARTDTE,1,10),'YYYY-MM-DD') - 27", 
THIRD_COLUMN FILLER, 
SCORE , 
RANKSCORE ":SCORE", 
RANK , 
ENDDTE "to_date(SUBSTR(:STARTDTE,1,10),'YYYY-MM-DD')", 
LOADDT  "sysdate" 
TYPE CONSTANT 'FOOTBALL', 
) 

應該修復你得到的錯誤。

+0

Rajesh - 對不起,這是一個錯字,表中有一個TYPE列。你能解釋一下「FILLER1 FILLER」部分嗎?我想插入一個常量'FOOTBALL'而不是數據文件中的值。 – Ram

+0

如果您想要忽略文件中的第三列,則需要指定該列被忽略。這可以使用關鍵字「FILLER」完成。編輯我的答案。 –

+0

Rajesh,第三列是TYPE。我只想忽略我在數據文件中獲得的數據,並插入'FOOTBALL'.THIRD_COLUMN不是一個單獨的列而不是TYPE。 – Ram