Db2 SQLCODE=-501 SQLSTATE=24501,带光标

Db2 SQLCODE=-501 SQLSTATE=24501,带光标,db2,Db2,我已经编写了一个存储过程 CREATE OR REPLACE PROC1() DECLARE VAR1 INT; DECLARE VAR2 INT; DECLARE TEXT VARCHAR(1000); DECLARE exitcode INTEGER DEFAULT 0; DECLARE SQLCODE INTEGER DEFAULT 0; DECLARE CUR1 CURSOR WITH HOLD for STMT1 ; DECLARE CONTINUE HANDLER FOR NOT

我已经编写了一个存储过程

CREATE OR REPLACE PROC1()
DECLARE VAR1 INT;
DECLARE VAR2 INT;
DECLARE TEXT VARCHAR(1000);
DECLARE exitcode INTEGER DEFAULT 0;
DECLARE SQLCODE INTEGER DEFAULT 0;

DECLARE CUR1 CURSOR WITH HOLD for STMT1 ;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET exitcode = 1;

SET TEXT= (-----);
PREPARE STMT1 FROM TEXT; 

open cur1;
fetch from cur1 into var1,var2;
while(sqlcode =0)
do
--
--
CALL SYSPROC.ADMIN_CMD('REORG TABLE emp1 ');

set exit code = 0;
fetch from cur1 into var1,var2;
IF (exitcode = 1)
       THEN
       LEAVE wloop;
     END IF; 
end while; 
close cur1;
我的问题是,我甚至将游标声明为带有HOLD选项,在第一次获取之后,游标将关闭并抛出-501错误。然后游标正常工作,获取所有行。即使我在循环中使用REORG语句,有人能告诉我保持光标打开的方法吗


提前谢谢

嗯,你的光标什么都不做。。。。如果它接触到
emp1
,那么它很可能正在关闭光标,因为您更改了它正在查看的表。首先,你不应该在一个循环中重新组织(它有可能是一个真正的长期运行的操作)。此外-任何高于
0
的内容都意味着“警告成功”(例如,没有受影响的行,重新评估语句计划等);你是否想继续,取决于你是否关心具体的警告……根据上的帖子,克努特·斯托尔泽(IBM研究人员)说,REORG在内部执行回滚,这种行为是意料之中的。他还提出了另一种办法。