下面的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
异常聊天?
答案 0 :(得分:4)
因为在您的情况下,当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
)例外。
答案 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不好吗?差不多是同一件事,但反应却不同。