关闭 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
命令。
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
命令。