Oracle INVALID_NUMBER исключение в моей функции не работает - PullRequest
2 голосов
/ 23 июня 2019

Функция Oracle ниже присваивает 'A' числовой переменной. Но предложение Exception не перехватывает INVALID_NUMBER системное исключение.

CREATE OR REPLACE FUNCTION TEST2
    (P1 IN VARCHAR2)
RETURN NUMBER AS V_VALUE NUMBER;
BEGIN
    SELECT(
        --SELECT 1/TO_NUMBER(P1)
        SELECT 'A'
        FROM DUAL
        )
    INTO V_VALUE
    FROM DUAL;
    RETURN V_VALUE;

    EXCEPTION
    WHEN INVALID_NUMBER THEN  -- If I change INVALID_NUMBER to OTHERS, then it works.
      RETURN -1;      
END;
/


SELECT TEST2('1') FROM DUAL;

Когда я изменяю INVALID_NUMBER на OTHERS, тогда это работает.

Как изменить приведенный выше код, чтобы перехватить исключение INVALID_NUMBER?

Ответы [ 2 ]

4 голосов
/ 23 июня 2019

Поскольку вы получаете VALUE_ERROR, когда ORA-06502 повышается, как это происходит в вашем случае. Итак, замените INVALID_NUMBER на VALUE_ERROR.

в качестве примера; если оператор SELECT был:

SELECT 5
  INTO V_VALUE
  FROM DUAL
 WHERE TO_NUMBER('A')=1;

вы получите INVALID_NUMBER (ORA-01722) исключение.

3 голосов
/ 23 июня 2019

Дополнительная информация (к тому, что Барбарос уже сказал вам).

Исключение INVALID_NUMBER (ORA-01722) возникает в операторе SQL, когда преобразование символьной строки в число завершается неудачно, потому чтоСтрока не представляет действительное число. (В процедурных инструкциях VALUE_ERROR повышается.) Это исключение также возникает, когда выражение предложения LIMIT в массовом операторе FETCH не оценивается как положительное число.

Сравнить

SQL> select 'a'/2 from dual;
select 'a'/2 from dual
       *
ERROR at line 1:
ORA-01722: invalid number

с

SQL> declare
  2    l_num number;
  3  begin
  4    l_num := 'a' / 2;
  5  end;
  6  /
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 4

с

SQL> declare
  2    l_num number;
  3  begin
  4    select 'a' / 2 into l_num from dual;
  5  end;
  6  /
declare
*
ERROR at line 1:
ORA-01722: invalid number
ORA-06512: at line 4

Разве это не мило с Oracle?Более или менее одно и то же, но другой ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...