Oracle 插入失败:不是有效的月份
Oracle insert failure : not a valid month
我正在尝试从包含日期列的 .xlsx 电子表格导入数据。在这些列中,日期以 DD-MON-YY 格式显示(例如:20-AUG-12)。
当我运行使用导入向导时,一切正常,直到我必须精确 columns/fields 映射。我有一个免责声明说所选格式与 table 字段定义不匹配(我的字段是日期字段)。插入脚本示例:
INSERT INTO simulation
(simulation_id,
simulation_name,
sim_start_date,
sim_end_date,
status,
last_run_date,
moddat,
modusr,
notification_email)
VALUES (251.0,
'Proposal Test',
To_date('01-DEC-11', 'DD-MON-YY'),
To_date('31-DEC-11', 'DD-MON-YY'),
'C',
To_date('09-AUG-12', 'DD-MON-YY'),
To_date('09-AUG-12', 'DD-MON-YY'),
'Brent Weintz',
'bweintz@carlsonwagonlit.com');
当我尝试 运行 此查询时,出现以下错误:
ORA-01843: not a valid month
01843. 00000 - "not a valid month"
如您所见,格式是匹配的,我不知道问题出在哪里...有什么想法吗?
编辑:我的日期语言参数设置为 "FRENCH"。我可以将其更改为 "AMERICAN" 吗?
虽然您正在使用 to_date
和正确的格式模型来显式转换为日期,但仍然得到 ORA-01843
似乎问题出在 NLS_DATE_LANGUAGE
上。阅读更多相关信息 here。
SQL> DROP TABLE t PURGE;
Table dropped.
SQL> CREATE TABLE t(A DATE);
Table created.
SQL> ALTER SESSION SET NLS_DATE_LANGUAGE='FRENCH';
Session altered.
SQL> SELECT * FROM nls_session_parameters WHERE parameter = 'NLS_DATE_LANGUAGE';
PARAMETER VALUE
-------------------- ----------
NLS_DATE_LANGUAGE FRENCH
SQL> INSERT INTO t VALUES(to_date('01-jan-2012','dd-mon-yyyy'));
INSERT INTO t VALUES(to_date('01-jan-2012','dd-mon-yyyy'))
*
ERROR at line 1:
ORA-01843: not a valid month
所以,我遇到了 NLS_DATE_LANGUAGE 不正确的错误。我们将其设置为 AMERICAN。
SQL> ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';
Session altered.
SQL> SELECT * FROM nls_session_parameters WHERE parameter = 'NLS_DATE_LANGUAGE';
PARAMETER VALUE
-------------------- ----------
NLS_DATE_LANGUAGE AMERICAN
SQL> INSERT INTO t VALUES(to_date('01-jan-2012','dd-mon-yyyy'));
1 row created.
SQL>
更新 到 OP 的编辑问题 -
My date language paramater is set to "FRENCH". Can I change it to "AMERICAN" ?
来自documentation,以下是设置NLS参数的方法。注意优先顺序。
尝试指定NLS_DATE_LANGUAGE as a paremeter for the TO_DATE函数。
INSERT INTO simulation
(simulation_id,
simulation_name,
sim_start_date,
sim_end_date,
status,
last_run_date,
moddat,
modusr,
notification_email)
VALUES (251.0,
'Proposal Test',
To_date('01-DEC-11', 'DD-MON-YY', 'NLS_DATE_LANGUAGE = AMERICAN'),
To_date('31-DEC-11', 'DD-MON-YY', 'NLS_DATE_LANGUAGE = AMERICAN'),
'C',
To_date('09-AUG-12', 'DD-MON-YY', 'NLS_DATE_LANGUAGE = AMERICAN'),
To_date('09-AUG-12', 'DD-MON-YY', 'NLS_DATE_LANGUAGE = AMERICAN'),
'Brent Weintz',
'bweintz@carlsonwagonlit.com');
当然,如果你要执行几个查询,你可以用alter session来改变它。
我正在尝试从包含日期列的 .xlsx 电子表格导入数据。在这些列中,日期以 DD-MON-YY 格式显示(例如:20-AUG-12)。
当我运行使用导入向导时,一切正常,直到我必须精确 columns/fields 映射。我有一个免责声明说所选格式与 table 字段定义不匹配(我的字段是日期字段)。插入脚本示例:
INSERT INTO simulation
(simulation_id,
simulation_name,
sim_start_date,
sim_end_date,
status,
last_run_date,
moddat,
modusr,
notification_email)
VALUES (251.0,
'Proposal Test',
To_date('01-DEC-11', 'DD-MON-YY'),
To_date('31-DEC-11', 'DD-MON-YY'),
'C',
To_date('09-AUG-12', 'DD-MON-YY'),
To_date('09-AUG-12', 'DD-MON-YY'),
'Brent Weintz',
'bweintz@carlsonwagonlit.com');
当我尝试 运行 此查询时,出现以下错误:
ORA-01843: not a valid month 01843. 00000 - "not a valid month"
如您所见,格式是匹配的,我不知道问题出在哪里...有什么想法吗?
编辑:我的日期语言参数设置为 "FRENCH"。我可以将其更改为 "AMERICAN" 吗?
虽然您正在使用 to_date
和正确的格式模型来显式转换为日期,但仍然得到 ORA-01843
似乎问题出在 NLS_DATE_LANGUAGE
上。阅读更多相关信息 here。
SQL> DROP TABLE t PURGE;
Table dropped.
SQL> CREATE TABLE t(A DATE);
Table created.
SQL> ALTER SESSION SET NLS_DATE_LANGUAGE='FRENCH';
Session altered.
SQL> SELECT * FROM nls_session_parameters WHERE parameter = 'NLS_DATE_LANGUAGE';
PARAMETER VALUE
-------------------- ----------
NLS_DATE_LANGUAGE FRENCH
SQL> INSERT INTO t VALUES(to_date('01-jan-2012','dd-mon-yyyy'));
INSERT INTO t VALUES(to_date('01-jan-2012','dd-mon-yyyy'))
*
ERROR at line 1:
ORA-01843: not a valid month
所以,我遇到了 NLS_DATE_LANGUAGE 不正确的错误。我们将其设置为 AMERICAN。
SQL> ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';
Session altered.
SQL> SELECT * FROM nls_session_parameters WHERE parameter = 'NLS_DATE_LANGUAGE';
PARAMETER VALUE
-------------------- ----------
NLS_DATE_LANGUAGE AMERICAN
SQL> INSERT INTO t VALUES(to_date('01-jan-2012','dd-mon-yyyy'));
1 row created.
SQL>
更新 到 OP 的编辑问题 -
My date language paramater is set to "FRENCH". Can I change it to "AMERICAN" ?
来自documentation,以下是设置NLS参数的方法。注意优先顺序。
尝试指定NLS_DATE_LANGUAGE as a paremeter for the TO_DATE函数。
INSERT INTO simulation
(simulation_id,
simulation_name,
sim_start_date,
sim_end_date,
status,
last_run_date,
moddat,
modusr,
notification_email)
VALUES (251.0,
'Proposal Test',
To_date('01-DEC-11', 'DD-MON-YY', 'NLS_DATE_LANGUAGE = AMERICAN'),
To_date('31-DEC-11', 'DD-MON-YY', 'NLS_DATE_LANGUAGE = AMERICAN'),
'C',
To_date('09-AUG-12', 'DD-MON-YY', 'NLS_DATE_LANGUAGE = AMERICAN'),
To_date('09-AUG-12', 'DD-MON-YY', 'NLS_DATE_LANGUAGE = AMERICAN'),
'Brent Weintz',
'bweintz@carlsonwagonlit.com');
当然,如果你要执行几个查询,你可以用alter session来改变它。