oracle中fetch乱序如何解决?

问题描述 投票:0回答:2

我有一个程序,在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 更新表的一些记录,批处理可以正常工作一段时间,然后几天后我们再次遇到同样的问题。

请帮忙,如果上述表格也需要数据,请告诉我。

oracle plsql oracle11g database-cursor
2个回答
5
投票

如果我用 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;

1
投票

问题出在从循环内部调用的过程中使用的代码行下方。

if p_ret is null
     then
        p_ret := 'SUCCESS';
         rollback;
        return;
     end if;

我不应该使用回滚。

因此,请注意循环语句内的回滚和提交。

© www.soinside.com 2019 - 2024. All rights reserved.