Oracle SQL插入Cats表遇ORA-01861错误求助
ORA-01861错误排查:日期格式不匹配问题
问题详情
向Cats表插入数据时持续触发错误:
ORA-01861: literal does not match format string ORA-06512: at "SYS.DBMS_SQL", line 1721
使用的插入语句:
INSERT INTO Cats VALUES ('JACEK','M','CAKE','CATCHING','BALD','2008-12-01',67,NULL,2);
Cats表结构:
CREATE TABLE Cats ( name VARCHAR2(15) CONSTRAINT cat_name_nn NOT NULL, gender VARCHAR2(1) CONSTRAINT cat_gen_ch CHECK (gender IN('M', 'W')), nickname VARCHAR2(15) CONSTRAINT cat_pk PRIMARY KEY, function VARCHAR2(10), chief VARCHAR2(15), in_herd_since DATE DEFAULT SYSDATE CONSTRAINT cat_inherd_nn NOT NULL, mice_ration NUMBER(3), mice_extra NUMBER(3), band_no NUMBER(2), CONSTRAINT cat_banno_fk FOREIGN KEY (band_no) REFERENCES Bands(band_no), CONSTRAINT cat_chief_fk FOREIGN KEY (chief) REFERENCES Cats(nickname), CONSTRAINT cat_fun_fk FOREIGN KEY (function) REFERENCES Functions(function) );
错误原因
ORA-01861的核心问题是日期字面量格式与Oracle当前使用的日期格式不匹配。插入语句中in_herd_since字段传入的是'2008-12-01'(YYYY-MM-DD格式),但Oracle默认的日期格式(由NLS_DATE_FORMAT参数控制)通常是DD-MON-RR(比如01-DEC-08)或DD/MM/YYYY这类格式,直接传入YYYY-MM-DD字符串会导致解析失败。
解决方案
方法1:用TO_DATE函数显式转换格式
这是最稳妥、兼容性最好的方式,直接指定日期字符串的格式,不受系统NLS参数影响:
INSERT INTO Cats VALUES ('JACEK','M','CAKE','CATCHING','BALD',TO_DATE('2008-12-01','YYYY-MM-DD'),67,NULL,2);
方法2:修改会话级日期格式
如果需要多次使用YYYY-MM-DD格式插入数据,可以临时修改当前会话的NLS_DATE_FORMAT参数:
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
执行这条语句后,原插入语句就能正常运行。
方法3:修改系统级日期格式(谨慎操作)
若要让所有会话默认使用YYYY-MM-DD格式,可修改系统级NLS_DATE_FORMAT,但需要DBA权限,且会影响所有用户的日期解析,非必要不推荐。
内容的提问来源于stack exchange,提问作者Miguel Ramalho
相关产品推荐
相关产品推荐

