Тип данных v_decimalNumber - это некоторый тип символьного формата, поскольку он может содержать запятые (,). Вы утверждаете, что он содержит число после удаления запятых. Тем не менее, НЕТ ТАКОГО, пока это утверждение не будет подтверждено, поскольку, будучи символом, я могу поместить в него любые символы, которые я хочу, с учетом любого ограничения длины. Например, столбец электронной таблицы, который должен содержать цифры c. Однако пользователи, которые не применяются, часто заставляют N / A говорить, что это не применимо. Oracle с радостью загрузит это в ваш v_decimalNumber. (И это один из многих способов, которыми нечисловые c данные могут попасть в ваш столбец.) Поэтому, прежде чем пытаться обработать как числовое c значение, вы должны проверить, действительно ли это действительные числовые c данные. Следующий пример демонстрирует один такой способ.
with some_numbers (n) as
( select '123,4456,789.00' from dual union all
select '987654321.00' from dual union all
select '1928374655' from dual union all
select '1.2' from dual union all
select '.1' from dual union all
select '1..1' from dual union all
select 'N/A' from dual
)
, rx as (select '^[0-9]*\.?[0-9]*$' regexp from dual)
select n
, case when regexp_like(replace(n,',',null), regexp)
then to_number(replace(n,',',null))
else null
end Num_value
, case when regexp_like(replace(n,',',null), regexp)
then null
else 'Not valid number'
end msg
from some_numbers,rx ;
Убрать: Никогда не доверяйте столбцу типа символов, чтобы он содержал определенные c требования к данным, кроме случайных символов. Всегда проверяйте, а затем помещайте данные в соответствующие столбцы.