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

时间:2018-04-18 08:01:18

标签: oracle loops cursor for-in-loop

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

上面的块命中错误:CLOSE c1时c1无效,更新运行良好。循环结束后光标是否可能关闭?

2 个答案:

答案 0 :(得分:0)

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

跳过CLOSE c1;

答案 1 :(得分:0)

您有两种选择:

选项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命令。