DB2中的游标怎么死循环了?????

shenfeng126414 2007-04-28 02:42:47
我写了一个存储过程,里面用到了游标,测试的时候发现死循环了,应该只有10条数据的,但在test_log中出现了上万条直到日志满。我在test_log中查了一下,从第10条开始插入的值是一样的。

怎么改啊???

DECLARE str integer;

DECLARE cursor1 CURSOR WITH RETURN FOR
select inmemid from crns.git_aa fetch first 10 row only;

OPEN cursor1;
loop_1:
loop
fetch cursor1 into str;
insert into crns.test_log (log2) values(str);
end loop loop_1;

commit;

close cursor1;
...全文
674 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
longxML 2010-09-25
  • 打赏
  • 举报
回复
楼主:

--多谢 yangxiao_jiang(哈哈) ,可以了,是我写错了一句话。

你是那句话写做了啊·~
我也遇到这样的情况啊拉~~ 在我的表中也插入上万条数据直到日志写满
yangxiao_jiang 2007-04-29
  • 打赏
  • 举报
回复
我这里是这样:

CREATE PROCEDURE proSQL ( )
DYNAMIC RESULT SETS 1
------------------------------------------------------------------------
-- SQL 存储过程

------------------------------------------------------------------------

P1: BEGIN
DECLARE str varchar(50);
DECLARE str1 Integer;
declare sqlcode integer default 0;
-- 声明游标
DECLARE cursor1 CURSOR WITH RETURN FOR
select com1,com2 from test;

-- 游标对客户机应用程序保持打开
OPEN cursor1;

loop_1:
loop
fetch cursor1 into str,str1;
if sqlcode=100 then leave loop_1;
end if;
insert into log (log1) values(str);
end loop loop_1;
close cursor1;
commit;
END P1
shenfeng126414 2007-04-29
  • 打赏
  • 举报
回复
create procedure crns.sp_test()
P1: BEGIN

DECLARE str integer;

declare sqlcode integer default 0;
DECLARE cursor1 CURSOR WITH RETURN FOR
select inmemid from crns.git_aa fetch first 10 row only;

OPEN cursor1;
loop_1:
loop
fetch cursor1 into str;
if sqlcode=100 then
leave loop_1;
end if;
insert into crns.test_log (log2) values(str);
end loop loop_1;
commit;
close cursor1;

END P1

这个是完整的存储过程,现在调用存储过程报错:
SQL0501N 在 FETCH 或 CLOSE 语句中指定的游标未打开。 SQLSTATE=24501
yangxiao_jiang 2007-04-29
  • 打赏
  • 举报
回复
怎么不行,我这里调试通过,db2 8.2
shenfeng126414 2007-04-29
  • 打赏
  • 举报
回复
兄弟,你的方法也不行啊
yangxiao_jiang 2007-04-29
  • 打赏
  • 举报
回复
如果在一个session是可以访问的,把你的临时表创建过程(语句)贴出来看看。
shenfeng126414 2007-04-29
  • 打赏
  • 举报
回复
多谢 yangxiao_jiang(哈哈) ,可以了,是我写错了一句话。

能再帮我解决一个小问题吗?
我在存储过程中建了一个临时表tmpA后,
insert into sessiona.tmpA values (......)

插入数据后马上select * from session.tmpA,提示说语法有错,难道不能这样写?
yangxiao_jiang 2007-04-28
  • 打赏
  • 举报
回复
DECLARE str integer;
declare sqlcode integer default 0;
DECLARE cursor1 CURSOR WITH RETURN FOR
select inmemid from crns.git_aa fetch first 10 row only;

OPEN cursor1;
loop_1:
loop
fetch cursor1 into str;
if sqlcode=100 then leave loop_1;
end if;
insert into crns.test_log (log2) values(str);
end loop loop_1;
commit;
close cursor1;

5,888

社区成员

发帖
与我相关
我的任务
社区描述
IBM DB2 是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM自家的AIX)、Linux、IBM i(旧称OS/400)、z/OS,以及Windows服务器版本
社区管理员
  • DB2
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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