ORA-01861一次奇怪的字符串格式匹配问题

发布于:2025-03-05 ⋅ 阅读:(163) ⋅ 点赞:(0)

客户的一个生产库服务器挂了,还好有容灾数据库,在把生产库切换到容灾库后,大部分的业务都恢复了,但是有一个上传数据的应用报错:

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

这个报错呢以前遇到过好几次,基本都是date类型和字符串类型匹配的问题,

一般就是字段需要date类型的数据,但是却输入了一个字符串类型.

但是将上面报错的sql提取出来放到plsql中执行又可以正常执行:

一时间觉得很奇怪,后来想了想,业务是没有做任何变更的,数据库是dg容灾库切换为主库的,数据肯定也是和生产库完全一致的,而这是一个数据上报系统,所以我怀疑是上报的sql里面在获取到查询的数据之后,对date类型未做to_date格式化导致的报错

那为什么原来生产库没报错呢?

这里有一个nls_date_format环境变量,如果设置的格式和你上报获取的格式完全一致,是不需要to_date转换的,而如果格式不一致就需要手工to_date转换.

SQL> show parameter nls

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
nls_calendar                 string     GREGORIAN
nls_comp                 string     BINARY
nls_currency                 string     $
nls_date_format              string     DD-MON-RR
nls_date_language             string     AMERICAN
nls_dual_currency             string     $
nls_iso_currency             string     AMERICA
nls_language                 string     AMERICAN
nls_length_semantics             string     BYTE
nls_nchar_conv_excp             string     FALSE
nls_numeric_characters             string     .,
 

因此解决起来就很简单了:

设置数据库的nls_date_format环境变量即可:

SQL> alter system set nls_date_format='YYYY-MM-DD HH24:MI:SS' scope=spfile;

System altered.

再重启数据库即可

或者在你应用的开头先手工设置一下session的格式,这样就不需要重启数据库:

alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS' ;


网站公告

今日签到

点亮在社区的每一天
去签到