Установка числовых символов NLS для decimal
У меня есть одна настройка db в тестовой машине и вторая в производственной машине. Когда я бегу:
select to_number('100,12') from dual
затем он дает ошибку в тестовой машине. Однако, это утверждение работает довольно отлично в машине продукции.
теперь, когда я проверяю NLS_NUMERIC_CHARACTERS, я вижу ', ' (запятая) в обеих машинах. Есть ли где-нибудь еще, где я должен искать десятичную настройку?
Ура!
3 ответов
вы можете увидеть текущие настройки сеанса, запросив nls_session_parameters
:
select value
from nls_session_parameters
where parameter = 'NLS_NUMERIC_CHARACTERS';
VALUE
----------------------------------------
.,
это может отличаться от значений по умолчанию базы данных, которые вы можете увидеть в nls_database_parameters
.
в этом сеансе ваши ошибки запроса:
select to_number('100,12') from dual;
Error report -
SQL Error: ORA-01722: invalid number
01722. 00000 - "invalid number"
я мог бы изменить свой сеанс, либо непосредственно с alter session
или, гарантируя, что мой клиент настроен таким образом, что приводит к настройке потребностей строки (она может быть унаследована от операционной системы или локали Java, для пример):
alter session set NLS_NUMERIC_CHARACTERS = ',.';
select to_number('100,12') from dual;
TO_NUMBER('100,12')
-------------------
100,12
в SQL Developer вы можете установить предпочтительное значение в Tool - >Preferences->Database - >NLS.
но я также могу переопределить этот параметр сеанса как часть запроса с дополнительным третьим nlsparam до to_number()
; хотя это делает необязательный второй fmt параметр также необходим, поэтому вам нужно будет выбрать подходящий формат:
alter session set NLS_NUMERIC_CHARACTERS = '.,';
select to_number('100,12', '99999D99', 'NLS_NUMERIC_CHARACTERS='',.''')
from dual;
TO_NUMBER('100,12','99999D99','NLS_NUMERIC_CHARACTERS='',.''')
--------------------------------------------------------------
100.12
по умолчанию результат по-прежнему отображается с настройками сеанса, поэтому десятичный разделитель по-прежнему является периодом.
Jaanna, the сессии параметры Oracle SQL Developer зависит от вашего клиентского компьютера, в то время как НЛС параметры PL / SQL С сервера.
наNLS_NUMERIC_CHARACTERS
на клиентском компьютере может быть ',.' а это '., на сервере.
поэтому при запуске скрипта из PL / SQL и Oracle SQL Developer десятичное разделитель может быть совершенно другим для одного и того же скрипта, если вы не измените сеанс с ожидаемым NLS_NUMERIC_CHARACTERS
в скрипте.
один из способов легко проверить параметр сеанса, чтобы сделать:
select to_number(5/2) from dual;
чтобы узнать десятичный разделитель сеанса, вы можете использовать следующую команду SQL:
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ', ';
select SUBSTR(value,1,1) as "SEPARATOR"
,'using NLS-PARAMETER' as "Explanation"
from nls_session_parameters
where parameter = 'NLS_NUMERIC_CHARACTERS'
UNION ALL
select SUBSTR(0.5,1,1) as "SEPARATOR"
,'using NUMBER IMPLICIT CASTING' as "Explanation"
from DUAL;
первая команда SELECT найти параметр NLS, определенный в NLS_SESSION_PARAMETERS
таблица. Десятичный разделитель-это первый символ возвращаемого значения.
второй выберите команду convert IMPLICITELY в 0.5
рациональное число в строку с использованием (по умолчанию) NLS_NUMERIC_CHARACTERS, определенных на уровне сеанса.
обе команды возвращают одинаковое значение.
Я уже протестирована та же команда SQL в скрипте PL/SQL, и это всегда одно и то же значение запятая или точка, которая отображается. Десятичный разделитель, отображаемый в скрипте PL/SQL, равен тому, что отображается в SQL.
чтобы проверить, что я говорю, я использовал следующие команды SQL:
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ', ';
select 'DECIMAL-SEPARATOR on CLIENT: (' || TO_CHAR(.5,) || ')' from dual;
DECLARE
S VARCHAR2(10) := '?';
BEGIN
select .5 INTO S from dual;
DBMS_OUTPUT.PUT_LINE('DECIMAL-SEPARATOR in PL/SQL: (' || S || ')');
END;
/
более короткая команда, чтобы знать десятичный разделитель:
SELECT .5 FROM DUAL;
что вернуть 0,5
если десятичный разделитель запятая и 0.5
если десятичный разделитель-точка.