有什么方法可以检查游标return是否没有记录?
Is there any way to check if cursor return no record?
我在PL/SQL中编写了简单的程序来降低价格。当我调用过程时,我故意传递不在数据库中的参数,因此游标不会 return 任何数据。
这是问题:我的异常不起作用。 kursor%notfound
之类的表达式检查 kursor 是否没有 return 任何数据或未声明?
我很困惑,因为在我做研究时,有人说 kursor%notfound
return 在没有找到数据时是正确的,但在我的程序中它不起作用。说到这里:
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;
感谢您的宝贵时间。
那是行不通的。在你的游标 for 循环中,如果你的代码进入循环,那么这意味着找到一个或多个记录,并且 %notfound 游标属性永远不会为真。你有几个选择。
在循环中保留一个计数器并在退出后检查
创建或替换过程 reduce_price(surname_p varchar2,
name_p varchar2, 百分比数字默认5)is
nc number;
cnt number := 0;
begin
for k in kursor
loop
nc := k.cena *(1-percents/100);
dbms_output.put_line(k.cena ||' ' ||nc);
update naprawa set cena =nc
where id_mech = k.id_mech;
cnt := cnt + 1;
end loop;
if cnt = 0 then
raise NO_DATA_FOUND;
end if;
.. etc..
在进入循环之前检查现有数据
select count(*)
into cnt
from naprawa n
join mechanik m on m.id_mech = n.id_mech
where m.imie = name_p and m.nazwisko = surname_p;
if cnt = 0 then
raise NO_DATA_FOUND;
end if;
...
for k in kursor
loop
我在PL/SQL中编写了简单的程序来降低价格。当我调用过程时,我故意传递不在数据库中的参数,因此游标不会 return 任何数据。
这是问题:我的异常不起作用。 kursor%notfound
之类的表达式检查 kursor 是否没有 return 任何数据或未声明?
我很困惑,因为在我做研究时,有人说 kursor%notfound
return 在没有找到数据时是正确的,但在我的程序中它不起作用。说到这里:
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;
感谢您的宝贵时间。
那是行不通的。在你的游标 for 循环中,如果你的代码进入循环,那么这意味着找到一个或多个记录,并且 %notfound 游标属性永远不会为真。你有几个选择。
在循环中保留一个计数器并在退出后检查
创建或替换过程 reduce_price(surname_p varchar2, name_p varchar2, 百分比数字默认5)is
nc number; cnt number := 0; begin for k in kursor loop nc := k.cena *(1-percents/100); dbms_output.put_line(k.cena ||' ' ||nc); update naprawa set cena =nc where id_mech = k.id_mech; cnt := cnt + 1; end loop; if cnt = 0 then raise NO_DATA_FOUND; end if; .. etc..
在进入循环之前检查现有数据
select count(*)
into cnt
from naprawa n
join mechanik m on m.id_mech = n.id_mech
where m.imie = name_p and m.nazwisko = surname_p;
if cnt = 0 then
raise NO_DATA_FOUND;
end if;
...
for k in kursor
loop