我如何修改我的 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 有数以千计的错误消息:最好什么都不做,而不是将其丢弃。
我正在使用 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 有数以千计的错误消息:最好什么都不做,而不是将其丢弃。