关闭 for-in 循环时游标 c1 无效

Invalid cursor c1 when close for-in loop

FOR i in c1 LOOP
  UPDATE....
  COMMIT;
END LOOP;
CLOSE c1;

上面的块命中错误:当 CLOSE c1 时 c1 无效,更新是 运行 well.Is 循环结束后游标可能关闭吗?

当您使用语法 FOR xxx in c1 LOOP 时,游标会在结束时自动关闭。你不能关闭它两次。

略过CLOSE c1;

你有两个选择:

选项 1:

SQL> declare
  2    cursor c1 is select * from dept;
  3    c1r c1%rowtype;
  4  begin
  5    open c1;
  6    loop
  7      fetch c1 into c1r;
  8      exit when c1%notfound;
  9      dbms_output.put_line(c1r.dname);
 10    end loop;
 11    close c1;
 12  end;
 13  /
ACCOUNTING
RESEARCH
SALES
OPERATIONS

PL/SQL procedure successfully completed.

选项 2:

SQL> begin
  2    for cur_r in (select * from dept) loop
  3      dbms_output.put_line(cur_r.dname);
  4    end loop;
  5  end;
  6  /
ACCOUNTING
RESEARCH
SALES
OPERATIONS

PL/SQL procedure successfully completed.

SQL>

如您所见,两者产生相同的结果,但第二个更容易维护。

在选项 1 中,您必须:

  • 声明游标
  • 声明游标变量
  • 打开游标
  • 获取
  • 小心退出循环
  • 关闭游标

在选项 2 中,您必须:

  • 声明游标
  • Oracle 为您做其他一切

选择一个你认为更合适的(大多数时候我会选择#2)。

至于你得到的错误:没有什么可以关闭的;正如我所说,Oracle 会为您做这件事。删除 CLOSE 命令。