Невозможно импортировать экспортированные данные SQL обратно из-за ошибки ORA-01830 в to_timestamp с форматом, даже если все настройки NLS совпадают - PullRequest
0 голосов
/ 24 октября 2018

Я сделал полный экспорт своей базы данных, используя 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 Developer и не работают для sqlplus.

Что здесь не так?Как найти отсутствующий параметр и применить его к сеансу sqlplus, чтобы иметь возможность импортировать данные обратно?

Отредактировано с дополнительной информацией из комментариев:

Я запустил тот же сбор значений NLSскрипт внутри sqlplus, уделяя особое внимание десятичному разделителю - он дал те же значения.

Но я также запустил следующее:

select systimestamp from dual;

и получил разницу!

Oracle SQL Developer выводит:

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 в инструмент sqlplus, но все равно он не работает.

...