Есть ли эквивалент SQL Server функции ISNUMERIC() - является ли значение числом?

Есть код, который возвращает сообщение об ошибке, если значение невалидно. Хотелось бы вернуть сообщение об ошибке, если даннное значение не численное:

IF (option_id = 0021) THEN 
      IF ((value<10000) or (value>7200000) or /* Numeric Check */) THEN
          ip_msg (6214, option_name);  -- Error Message
          return;
      END IF;
END IF;      

В SQL Server для этого просто пользуюсь ISNUMERIC(). Хотел бы делать нечто подобное:

IF ((!ISNUMERIC(value)) or (value<10000) or (value>7200000)) THEN ...

Свободный перевод How can you tell if a value is not numeric in Oracle? от участника @Kyle Williamson


Ответы (3 шт):

Автор решения: 0xdb
IF REGEXP_LIKE(value, '^-?\d+(\.\d+)?$') THEN ...

вернёт TRUE, если value содержит числовое значения.

Или в запросе:

SELECT column
FROM   table
WHERE  REGEXP_LIKE (column, '^-?\d+(\.\d+)?$');

Свободный перевод ответа от участника @Rob van Laarhoven и ответа от участника @Matt Byrne

→ Ссылка
Автор решения: 0xdb

Встроенной функции нет. Можно написать свою:

create or replace function isNumeric (str varchar2) return boolean is
begin
    if to_number (str) = 0 then null; end if;
    return true;
exception when value_error then return false;
end;

Затем вызывать её так:

IF (isNumeric (str) AND 
    to_number (str) >= 1000 AND
    to_number (str) <= 7000)

Если версия не позднее 12.2, то есть расширение к стандартной функции to_number:

IF (to_number (str default null on conversion error) >= 1000 AND
    to_number (str default null on conversion error) <= 7000 )

Свободный перевод ответа от участника @Justin Cave

→ Ссылка
Автор решения: 0xdb

Начиная 12с появилась функция VALIDATE_CONVERSION:

create or replace function isNumeric (value varchar2) return boolean is
begin
    return (validate_conversion (value as number) = 1);
end;
/
var error varchar2
exec if not isNumeric ('123 56') then -
    :error := 'invallid value'; end if;       
print error

ERROR
--------------
invallid value

Также начиная с 12c в CAST возможно указать значение в случае ошибки конвертации:

create or replace function safeToNumber (value varchar2) return number is
begin
    return cast (value  as number default null on conversion error);
end;
/

Последнюю функцию можно использовать в SQL контексте:

SQL> select safeToNumber (trim (column_value)) num
     from xmlTable ('"123","+2e3","-123.34"');

       NUM
----------
       123
      2000
   -123.34
→ Ссылка