1

我在通过 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",""

我面临两个问题-

  1. 第二条记录被插入,但表中的 mp_id 不同,因为表中插入的值不是 1083,而是一个完全不同的数字,这似乎是由序列生成的,尽管我没有提到任何序列控制文件。

  2. 第一条记录无法加载,出现以下错误:

记录 1:拒绝 - 表 EQ_MP_STAGING、列 CREATION_TMSTMP 上的错误。ORA-01841: (完整)年份必须介于 -4713 和 +9999 之间,而不是 0

有人可以帮助我朝着正确的方向前进,以便我可以调试这些问题吗?

4

3 回答 3

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",
于 2012-06-22T09:52:21.730 回答
1

更改mp_id表明您在表上有一个插入触发器,该触发器mp_staging始终从序列中设置 ID。如果需要指定 ID 值的能力,触发器可以检查传递的是否:new.mp_id为空,如果是则只分配序列值。您还需要检查该序列是否设置为高于您正在加载的任何值,否则您以后可能会遇到冲突。

于 2012-06-22T11:02:26.870 回答
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 )
于 2012-06-22T12:35:57.050 回答