Получить параметры NLS текущего сеанса можно выполнив запрос:
SELECT * FROM NLS_SESSION_PARAMETERS;
Эти настройки используются для текущего сеанса SQL.
Для применения настроек можно выполнить шаги:
1) Значение параметров устанавливается командой ALTER SESSION, например:
ALTER SESSION set NLS_DATE_FORMAT = 'DD/MM/YYYY';
2) Если предложение ALTER SESSION явно не указывает настройки, то они берутся из значений параметров NLS полученных из переменной окружения NLS_LANG.
3) Если NLS_LANG указана только с компонентом TERRITORY, то по умолчанию для языковых настроек (LANGUAGE) используется AMERICAN.
так, например, если выставить NLS_LANG=_BELGIUM.WE8MSWIN1252, то получим:
PARAMETER VALUE
------------------------------ --------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY BELGIUM
NLS_CURRENCY [знак евро]
NLS_ISO_CURRENCY BELGIUM
....
Важно: следует различать варианты записи NLS_LANG=_BELGIUM.WE8MSWIN1252 (верно) и NLS_LANG=BELGIUM.WE8MSWIN1252 (неверно), должен быть указан разделитель _ (подчеркивание).
4) Если NLS_LANG указан только с компонентом язык (LANGUAGE) то часть касательно территории береться из настроек языка (LANGUAGE).
Выставляем NLS_LANG=ITALIAN_.WE8MSWIN1252 и получаем:
PARAMETER VALUE
------------------------------ --------------
NLS_LANGUAGE ITALIAN
NLS_TERRITORY ITALY
NLS_CURRENCY [знак евро]
NLS_ISO_CURRENCY ITALY
.....
Важно: следует различать варианты записи NLS_LANG=ITALIAN_.WE8MSWIN1252 (верно) и NLS_LANG=ITALIAN.WE8MSWIN1252 (неверно), должен быть указан разделитель _ (подчеркивание).
5) Если NLS_LANG указан без территории (TERRITORY) и языка (LANGUAGE) - LANGUAGE_TERRITORY, то значение устанавливается равным AMERICAN_AMERICA. Например, выставим NLS_LANG=.WE8MSWIN1252 и получим:
PARAMETER VALUE
------------------------------ ----------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
....
Важно: следует различать варианты записи NLS_LANG=.WE8MSWIN1252 (верно) и NLS_LANG=WE8MSWIN1252 (неверно), должен быть указан разделитель (.) - точка.
6) Если параметры NLS_LANG установлены как в пунктах 3, 4 или 5, то параметры NLS, например, NLS_SORT, NLS_DATE_FORMAT и т.д. могут быть выставлены самостоятельно и переписать существующие значения, полученные из частей описания территории и языка. Например, выставим NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252 и NLS_ISO_CURRENCY=FRANCE, тогда получим:
PARAMETER VALUE
------------------------------ -----------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY FRANCE
...
Важно:
- Если NLS_DATE_LANGUAGE или NLS_SORT не установлены, то значения беруться из NLS_LANGUAGE
- Если NLS_CURRENCY, NLS_DUAL_CURRENCY, NLS_ISO_CURRENCY, NLS_DATE_FORMAT, NLS_TIMESTAMP_FORMAT, NLS_TIMESTAMP_TZ_FORMAT, NLS_NUMERIC_CHARACTERS не установлены, то значения беруться из NLS_TERRITORY
7) Если для NLS_LANG не выставлено никакого значения, то значения по умолчанию:[LANGUAGE]_[TERRITORY].US7ASCII
для части [LANGUAGE]_[TERRITORY] используется значение найденное в NLS_INSTANCE_PARAMETERS. Параметры, типа NLS_SORT определенные на стороне клиента как независимые, игнорируются.
Итоги
- Параметры NLS выставляемые клиентом для сеанса (NLS_SESSION_PARAMETERS) всегда имеют приоритет над параметрами экземпляра (NLS_INSTANCE_PARAMETERS) и базы данных (NLS_DATABASE_PARAMETERS)
- Эти параметры не могут быть отменены сервером, таким образом, параметры установленные клиентом всегда стоят выше по приоритету над параметрами экземпляра и базы данных
- Параметры выставленные для сеанса (NLS_SESSION_PARAMETERS) не видны другим сеансам и никак не влияют на них
NLS_LANGUAGE в параметрах сеанса определяет и язык для вывода сообщений Oracle
- Нельзя установить параметры NLS в SQL скрипте, требуется использовать ALTER SESSION
- В Windows существует два пути установки NLS_LANG, обычно определяется в реестре, но так же может быть прописано в переменных окружения. Не рекомендуется прописывать настройки NLS в переменных окружения, потому что переменные окружения имеют приоритет над значениями реестра и распространяются на все ORACLE_HOME на сервере, если настройки определяются как системная переменная окружения
- Клиентская часть NLS_LANG не отображается в системных таблицах или представлениях
- NLS_LANG нельзя изменить через ALTER SESSION, NLS_LANGUAGE и NLS_TERRITORY можно. Как правило, NLS_LANGUAGE и/или NLS_TERRITORY не могут быть выставлены как независимые параметры в переменных окружения или реестре на стороне клиента