在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.或PM / P.M。需要
当我从插入中删除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
);
答案 0 :(得分:8)
我能看到重现这一点的唯一直接方法是改变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运行脚本。
答案 1 :(得分:1)
TO_TIMESTAMP()
有第三个参数,可让您在插入本身中指定NLS_DATE_LANGUAGE。
create table a ( tstamp timestamp );
Table created.
insert into a
values (to_timestamp( '20-08-12 01.09.53.271000000 AM'
, 'DD-MM-RR HH.MI.SS.FF PM'
, 'nls_date_language = ENGLISH'));
1 row created.
select *
from a;
TSTAMP
------------------------------------------------------
20-AUG-12 01.09.53.271000
您不需要更改会话的日期语言,也不需要在之后将其更改。
答案 2 :(得分:0)
没有任何数据可供查看我无法确定但听起来像你的“大SQL文件”并不总是(或有时)以您期望的格式使用{{1}的时间戳}或AM
。
尝试使用24小时制而非PM
或AM
,看看它是否与“大SQL文件”中的数据匹配:
PM