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