【问题标题】:How to resolve fetch out of sequence in oracle?如何解决oracle中的乱序提取问题?
【发布时间】:2015-04-24 11:21:42
【问题描述】:

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

请帮忙,如果提到的表格也需要数据,请告诉我。

【问题讨论】:

  • 你为什么有EXIT WHEN CUR_INTERFACE_EMP%NOTFOUND? FOR 游标循环在处理完所有记录后将自动退出循环,如果游标没有获取任何记录,则根本不会进入循环。如果没有看到 FOR 循环的完整代码,就无法说明问题所在。您是否在 for 循环中对游标中引用的表进行任何删除/更新?

标签: oracle plsql oracle11g cursor


【解决方案1】:

如果我使用 Process_Flag Y 更新表的某些记录,则批处理 一段时间后工作正常,然后几天后我们又得到了这个 同样的问题。

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

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

Tom Kyte here 的一句话:

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;

【讨论】:

  • 感谢拉利特的回复,提交在循环内部,但在异常部分。但是,我不是每个月每天都会遇到这个问题,这个问题就来了。这就是为什么我们无法追踪它。如果你能帮忙,我会很棒。
  • 你在我在答案中提供的 asktom 链接中有你的答案。
【解决方案2】:

我在 oracle plsql 中遇到了同样的 fetch out of sequence 问题。

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

-------------问题代码-------- 如果 p_ret 为空 然后 p_ret := '成功'; 回滚; 返回; 结束如果;

-------------问题代码--------

我不应该使用回滚。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-25
    • 2020-06-12
    • 2012-04-05
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    相关资源
    最近更新 更多