【问题标题】:Issues with loading data through SQL Loader通过 SQL 加载器加载数据的问题
【发布时间】:2012-06-22 09:45:33
【问题描述】:

我在通过 SQL 加载器加载 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

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

【问题讨论】:

    标签: oracle sql-loader


    【解决方案1】:

    秒和毫秒之间的分隔符是 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",
    

    【讨论】:

    • 但是为什么一个记录被加载,而另一个失败。尽管如此,我尝试了你的建议,但仍然得到同样的错误
    • 顺便说一句,这不会导致记录失败。您可以用逗号指定格式并用点指定实际数据,它将毫无问题地加载。我只是试过了!
    【解决方案2】:

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

    【讨论】:

    • 是的,这是我第一次想到的。但是,系统中没有触发器。我刚刚创建了这个临时表来加载数据。此外,当我手动插入记录时,ID 被保留: INSERT INTO mp_staging (mp_id) VALUES(123);这将插入一条 MP_ID 为 123 的记录
    【解决方案3】:

    好的,我发现了错误。这都与控制文件定义有关。我所要做的就是删除数据类型声明。 据我所知,当您指定数据类型时,您必须指定字段的限制。我试图指定 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 )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      相关资源
      最近更新 更多