为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:dm8
【操作系统】:centos
【CPU】:
【问题描述】*:如下非常简单的代码
DECLARE
--省略变量定义
CURSOR cur_khqd FAST IS select custid from hdqd;
BEGIN
OPEN cur_khqd;
LOOP
FETCH cur_khqd INTO v_aa.custid
INSERT INTO khqd(CUSTID) VALUES(v_aa.custid);
COMMIT;
EXIT WHEN cur_khqd%NOTFOUND;
END LOOP;
CLOSE cur_khqd;
END
执行的时候出错,单步跟踪,发现当FETCH到最后一行后,指针并不退出循环,而是又跳到游标中的一行,因为表中有主键,再次插入时,系统报错,
检查发现,数据全部都已经正常插入了,但是每次程序都不能正常运行。
后将 LOOP,FTECH 修改为 FOR 循环,程序就正常了,这个什么原因?是因为DM FETCH有什么特殊的用法吗?
fetch的exit条件要紧跟在后面。否则相当于多了一次循环但是没有给变量赋新值。
需要调整为:
create table test1(id int,c1 int);
insert into test1 select level,level from dual connect by level <= 4;
create table test2(id int,c1 int);
DECLARE
--省略变量定义
CURSOR cur_khqd FAST IS select id from test1;
v_id int;
BEGIN
OPEN cur_khqd ;
LOOP
FETCH cur_khqd INTO v_id;
EXIT WHEN cur_khqd%NOTFOUND;
INSERT INTO test2(id) VALUES(v_id);
COMMIT;
END LOOP;
CLOSE cur_khqd;
END
--验证数据
truncate table test2
select * from test2;