sqlldr:ORA-01861:literal与格式字符串不匹配

时间:2014-03-19 16:14:07

标签: oracle sql-loader

我正在使用Oracle' ORA-01861:文字与格式字符串不匹配'将简单(YYYY-MM-DD)格式的日期字符串加载到Oracle 11g中时:

我的桌子DDL是:

CREATE TABLE fp_basic_dividends (
fs_perm_sec_id VARCHAR(20) NOT NULL,
"DATE" DATE NOT NULL,
currency CHAR(3) NOT NULL,
adjdate DATE NOT NULL,
p_divs_pd FLOAT(53) NOT NULL,
p_divs_paydatec DATE NULL,
p_divs_recdatec DATE NULL,
p_divs_s_spinoff CHAR(1) NOT NULL,
p_divs_s_pd FLOAT(53) NULL,
PRIMARY KEY (fs_perm_sec_id, "DATE"));

我的sqlldr ctl文件是:

load data
append
into table fp_basic_dividends
fields terminated by "|" optionally enclosed by '"'
TRAILING NULLCOLS
(
FS_PERM_SEC_ID CHAR(20),
"DATE" DATE "YYYY-MM-DD",
CURRENCY CHAR(3),
ADJDATE DATE "YYYY-MM-DD",
P_DIVS_PD FLOAT,
P_DIVS_PAYDATEC DATE "YYYY-MM-DD",
P_DIVS_RECDATEC DATE "YYYY-MM-DD",
P_DIVS_S_SPINOFF,
P_DIVS_S_PD FLOAT
)

示例数据是:

"XXXXRR-S-US"|1997-09-30|"UAH"|1997-09-30|.0126400003|1997-10-01|1997-09-29|"0"|

结果日志文件内容为:

Table FP_BASIC_DIVIDENDS, loaded from every logical record.
Insert option in effect for this table: APPEND
TRAILING NULLCOLS option in effect

   Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
FS_PERM_SEC_ID                      FIRST    20   |  O(") CHARACTER            
"DATE"                               NEXT     *   |  O(") DATE YYYY-MM-DD      
CURRENCY                             NEXT     3   |  O(") CHARACTER            
ADJDATE                              NEXT     *   |  O(") DATE YYYY-MM-DD      
P_DIVS_PD                            NEXT     4           FLOAT                
P_DIVS_PAYDATEC                      NEXT     *   |  O(") DATE YYYY-MM-DD      
P_DIVS_RECDATEC                      NEXT     *   |  O(") DATE YYYY-MM-DD      
P_DIVS_S_SPINOFF                     NEXT     *   |  O(") CHARACTER            
P_DIVS_S_PD                          NEXT     4           FLOAT                

Record 1: Rejected - Error on table FP_BASIC_DIVIDENDS, column P_DIVS_PAYDATEC.
ORA-01861: literal does not match format string

我做错了什么?非常感谢任何帮助

1 个答案:

答案 0 :(得分:4)

我认为问题出在PD_DIVS_PD FLOAT,上。

看起来你在数据文件中拥有的是真正的字符数据(VARCHAR),而不是固定长度的二进制表示。

要让SQL * Loader从字符表示转换,我认为数据类型必须被限定为EXTERNAL,例如:

PD_DIVS_PD FLOAT EXTERNAL, 

以下是我的想法......我认为SQL * Loader正在为PD_DIVS_PD FLOAT字段提取四个字节,

'.012'

将其视为角色,他没有将其视为值1.2E-02。他将这四个字节视为FLOAT的内部二进制表示(符号位,指数的特定位数,尾数的特定位数)。

然后,对于下一个字段,他从下一个位置开始,然后选择'6400003'(直到下一个字段分隔符),然后尝试将其转换为DATE。 / p>