我如何修改我的 PL/SQL 过程以转到我的异常处理?

How can I modify my PL/SQL procedure to go to my exception handling?

我正在使用 SQL 开发人员编写程序。

objective是从一个table中获取排水系统名称,在另一个table中获取排水系统名称代码出现的次数。

我的程序运行正常,但当我输入不正确的值时,它不会进入异常部分。例如,当我输入“Mexico River”时,table中不存在这个名称。因此,我希望我的异常部分意识到这是输入的错误值。

我的问题是如何修改我的代码,以便它可以检测到不正确的值并转到我的异常部分。

下面是我的代码片段:

PROCEDURE number_of_rivers --second procedure with 1 parameter
  (input_sysName IN TBLDrainage.DRAINAGE_SYS%TYPE)
   is 

    -- Create a cursor 
    cursor c_river is 
      select code, drainage_sys 
      from TBLDRAINAGE 
      where DRAINAGE_SYS = input_sysName;
    v_rivercount Number;
    r_variable c_river %rowtype; 

  Begin

   FOR r_variable in c_river
   loop 
     select count (Drainage_sys) into v_rivercount
     from TBLRIVER
     where DRAINAGE_SYS = r_variable.code;
     DBMS_OUTPUT.PUT_LINE (UPPER(input_sysName) || ' has ' || v_rivercount || ' river(s) in the drainage system.');
  end loop;


EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE ('Error: Please enter a valid drainage system name');
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE ('Error in finding system');
END ;

CURSOR..FOR 循环具有执行零次或多次的属性。它不会抛出 NO_DATA_FOUND。

有几个解决方案。一种是在循环中包含一个计数,然后引发异常。

l_count := 0;
FOR r_variable in c_river
loop 
  ....
  l_count := l_count + 1;
end loop;
if l_count = 0 then
  raise NO_DATA_FOUND;
end if;

另一个是在程序开始时验证输入参数。

begin
  open c_river;
  fetch c_river into r_variable;
  if c_river%notfound then  
    raise NO_DATA_FOUND;
  else
    select count (Drainage_sys) 
    into v_rivercount
    from TBLRIVER
    where DRAINAGE_SYS = r_variable.code;
    DBMS_OUTPUT.PUT_LINE (UPPER(input_sysName) || ' has ' || v_rivercount || ' river(s) in the drainage system.');
  end if;
  close c_river;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE ('Error: Please enter a valid drainage system name');
    close c_river;
END ;      

在这个解决方案中,我删除了循环,因为我希望对排水系统的查找应该是唯一的,并且 return 一条记录。如果您的数据模型不是这样,请重新设置循环。


我保留了您为游标及其行变量命名的名称,但您应该重新命名它们。它们用于选择 排水系统 而不是河流,它们的名称应该反映出这一点。命名事物的纪律是一个有用的习惯,因为误导性的变量名称会导致较大的代码块混乱。

此外,像这样吞噬异常是非常糟糕的:

 WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE ('Error in finding system');

Oracle 有数以千计的错误消息:最好什么都不做,而不是将其丢弃。