在下面的函数test2
中,如果我将RETURN V_VALUE;
放在后面
EXCEPTION子句,执行代码2时,发生系统异常ORA-06503: Function returned without value
错误。
CREATE OR REPLACE FUNCTION TEST2
(P1 IN VARCHAR2)
RETURN NUMBER AS V_VALUE NUMBER;
BEGIN
SELECT(
SELECT 1/TO_NUMBER(P1)
FROM DUAL
)
INTO V_VALUE
FROM DUAL;
--RETURN V_VALUE;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
RETURN V_VALUE; --if I put RETURN clause after EXCEPTION, "ORA-06503: Function returned without value" raised
END;
/
SELECT TEST2('1') FROM DUAL;
但是,当我将RETURN V_VALUE;
放在EXCEPTION子句之前时,select语句将按预期返回1
。
Exception的位置应该在函数主体的末尾吗?
答案 0 :(得分:3)
PL / SQL块的结构在the PL/SQL documentation中定义。块的主体包括一个或多个语句(可选),后跟一个异常处理程序。 EXCEPTIONS节的末尾是该块的末尾;之后什么都没有。
RETURN语句是常规正文的最后一行。因此它必须在EXCEPTION块之前。
通常来说,当我们以一种方式执行某件事并获得编译错误,然后以另一种方式执行某件事并获得预期的结果时,我们可以认为,对于采用哪种正确的方法而言,这是一个很大的线索;-)