在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/AM或PM/PM
当我从插入中删除AM/PM关键字时,SQL*Plus可以插入行,与它们一起,没有运气.AM/PM有什么问题?
这是确切的insert命令:
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 );
Alex Poole.. 9
我可以看到重现这一点的唯一直接方法是改变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运行脚本.
我可以看到重现这一点的唯一直接方法是改变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运行脚本.