Прочитать текущую настройку сеанса NLS_NUMERIC_CHARACTERS - PullRequest
0 голосов
/ 23 сентября 2019

Мне нужно запустить отчет с числовыми десятичными знаками в качестве параметров на разных территориях с разными NLS_NUMERIC_CHARACTERS, иначе разделителями запятых.

NLS_NUMERIC_CHARACTERS устанавливается на уровне сеанса, например.с

ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ',.';

Выражение NLS_NUMERIC_CHARACTERS = ',.' означает, что десятичный маркер представляет собой запятую, а маркер тысяч - точку.

Для правильного ввода данных пользователем на всех различных территориях, которые я предполагаючто настройки NLS_NUMERIC_CHARACTERS сеанса установлены правильно.Я хочу оценить это состояние сеанса в значение поля s_nlsparam и использовать его для правильного преобразования параметров отчета с помощью

.. to_number(expr,format, v_nlsparam) ...

пока что плана.Это могло бы укротить любой потенциальный ORA-01722: invalid number в многонациональном контексте.

Теперь я не могу найти способ прочитать текущее состояние сеанса настроек NLS_NUMERIC_CHARACTERS.Я проверил представление v$session, но оно не предлагает такого поля.Также я не нашел такой параметр, используя:

select sys_context('USERENV', .... ) from dual

Есть ли способ получить его?

Ответы [ 3 ]

5 голосов
/ 23 сентября 2019

Вы можете увидеть эту информацию, используя этот выбор:

select value 
  from nls_session_parameters
 where parameter = 'NLS_NUMERIC_CHARACTERS';
0 голосов
/ 25 сентября 2019

Вы уверены, что вам действительно нужно знать текущее значение?Так как вы предполагаете, что настройка установлена ​​правильно в вашей пользовательской сессии, обычно имеет смысл использовать универсальную модель формата в ваших функциях преобразования.Например,

to_number( some_string, '999999999D99' )

преобразует строку в число (добавьте больше 9, если вам нужно поддерживать числа больше миллиарда), используя любую десятичную точку сеанса.Если сеанс использует запятую в качестве десятичного разделителя, он будет искать запятую.Если сеанс использует период в качестве десятичного разделителя, он будет искать период.Точно так же

to_char( some_number, '999G999G999D99' ) 

преобразует число в строку, используя любую группу и десятичный разделитель, которые использует сеанс.

0 голосов
/ 25 сентября 2019

Хорошо, я выяснил косвенный способ определения текущего состояния сеанса настройки NLS_NUMERIC_CHARACTERS.

ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ',.';

Затем, не зная контекста сеанса, определенного выше [aka вне вашего контроля]

select to_char(10.01) decimalnum from dual;
--10,01  d.h. with comma

или, в качестве альтернативы, в другом контексте, например,

ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,';

, вы можете определить состояние сеанса в черной рамке косвенно с помощью

select to_char(10.01) decimalnum from dual;
-- 10.01  d.h. with dot
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...