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