2012-09-21 45 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