存储过程中的游标问题!急!

zhangleon714 2003-10-24 11:26:01
谢谢各位的答复,但是好象都不能解决问题呀。

我现在做了一个最简单的测试,存储过程如下:

create or replace procedure cj_test is

temp_lbillcode varchar2(20):='';
cursor cur_Orders is select lbillcode from orders ;

begin

open cur_Orders;
fetch cur_Orders into temp_lbillcode;
while cur_Orders%found loop
fetch cur_Orders into temp_lbillcode;
end loop;

close cur_Orders;
end cj_test;

即使如此简单的代码,也会有未关闭的游标啊。
这是为什么?
...全文
32 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangleon714 2003-10-29
  • 打赏
  • 举报
回复
怎么没有人给我回复啊?
zhangleon714 2003-10-28
  • 打赏
  • 举报
回复
我看到的未关闭的游标,就是在打开这个存储过程的test窗口的session里的啊。
zhangleon714 2003-10-28
  • 打赏
  • 举报
回复
都没有用啊,我把代码改为如下:

create or replace procedure cj_test is
temp_lbillcode varchar2(20):='';
cursor cur_Orders is select lbillcode from orders ;
begin
open cur_Orders;
fetch cur_Orders into temp_lbillcode;
while cur_Orders%found loop
fetch cur_Orders into temp_lbillcode;
end loop;
close cur_Orders;
commit;
dbms_output.put_line('success');
exception
when INVALID_CURSOR then
dbms_output.put_line('Course is error');
when others then
dbms_output.put_line('error');


end cj_test;

结果输出了success,但还是看到有未关闭的游标,这到底是为什么啊!
jasoncheung 2003-10-28
  • 打赏
  • 举报
回复
切记加上异常处理,不然就没法知道出了什么错,出在哪里?
vrv0129 2003-10-28
  • 打赏
  • 举报
回复
create or replace procedure cj_test is
temp_lbillcode varchar2(20):='';
declare cursor cur_Orders is select lbillcode from orders ;
begin
open cur_Orders;
fetch cur_Orders into temp_lbillcode;
while cur_Orders%found loop
fetch cur_Orders into temp_lbillcode;
end loop;
close cur_Orders;
commit;
exception
when INVALID_CURSOR then
dbms_output.line('Course is error')
when others then
null;
end cj_test;
zhangleon714 2003-10-27
  • 打赏
  • 举报
回复
beckhambobo(beckham):谢谢你的回复,但是我试过了,你的那种写法好象还是一样的结果。
我把用来测试存储过程的代码也放出来吧:

begin
-- Call the procedure
cj_test;
end;

我在pl/sql developer中的sessions窗口中看到有未关闭的游标,为什么?
hushuangyang 2003-10-27
  • 打赏
  • 举报
回复
我在pl/sql developer中的sessions窗口中看到有未关闭的游标,为什么?
没有关掉连接的话,当然可以看到游标。
如果你能够确认没有关闭的游标就是这个存储过程产生的话,结论只有一个:那就是
temp_lbillcode varchar2(20):=''; 这个变量定义长度定义小了,才会在fetch的时候产生异常,而你的程序没有捕捉异常,所以游标没有关闭。即使表里面没有记录都不会有异常的。
beckhambobo 2003-10-24
  • 打赏
  • 举报
回复
用这种形式看怎样
create or replace procedure cj_test is

temp_lbillcode varchar2(20):='';
cursor cur_Orders is select lbillcode from orders ;

begin
for v_sor in cur_Orders loop
temp_lbillcode:=v_sor.lbillcode;
end loop;
end cj_test;

17,081

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧