有什么方法可以检查游标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 游标属性永远不会为真。你有几个选择。

  1. 在循环中保留一个计数器并在退出后检查

    创建或替换过程 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..
    
  2. 在进入循环之前检查现有数据

    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