在 SQL Developer 中,我创建了一个导出 .sql 文件(一个非常大的文件)。它包含数百个插入,如:
"Insert into SCHEMA.TABLE (
... ,
CREATEDATE,
MODIFIEDDATE,
....
)
values (
... ,
to_timestamp('20-AUG-12 01.09.53.271000000 AM','DD-MON-RR HH.MI.SS.FF AM'),
to_timestamp('20-AUG-12 01.09.53.271000000 PM','DD-MON-RR HH.MI.SS.FF PM'),
...
);"
当我在 SQL Developer 中运行它时,它工作正常。但是我无法使用 SQL Developer 导入一点 .sql 文件(或者我不知道该怎么做)。
当我使用 SQL*Plus 运行它时,出现以下错误:
ORA-01855: AM/A.M. or PM/P.M. required
当我从插入中删除 AM/PM 关键字时,SQL*Plus 可以插入行,但没有运气。 AM/PM 有什么问题?
这是确切的插入命令:
Insert into SCHEMA.TABLE(
ENTRYID,GROUPID,COMPANYID,USERID,USERNAME,CREATEDATE,MODIFIEDDATE,
CLASSNAMEID,CLASSPK,CLASSUUID,VISIBLE,STARTDATE,ENDDATE,PUBLISHDATE,
EXPIRATIONDATE,MIMETYPE,TITLE,DESCRIPTION,SUMMARY,URL,HEIGHT,WIDTH,
PRIORITY,VIEWCOUNT
) values (
11902,11005,10136,10178,'Test Test',
to_timestamp('20-AUG-12 01.09.53.271000000 AM','DD-MON-RR HH.MI.SS.FF AM'),
to_timestamp('20-AUG-12 01.09.53.271000000 PM','DD-MON-RR HH.MI.SS.FF PM'),
10076,11900,'AAA',1,null,null,null,null,null,
'ABC','XyZ',null,null,0,0,0,2563
);
最佳答案
我可以看到重现此问题的唯一直接方法是更改 NLS 设置;但不是 NLS_LANGUAGE
因为这也会影响错误消息。如您所料,使用英语是可以的:
SQL> alter session set NLS_DATE_LANGUAGE='ENGLISH';
Session altered.
SQL> select value from nls_session_parameters
2 where parameter = 'NLS_DATE_LANGUAGE';
VALUE
--------------------------------------------------------------------------------
ENGLISH
SQL> insert into t42 (createddate)
2 values (to_timestamp('20-08-12 01.09.53.271000000 AM','DD-MM-RR HH.MI.SS.FF PM'));
1 row created.
改变只是
NLS_DATE_LANGUAGE
重现您的错误:alter session set NLS_DATE_LANGUAGE='SLOVAK';
Session altered.
SQL> insert into t42 (createddate)
2 values (to_timestamp('20-AUG-12 01.09.53.271000000 AM','DD-MON-RR HH.MI.SS.FF PM'));
values (to_timestamp('20-AUG-12 01.09.53.271000000 AM','DD-MON-RR HH.MI.SS.FF PM'))
*
ERROR at line 2:
ORA-01855: AM/A.M. or PM/P.M. required
换
NLS_LANGUAGE
,直接或通过影响它的东西,也会使错误消息显示不同:SQL> alter session set NLS_LANGUAGE = 'SLOVAK';
Relácia zmenená.
SQL> insert into t42 (createddate)
2 values (to_timestamp('20-AUG-12 01.09.53.271000000 AM','DD-MON-RR HH.MI.SS.FF PM'));
values (to_timestamp('20-AUG-12 01.09.53.271000000 AM','DD-MON-RR HH.MI.SS.FF PM'))
*
ERROR v riadku 2:
ORA-01855: vy¿aduje sa AM/A.M. alebo PM/P.M.
您需要一种仍能识别
AUG
的语言作为有效月份,但不使用 AM
/PM
;斯洛伐克语似乎符合要求,所以我猜这可能是您来自哪里。其他语言也可以这样做。 NLS_LANGUAGE
时的错误信息有点奇怪仍然设置显示 AM/PM,到但 to_char(sysdate, 'HH AM')
表示消息错误。只有 NLS_DATE_LANGUAGE
无论如何将消息设置为英语(例如,尝试使用土耳其语,但您必须更改月份名称或切换使用月份数字)并且它始终显示 AM/PM。如果发生这种情况,请更改
NLS_DATE_LANGUAGE
在运行这个脚本之前先改成英文;或者在导出之前更改您的 SQL Developer 设置以使用斯洛伐克语(或您实际使用的任何内容) - 这有望使导出使用 DOPOLUDNIE
/POPOLUDNIE
,尽管如果没有,我也不会感到惊讶;或更改 SQL Developer NLS_TIMESTAMP_FORMAT
导出时使用 24 小时制(以及 4 位年份和月份数字而不是名称),这将完全避免该问题。当然,或者从 SQL Developer 运行脚本。
关于Oracle 插入时间戳 - AM/A.M.或下午/下午必需的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20700694/