Функция to_number()
возвращает, как следует из названия, числовой тип данных.Это зависит от вашего клиента, как это должно быть отображено;вот почему alter session
может повлиять на этот вывод.
Ваш исходный запрос генерирует одно и то же число независимо от настройки сеанса:
alter session set NLS_NUMERIC_CHARACTERS = ',.';
SELECT TO_NUMBER('-AusDollars1.234,56','L9G999D99',
' NLS_NUMERIC_CHARACTERS = '',.''
NLS_CURRENCY = ''AusDollars''
') "Amount"
FROM DUAL;
Amount
----------
-1234,56
alter session set NLS_NUMERIC_CHARACTERS = '.,';
SELECT TO_NUMBER('-AusDollars1.234,56','L9G999D99',
' NLS_NUMERIC_CHARACTERS = '',.''
NLS_CURRENCY = ''AusDollars''
') "Amount"
FROM DUAL;
Amount
----------
-1234.56
Клиент отображает эти числа по-разному, но настройки сеансане влияет на то, как на самом деле работает запрос.
Вы можете явно отформатировать результат обратно в строку, если хотите управлять отображением без изменения сеанса:
alter session set NLS_NUMERIC_CHARACTERS = ',.';
SELECT TO_CHAR(TO_NUMBER('-AusDollars1.234,56','L9G999D99',
' NLS_NUMERIC_CHARACTERS = '',.''
NLS_CURRENCY = ''AusDollars''
'),'9999D99',
'NLS_NUMERIC_CHARACTERS = ''.,''
') "Amount"
FROM DUAL;
Amount
--------
-1234.56
alter session set NLS_NUMERIC_CHARACTERS = '.,';
SELECT TO_CHAR(TO_NUMBER('-AusDollars1.234,56','L9G999D99',
' NLS_NUMERIC_CHARACTERS = '',.''
NLS_CURRENCY = ''AusDollars''
'),'9999D99',
'NLS_NUMERIC_CHARACTERS = ''.,''
') "Amount"
FROM DUAL;
Amount
--------
-1234.56
Теперь сеанснастройка также не влияет на отображаемое значение.Но теперь это, конечно, строка, а не число.
С вашим вторым запросом то, что вы показали в комментарии, не работает:
select TO_NUMBER('10,35','999G990D00','nls_numeric_characters=''.,''') amount from dual;
ERROR at line 1:
ORA-01722: invalid number
, потому что у вас есть точка изапятая неправильный раунд, но с этим исправленным отображение этого числа по-прежнему зависит от сеанса:
alter session set NLS_NUMERIC_CHARACTERS = ',.';
select TO_NUMBER('10,35','999G990D00','nls_numeric_characters='',.''') amount from dual;
AMOUNT
----------
10,35
alter session set NLS_NUMERIC_CHARACTERS = '.,';
select TO_NUMBER('10,35','999G990D00','nls_numeric_characters='',.''') amount from dual;
AMOUNT
----------
10.35
Опять же, вы можете явно преобразовать обратно в строку:
select TO_CHAR(
TO_NUMBER('10,35','999G990D00','nls_numeric_characters='',.'''),
'999G990D00',
'nls_numeric_characters=''.,'''
) amount from dual;
AMOUNT
-----------
10.35
, который дает тот же результат с любой настройкой сеанса.
Или вы можете заменить запятую на точку непосредственно с помощью строковых манипуляций:
select REPLACE('10,35', ',', '.') amount from dual;
, хотя это становится грязно, еслиу вас также могут быть разделители групп, как предполагает модель.