背景

最近接手一个老系统,DB使用的是Oracle,很多流程都是用了存储过程和函数。现在不是很熟悉,虽然以前在大学的时候学习Oracle,后面再也没有碰过。现在感慨,知识学了没有用,但一旦需要用到的时候,会发现至少了解一点,不至于那么被动。所以多学习一点技术或者其他生活知识,都是十分必要的,说不定哪天就用上了。

问题描述

在看书的时候,敲入书中的代码,一条简单插入语句,如下:

1
INSERT INTO EMP VALUES (7521, 'WARD', 'SALESMAN', 7698,TO_DATE('22-FEB-1981', 'DD-MON-YYYY'), 1250,  500, 30);

提示:ORA-01843: 无效的月份

解决方法

看了一下Oracle中关于 TO_DATE函数的文档1

The default date format is determined implicitly by the NLS_TERRITORY initialization parameter or can be set explicitly by the NLS_DATE_FORMAT parameter.

在Datetime格式2中也进行了说明:

The default datetime format template is specified either explicitly with the initialization parameter NLS_DATE_FORMAT or implicitly with the initialization parameter NLS_TERRITORY. You can change the default datetime formats for your session with the ALTER SESSION statement.
  1. 方法一:
1
INSERT INTO EMP VALUES (7521, 'WARD', 'SALESMAN', 7698,TO_DATE('22-FEB-1981', 'DD-MON-YYYY''NLS_DATE_LANGUAGE = American'), 1250,  500, 30);

但是需要修改每条语句,比较麻烦,方法二可以批量搞定。

  1. 方法二:

修改当前会话的所使用的语言,具体如下,然后再执行所有的插入语句。

1
alter session set nls_date_language='american'

参考资料


  1. 1.https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions183.htm
  2. 2.https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_commands_1029.htm#OLADM780