0

我有以下查询

select distinct name from table1
intersect
select distinct name from table2;

我将结果集加载到 PL/SQL 过程中的游标中,如下所示:

cursor c1 is (select distinct name from table1
intersect
select distinct name from table2);

由于某种原因,结果集中的最后一个值在游标中重复。单独运行查询时不会发生这种情况。任何想法为什么会发生这种情况?

循环代码:

var table.col%type;

BEGIN
OPEN c1;
LOOP    
BEGIN
  exit when c1%NOTFOUND; 
  FETCH c1 into var;       
  INSERT INTO table values (col1, var);
  commit;   
EXCEPTION
 WHEN DUP_VAL_ON_INDEX THEN         
 CONTINUE;  
 END;
END LOOP;    
END;
4

2 回答 2

2

EXIT WHEN ..子句应该在之后FETCH

假设您的游标有 10 条记录要返回。在第一次 fetch 被触发之前,%NOTFOUND评估为NULL,并且处理移动到下一个语句,这就是FETCH你的情况。现在,如果我们快进到第 10 次迭代,FETCH 将获得第 10 条记录,并将其插入到您的目标表中。循环将继续前进,并且由于您EXIT WHEN %NOTFOUND在 fetch 之前,它仍然具有上次迭代的值,并且它让控件继续前进,并且在那里,fetch 将无法获取任何记录,但代码无论如何都会插入它在第 10 次迭代中检索到的最后一行。现在在下一个循环中,c1%NOTFOUND将被评估为TRUE并且循环将终止

var table.col%type;

BEGIN
OPEN c1;
LOOP    
BEGIN

FETCH c1 into var;    
exit when c1%NOTFOUND;    
INSERT INTO table values (col1, var);
commit;   
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN         
CONTINUE;  
END;
END LOOP;    
END;
于 2013-02-13T09:57:49.033 回答
-2

这是您使用显式游标看到的典型问题。

您的首选应该是一条 SQL 语句,仅此而已。

如果必须使用游标,则应尽可能使用隐式游标。

于 2013-02-13T11:49:45.623 回答