在将简单(YYYY-MM-DD)格式的日期字符串加载到Oracle 11g中时,我获得了Oracle 'ORA-01861:文字不匹配格式字符串‘:
我的桌子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我做错了什么?任何帮助都是非常感谢的。
发布于 2014-03-19 16:25:50
我认为问题在于PD_DIVS_PD FLOAT,。
看起来,您在数据文件中拥有的是真正的字符数据(VARCHAR),而不是固定长度的二进制表示。
要使SQL*Loader从字符表示形式转换,我认为必须将数据类型限定为EXTERNAL,例如:
PD_DIVS_PD FLOAT EXTERNAL, 这是我认为正在发生的事情..。我认为SQL*Loader为PD_DIVS_PD FLOAT字段收集了整整四个字节,
'.012'他没有把它看作是一个角色,也没有把它看作是一个价值1.2E-02。他将这四个字节看作浮点数的内部二进制表示(位表示符号,一定数量的位表示指数,一定数量的位表示尾数)。
然后,对于下一个字段,他将从下一个位置开始,获取'6400003' (直到下一个字段分隔符),然后尝试将其转换为日期。
https://stackoverflow.com/questions/22511874
复制相似问题