我正在使用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
我做错了什么?非常感谢任何帮助
答案 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>