如何在程序中引发异常?

时间:2016-05-08 18:17:05

标签: oracle exception plsql

这是我的程序:

create or replace procedure p1(p_deptno in number)
is
  cursor c is select * from emp where deptno=p_deptno;
  i emp%rowtype;
begin
  open c;
  loop
    fetch c into i;
    exit when c%notfound;
    dbms_output.put_line(i.ename);
  end loop;
exception
  when no_data_found then
    dbms_output.put_line('Give proper deptno');
end p1;
/

当我使用SQL * Plus运行它时,我得到了这个:

  

SQL> exec p1(70);

     

PL / SQL程序已成功完成。

但deptno 70不可用。应该提出例外,但事实并非如此。我做错了什么?

3 个答案:

答案 0 :(得分:3)

使用RAISE_APPLICATION_ERROR如果我们需要为此特定错误消息显示用户定义的错误,那么这将更合适。

CREATE OR REPLACE PROCEDURE p1(
    p_deptno IN NUMBER)
IS
  i emp%rowtype;
BEGIN
  SELECT * INTO i FROM emp WHERE deptno=p_deptno;
EXCEPTION
WHEN no_data_found THEN
  RAISE_APPLICATION_ERROR(-20001,'Dept no '||p_deptno||' has no data',TRUE);
END p1;

答案 1 :(得分:2)

找不到数据只有在您激活select(不是游标)时才会引发异常。以下是基于您的代码的示例:

create or replace procedure p1(p_deptno in number)
is
  i emp%rowtype;
begin
  select * into i
  from emp where deptno=p_deptno;
exception
  when no_data_found then
    dbms_output.put_line('Give proper deptno');
end p1;
/

您可以根据Gavin所证明的%NOTFOUND引发异常。

此外,第一次从打开的游标获取,cursor_name%NOTFOUND返回NULL。此后,如果最后一次提取返回一行,则返回FALSE;如果最后一次提取未能返回一行,则返回TRUE。 (https://docs.oracle.com/cd/B12037_01/appdev.101/b10807/13_elems011.htm

答案 2 :(得分:1)

您需要致电RAISE(文档链接here

IF i IS NULL THEN
    RAISE no_data_found;
END IF;