我有一个程序,在oracle 11g中经常出现以下错误:
ORA-01002: fetch out of sequence ORA-06512:
at "LEAVE.GES_ERP_LEV_FFS_INTERFACE_PRC", line 350 ORA-06512: at line 1.
在第 350 行我有-
BEGIN
FOR V_INTERFACE_EMP IN CUR_INTERFACE_EMP LOOP (Line 350)
EXIT WHEN CUR_INTERFACE_EMP%NOTFOUND;
V_ERR_FLAG := 'N';
V_LOCAL_EMP := 'Y';
BEGIN
游标CUR_INTERFACE_EMP声明如下
SELECT GELF.*
FROM GES_ERP_LEV_FFS_INTERFACE_T GELF
WHERE (GELF.BALANCE_FLAG != 'W'
OR GELF.CASE_FLAG = 'S'
OR SELF.BALANCE_FLAG IS NULL)
AND GELF.PROCESS_FLAG = 'N'
AND GELF.DATE_OF_RELEASE <= TRUNC(SYSDATE);
如果我使用 Process_Flag Y 更新表的一些记录,批处理可以正常工作一段时间,然后几天后我们再次遇到同样的问题。
请帮忙,如果上述表格也需要数据,请告诉我。
如果我用 Process_Flag Y 更新表的一些记录,则批处理 工作一段时间后效果很好,几天后我们又得到了这个 同样的问题。
您尝试从 SELECT FOR UPDATE 中获取数据,但在此之前已经发出了 COMMIT。
我认为你在循环内的某个地方有一个COMMIT,这导致了这个问题。
Tom Kyte 的引言在这里:
for x in ( select rowid rid, t.* from T ) loop update T set x = x+1 where rowid = x.rid; commit; end loop;
该隐式游标是从“跨提交”获取的。 它是 提交后保持游标打开的做法。 这是一个坏事 实践中,这是ORA-1555的常见原因(上面的循环 特别构造)
此外,您正在使用 CURSOR FOR LOOP。当游标中的所有记录都已获取后,CURSOR FOR LOOP 将终止。因此,您不需要明确地EXIT。
您可以简单地这样做:
FOR V_INTERFACE_EMP IN CUR_INTERFACE_EMP
LOOP
V_ERR_FLAG := 'N';
V_LOCAL_EMP := 'Y';
...
END LOOP;
问题出在从循环内部调用的过程中使用的代码行下方。
if p_ret is null
then
p_ret := 'SUCCESS';
rollback;
return;
end if;
我不应该使用回滚。
因此,请注意循环语句内的回滚和提交。