我在通过SQL Loader加载CSV文件时遇到了一些问题。
以下是控制文件:
LOAD DATA
INFILE 'mp.csv'
BADFILE mp.bad'
INSERT
INTO TABLE mp_staging
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
mp_id INTEGER,
mp_name CHAR,
mp_desc CHAR,
oid CHAR,
ptye_cd CHAR,
creation_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS,FF9",
modified_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS,FF9",
last_generation_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS,FF9",
deact_dt DATE,
)
以下是CSV文件中的一些示例记录:
1083,"Test3","","mills_b","PRIVATE",2000-12-06 14:29:21.17,1999-12-06 14:29:21.17,2011- 10-01 04:03:44.6
116,"Mike1","","mills_b","PRIVATE",1999-09-15 11:15:29.42,1999-09-15 11:15:59.663,2011- 10-01 04:01:23.923,,0,"F",""
我面临两个问题 -
第二条记录被插入,但表中的mp_id不同,因为在表中插入的值不是1083,而是一个完全不同的数字,这似乎是由序列生成的,尽管我有没有提到控制文件中的任何序列。
第一条记录无法加载,但出现此错误:
记录1:已拒绝 - 表EQ_MP_STAGING列错误 CREATION_TMSTMP。 ORA-01841 :(完整)年份必须在-4713和之间 +9999,而不是0
有人可以帮我正确指导,以便我可以调试这些问题吗?
答案 0 :(得分:2)
秒与毫秒之间的分隔符是CSV文件中的一个点(1999-12-06 14:29:21.17
),但格式为逗号(YYYY-MM-DD HH24:MI:SS,FF9
)
我的猜测是它可能与FIELDS TERMINATED BY ','
指令冲突。
你能试试吗?
creation_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS.FF9",
modified_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS.FF9",
last_generation_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS.FF9",
答案 1 :(得分:1)
更改mp_id
表示您在mp_staging
表上有一个插入触发器,它始终从序列中设置ID。如果需要指定ID值的能力,则触发器可以检查传递的:new.mp_id
是否为空,并且仅指定序列值。您还需要检查序列的设置是否高于您正在加载的任何值,否则您可能会在以后发生冲突。
答案 2 :(得分:0)
好的,我已经弄错了。它都与控制文件定义有关。我所要做的就是删除数据类型声明。 据我所知,当您指定数据类型时,您必须指定字段的限制。我试着指定 POSITION(*),认为这将处理可变长度字段,但我又遇到了同样的错误。
LOAD DATA
INFILE 'mp.csv'
BADFILE mp.bad'
INSERT INTO TABLE mp_staging
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
( mp_id ,
mp_name ,
mp_desc ,
oid ,
ptye_cd ,
creation_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS,FF9",
modified_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS,FF9", last_generation_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS,FF9",
deact_dt )