代码之家  ›  专栏  ›  技术社区  ›  JustAMartin

由于ORA-01830错误,无法将导出的SQL数据导入回\u时间戳格式,即使所有NLS设置都匹配

  •  1
  • JustAMartin  · 技术社区  · 7 年前

    我使用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 工具,但仍然不起作用。

    0 回复  |  直到 7 年前