Oracle sqlldr:ORA-01861:文本与格式字符串不匹配

Oracle sqlldr:ORA-01861:文本与格式字符串不匹配,oracle,sql-loader,Oracle,Sql Loader,在将简单(YYYY-MM-DD)格式的日期字符串加载到Oracle 11g中时,我得到Oracle“ORA-01861:literal与格式字符串不匹配”: 我的表格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

在将简单(YYYY-MM-DD)格式的日期字符串加载到Oracle 11g中时,我得到Oracle“ORA-01861:literal与格式字符串不匹配”:

我的表格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

我做错了什么?非常感谢您提供的任何帮助

我认为问题在于
PD\u DIVS\u PD FLOAT,

看起来数据文件中的数据实际上是字符数据(VARCHAR),而不是固定长度的二进制表示

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

PD_DIVS_PD FLOAT EXTERNAL, 

以下是我认为正在发生的事情。。。我认为SQL*Loader正在为
PD\u DIVS\u PD FLOAT
字段拾取正好四个字节

'.012'
他不认为这是一种性格,他不认为这是一种价值观
1.2E-02
。他将这四个字节视为浮点的内部二进制表示(位表示符号,一定数量的位表示指数,一定数量的位表示尾数)


然后,对于下一个字段,他从下一个位置开始,拿起
'6400003'
(直到下一个字段定界符),然后尝试将其转换为日期。

我认为问题在于
PD\u DIVS\u PD FLOAT,

看起来数据文件中的数据实际上是字符数据(VARCHAR),而不是固定长度的二进制表示

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

PD_DIVS_PD FLOAT EXTERNAL, 

以下是我认为正在发生的事情。。。我认为SQL*Loader正在为
PD\u DIVS\u PD FLOAT
字段拾取正好四个字节

'.012'
他不认为这是一种性格,他不认为这是一种价值观
1.2E-02
。他将这四个字节视为浮点的内部二进制表示(位表示符号,一定数量的位表示指数,一定数量的位表示尾数)


然后,对于下一个字段,他从下一个位置开始,拿起
'6400003'
(直到下一个字段分隔符),然后尝试将其转换为日期。

似乎你是对的。让我在真实的数据块上重新检查一下,然后我会给你一个徽章和我的“非常感谢!”=)是的,外部限定符解决了这个问题。你是天才,再次感谢你!=)@丹尼亚尔:不,不是天才,只是一个以前遇到过类似障碍的旅伴。您可能已经了解了这一点,但我认为您还需要将最后一个字段从
FLOAT
更改为
FLOAT EXTERNAL
。似乎您是对的。让我在真实的数据块上重新检查一下,然后我会给你一个徽章和我的“非常感谢!”=)是的,外部限定符解决了这个问题。你是天才,再次感谢你!=)@丹尼亚尔:不,不是天才,只是一个以前遇到过类似障碍的旅伴。您可能已经解决了这个问题,但我认为您还需要将最后一个字段从
FLOAT
更改为
FLOAT EXTERNAL