【发布时间】:2021-05-03 20:59:32
【问题描述】:
我在 PL/SQL 中编写了简单的程序来降低价格。当我调用过程时,我故意传递不在数据库中的参数,因此游标不返回任何数据。
这是问题:我的异常不起作用。 kursor%notfound 之类的表达式检查 kursor 是否不返回任何数据或未声明?
我很困惑,因为在我进行研究时,有人说kursor%notfound 在没有找到数据时返回 true,但在我的程序中它不起作用。说到这里:
if (kursor%notfound) then
raise no_data_found;
end if;
它不会引发异常。我究竟做错了什么? PS 抱歉,语言不一致(混合波兰语和英语),但我有波兰语数据库。
我的整个程序:
set serveroutput on
create or replace procedure reduce_price(surname_p varchar2,
name_p varchar2, percents number default 5)is
cursor kursor is
select n.id_mech,cena from naprawa n
join mechanik m on m.id_mech = n.id_mech
where m.imie = name_p and m.nazwisko = surname_p
for update;
nc number;
begin
for k in kursor
loop
if (kursor%notfound) then
raise NO_DATA_FOUND;
end if;
begin
nc := k.cena *(1-percents/100);
dbms_output.put_line(k.cena ||' ' ||nc);
update naprawa set cena =nc
where id_mech = k.id_mech;
exception
when NO_DATA_FOUND then
dbms_output.put_line('no rows found');
end;
end loop;
end;
/
begin
reduce_price('aaa', 'XYZ',1);
end;
感谢您的宝贵时间。
【问题讨论】:
-
@OldProgrammer 的回答解释了为什么它永远不会引发 NO_DATA_FOUND,但原始代码中的另一个问题是在 RAISE 语句的范围内没有异常处理程序。
标签: sql plsql oracle-sqldeveloper