如果SELECT INTO语句不返回至少一行,则抛出ORA-01403.
对于每个其他DBMS,我知道这是一个SELECT的正常.
只有Oracle会这样对待一个SELECT INTO.
CREATE OR REPLACE PROCEDURE no_data_proc IS dummy dual.dummy%TYPE; BEGIN BEGIN SELECT dummy INTO dummy FROM dual WHERE dummy = 'Y'; EXCEPTION WHEN no_data_found THEN dbms_output.put_line('Why is this needed?'); END; END no_data_proc;
为什么?
在我看来,你真的不需要这个例外.这太开销了
有时它是方便的,但你必须写一个整个开始,例外,WHEN,END块.
有没有什么重要的原因我看不到?
不需要异常块,您可以根据上下文使用它.
在这里,您主动忽略异常(程序将成功返回),但大多数情况下,如果您正在执行SELECT INTO,则要使其失败(如果不返回),请考虑:
PROCEDURE update_employee_salary (p_empno) IS l_salary NUMBER; BEGIN SELECT sal INTO l_salary FROM emp WHERE empno = p_empno FOR UPDATE; /* do something with emp data */ END;
在这里,如果使用在EMP表中不存在的empno调用该函数,我希望我的函数失败.我可能会捕获异常来提出一个有意义的错误信息(with raise_application_error),但大多数时候我对ORA-01403感到满意.
一般来说,您应该捕获的唯一例外是预期的异常(即不应该是捕获所有ORA-01403的标准,或者是所有异常).