我是否必须打开游标才能为隐式游标使用%FOUND或%NOTFOUND游标属性?

时间:2011-11-08 18:07:31

标签: sql oracle plsql oracle10g database-cursor

是否可以在以下FOR循环后执行c_emp%notfound或者我是否必须先打开光标?

declare
 cursor c_emp is select * from employee;
 begin
    for c_rec in c_emp
    loop
        dbms_output.put_line(r_emp.first_Name);
    end loop;
 end;
 /

我想在FOR循环之后执行单个UPDATE语句的语句,但前提是FOR循环确实处理了游标上的任何行。我知道我可以设置一面旗帜,但有更清洁的方式吗?

2 个答案:

答案 0 :(得分:4)

  

“在以下FOR之后可以执行c_emp%notfound   环“

不,那将会招致ORA-01001: invalid cursor。光标属性仅在光标打开时具有范围,在此语法中,范围在FOREND LOOP之间。

这是PL / SQL的丑陋方面,但我担心你会被计算在内。

答案 1 :(得分:2)

为什么不呢:

declare
 cursor c_emp is select * from employee;

 begin

    for c_rec in c_emp
    loop
       dbms_output.put_line(r_emp.first_Name);
    end loop;

    UPDATE some_table
       SET some_values
     WHERE some_conditions
       AND EXISTS (SELECT * FROM employee WHERE r.id IS NOT NULL)
 end;
 /

我假设您的员工表中有一个名为ID的主键,您可以根据需要进行调整。