我正在尝试从包含日期列的.xlsx电子表格中导入数据。在这些列中,日期以DD-MON-YY格式显示(例如:20-AUG-12)。
运行导入向导时,一切正常,直到必须精确调整列/字段映射。我有一个免责声明,说所选格式与表字段定义不匹配(我的字段是日期字段)。插入脚本的示例:
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:无效月份01843。00000-“无效月份”
如您所见,格式是匹配的,我不知道问题出在哪里…有想法的人吗?
编辑:我的日期语言参数设置为“法语”。我可以将其更改为“ AMERICAN”吗?
尽管您正在使用to_date
正确的格式模型来将其显式转换为日期,但仍然ORA-01843
似乎出现了问题NLS_DATE_LANGUAGE
。在这里阅读更多有关它的信息。
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的已编辑问题-
我的日期语言参数设置为“法语”。我可以将其更改为“ AMERICAN”吗?
从文档开始,
以下是设置NLS参数的方法。 注意优先顺序。
我试图从包含日期列的.xlsx电子表格中导入数据。在这些列中,日期以DD-MON-YY格式显示(例如:20-aug-12)。 编辑:我的约会语言匹配器设置为“法语”。我可以改成“美国”吗?
下面是我的Oracle过程中的代码: 有什么想法吗?
其中为 附言。我知道那里有安全问题,但现在不是问题。
如果在批处理过程中发生错误,Oracle JDBC驱动程序将引发BatchUpdateException。使用NamedParameterJdbcDaoSupport插入数据,如下所示 由于唯一密钥约束,我遇到BatchUpdateException,我们正在处理数百万条记录,因此我们无法进入数据库检查唯一密钥。 如果一条记录失败,那么批插入不会失败。
我试图将日期值插入到oracle数据库中,但它抛出java.sql.sqldataexception:ORA-01843:不是一个有效的月份。发生的最奇怪的事情是,当我打开oracle仪表板并在sql命令中执行相同的查询时,它完全工作,但当试图从java执行查询时,它启动了异常 这是我的密码 我确信问题来自查询,所有属性值都是正确的
问题内容: 我用来解析形式的字符串。 如果我尝试解析一个大于12的月份的字符串,而不是失败,它将延续到下一年。完全可运行的复制: 我宁愿抛出。 是否有任何非hacky方式强制发生异常?我的意思是,我不想手动检查月份是否大于12。这太荒谬了。 感谢您的任何建议。 注意:我已经了解Joda Time,但是我需要在没有外部库的普通JDK中完成此操作。 问题答案: 您需要使其不宽容。从而, 应该这样做。