首页 > 代码库 > ORA-01843的错误 插入日期数据时报错

ORA-01843的错误 插入日期数据时报错

当我在SQLPLUS执行 :

INSERT INTO customers (
  customer_id, first_name, last_name, dob, phone
) VALUES (
  5, ‘Doreen‘, ‘Blue‘, ‘20-MAY-1970‘, NULL
);

出现 “ORA-01843: 无效的月份 ”这个错误。 Google之后找到下面的这篇文章,其中说先执行alter session set nls_date_language=‘american‘  然后再执行以上的sql语句,问题果然解决了。但是当关闭连接,在下一次会话继续执行类似的语句是还是会报错

造成ORA-01843 无效的月份 的一些原因

  1) 当我们在一个中文环境的客户端使用如下sql语句
INSERT INTO "temptable" ( DELIVER_DATE ) VALUES (TO_DATE(‘27-Jun-2007 15:57:30‘, ‘DD-MON-YYYY HH24:MI:SS‘) )
Runtime error occurred: 1843 (ORA-01843: 无效的月份) 
    数据库会报告一个ORA-01843的错误,这是因为客户端是中文环境,格式mon就不能用英文的月份写法,必须用中文的“六月”
如果不想修改sql语句运行的话,就需要在执行该语句之前,使用alter session 命令将nls_date_language修改为american,如下:
      alter session set nls_date_language=‘american‘     --以英语显示日期

2)
      今天出现了ORA-01843的错误.这个错误代表无效的月份一般在日期转化的时候会提示。 
解决方法 
alter session set NLS_DATE_FORMAT=‘DD-MON-YY‘; 

可是今天我这样做还是不管用。实际上问题出在这里: 

Microsoft Windows XP [版本 5.1.2600] 
(C) 版权所有 1985-2001 Microsoft Corp. 
O:\>sqlplus greatfinish/finish 
SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 6月 21 19:18:00 2006 
Copyright (c) 1982, 2002, Oracle Corporation.   All rights reserved. 

连接到: 
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production 
With the Partitioning, OLAP and Oracle Data Mining options 
JServer Release 9.2.0.1.0 - Production 
greatfinish@ORA920> select to_date(‘JAN 01 1988‘,‘MON DD YYYY‘) from dual; 
select to_date(‘JAN 01 1988‘,‘MON DD YYYY‘) from dual 
                * 
ERROR 位于第 1 行: 
ORA-01843: 无效的月份 

greatfinish@ORA920> alter session set NLS_DATE_FORMAT=‘MON DD YYYY‘; 
会话已更改。 
--修改了NLS_DATE_FORMAT问题依然存在 
greatfinish@ORA920> select to_date(‘JAN 01 1988‘,‘MON DD YYYY‘) from dual; 
select to_date(‘JAN 01 1988‘,‘MON DD YYYY‘) from dual 
                * 
ERROR 位于第 1 行: 
ORA-01843: 无效的月份 
--查了一下sysdate发现原因了是客户端字符集问题 
greatfinish@ORA920> select sysdate from dual; 
SYSDATE 
------------ 
6月   21 2006 
greatfinish@ORA920> exit 
从Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production 
With the Partitioning, OLAP and Oracle Data Mining options 
JServer Release 9.2.0.1.0 - Production中断开 
O:\>set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK 
O:\>sqlplus greatfinish/finish 
SQL*Plus: Release 9.2.0.1.0 - Production on Wed Jun 21 19:20:22 2006 
Copyright (c) 1982, 2002, Oracle Corporation.   All rights reserved. 

Connected to: 
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production 
With the Partitioning, OLAP and Oracle Data Mining options 
JServer Release 9.2.0.1.0 - Production 
--修改完毕成功select 
greatfinish@ORA920> select to_date(‘JAN 01 1988‘,‘MON DD YYYY‘) from dual; 
TO_DATE(‘ 
--------- 
01-JAN-88 
greatfinish@ORA920>