下面的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异常生效?

最佳答案

一些更多信息(有关Barbaros已经告诉您的内容)。


当字符串转换为数字失败时(因为该字符串不代表有效数字),SQL语句中发生INVALID_NUMBER异常(ORA-01722)。 (在过程语句中,引发VALUE_ERROR。)当批量FETCH语句中的LIMIT子句表达式的求值不为正数时,也会引发此异常。


比较

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不好吗?差不多是同一件事,但反应却不同。

关于oracle - 我的函数中的Oracle INVALID_NUMBER异常不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56724707/

10-14 12:30
查看更多