Установка числовых символов 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 если десятичный разделитель-точка.