我的函数中的Oracle INVALID_NUMBER异常不起作用

时间:2019-06-23 14:12:36

标签: oracle exception plsql

下面的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 个答案:

答案 0 :(得分:4)

因为在您的情况下,当VALUE_ERROR升起时您会得到ORA-06502。因此,将INVALID_NUMBER替换为VALUE_ERROR

为例;如果SELECT语句是:

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

您将获得INVALID_NUMBERORA-01722)例外。

答案 1 :(得分:3)

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