如何解决oracle中的fetch乱序问题?

The*_*bhi 3 oracle plsql cursor oracle11g

我有一个程序,在 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.
Run Code Online (Sandbox Code Playgroud)

在第 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
Run Code Online (Sandbox Code Playgroud)

游标 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);
Run Code Online (Sandbox Code Playgroud)

如果我使用 Process_Flag Y 更新表的一些记录,批处理可以正常工作一段时间,然后几天后我们再次遇到同样的问题。

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

Lal*_*r B 5

如果我使用 Process_Flag Y 更新表的一些记录,批处理可以正常工作一段时间,然后几天后我们再次遇到同样的问题。

您尝试从 SELECT FOR UPDATE 中获取数据,但在此之前已经发出了 COMMIT。

我认为您在循环内的某处有一个COMMIT导致了此问题。

引用汤姆·凯特的一句话:

for x in ( select rowid rid, t.* from T ) loop
     update T set x = x+1 where rowid = x.rid;
     commit;
  end loop;
Run Code Online (Sandbox Code Playgroud)

该隐式游标是从“跨提交”获取的。这是提交后保持游标打开的做法。这是一种不好的做法,并且是 ORA-1555 的常见原因(特别是上面的循环构造)

另外,您正在使用CURSOR FOR LOOP。当游标中的所有记录都已获取时,CURSOR FOR LOOP 将终止。因此,您不需要显式退出

你可以简单地这样做:

FOR V_INTERFACE_EMP IN CUR_INTERFACE_EMP 

   LOOP        

     V_ERR_FLAG  := 'N';
     V_LOCAL_EMP := 'Y';
     ...
   END LOOP;
Run Code Online (Sandbox Code Playgroud)