我使用Oracle SQL Developer 18.2.0完整导出了我的数据库。
然后,我收集了所有NLS设置,以便在通过导入时应用它们
sqlplus
工具我使用以下脚本收集NLS会话值:
select 'ALTER SESSION SET ' || parameter || ' = ''' || value || ''';'
from nls_session_parameters where parameter like 'NLS_%'
ALTER SESSION SET NLS_LANGUAGE = 'LATVIAN';
ALTER SESSION SET NLS_TERRITORY = 'LATVIA';
ALTER SESSION SET NLS_CURRENCY = 'Ls';
ALTER SESSION SET NLS_ISO_CURRENCY = 'LATVIA';
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ', ';
ALTER SESSION SET NLS_CALENDAR = 'GREGORIAN';
ALTER SESSION SET NLS_DATE_FORMAT = 'RRRR.MM.DD';
ALTER SESSION SET NLS_DATE_LANGUAGE = 'LATVIAN';
ALTER SESSION SET NLS_SORT = 'LATVIAN';
ALTER SESSION SET NLS_TIME_FORMAT = 'HH24:MI:SSXFF';
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'RRRR.MM.DD HH24:MI:SSXFF';
ALTER SESSION SET NLS_TIME_TZ_FORMAT = 'HH24:MI:SSXFF TZR';
ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'RRRR.MM.DD HH24:MI:SSXFF TZR';
ALTER SESSION SET NLS_DUAL_CURRENCY = 'Ls';
ALTER SESSION SET NLS_COMP = 'BINARY';
ALTER SESSION SET NLS_LENGTH_SEMANTICS = 'BYTE';
ALTER SESSION SET NLS_NCHAR_CONV_EXCP = 'FALSE';
因此,我将这些行复制到我导出的SQL文件的开头。
然后我跑了
sqlplus
用于测试文件是否可以重新导入的工具:
sqlplus demo/demo @my_exported_data.sql
但我还是犯了以下错误:
Insert into DEMO.ACCOUNT (ID,LAST_MODIFIED_BY_ID,LAST_MODIFIED) values ('1','1',
to_timestamp('2018.10.24 16:39:39,000000000','RRRR.MM.DD HH24:MI:SSXFF'))
*
ERROR at line 1:
ORA-01830: date format picture ends before converting entire input string
应用会话参数是因为我看到了17个
Session altered.
错误之前的消息。
我将同一个SQL查询行复制回Oracle SQL Developer工作表并执行了它——它运行时没有出现错误。
看起来,我缺少了一些会话设置,这些设置对SQL开发人员有效,但对SQL开发人员无效
sqlplus
.
这里怎么了?如何找到缺少的设置并将其应用于
sqlplus
会话是否能够将数据导入回?
根据评论中的更多信息编辑:
我在sqlplus中运行了相同的NLS值收集脚本,特别注意十进制分隔符——它给出了相同的值。
但我也运行了以下程序:
select systimestamp from dual;
而且有了不同!
SYSTIMESTAMP
------------------------------------
2018.10.24 18:30:08,837000000 +03:00
但是sqlplus的输出:
SYSTIMESTAMP
---------------------------------------------------------------------------
2018.10.24 18:30:45,342000 +03:00
因此,正如一位评论员所说,这可能与时间戳的精度有关。出于某种原因,SQL Developer以比sqlplus接受的更高的精度导出和导入。现在我必须找到控制当前会话的时间戳精度的设置。
有许多类似的问题,但在这些情况下,问题是一些被遗忘的NLS设置或忽略的时间格式。在我的例子中,似乎我已经尽了一切可能将会话NLS设置从Oracle SQL Developer复制到了Oracle SQL Developer
sqlplus
工具,但仍然不起作用。