Sql 取出顺序错误<;ora-01002>;回降

Sql 取出顺序错误<;ora-01002>;回降,sql,oracle,plsql,Sql,Oracle,Plsql,今天我遇到了“提取顺序错误”ORA-01002。我做了大量的研究,我逐渐了解到,这是很常见的,当我们这样做 当我们已经关闭游标时,尝试获取 用于更新和提交 我的要求是,如果处理成功,每提交500条记录,并在出现任何问题时回滚获取的500条记录 我都没有做过。我还发现,由于回滚,出现了提取顺序错误 我也把范围缩小到实际发生的时间。只有在第一组记录发生回滚时,才会发生这种情况 loop Fetch c1 bulk collect into type1 limit 500; ex

今天我遇到了“提取顺序错误”ORA-01002。我做了大量的研究,我逐渐了解到,这是很常见的,当我们这样做

  • 当我们已经关闭游标时,尝试获取
  • 用于更新和提交 我的要求是,如果处理成功,每提交500条记录,并在出现任何问题时回滚获取的500条记录

    我都没有做过。我还发现,由于回滚,出现了提取顺序错误

    我也把范围缩小到实际发生的时间。只有在第一组记录发生回滚时,才会发生这种情况

       loop
        Fetch c1 bulk collect into type1 limit 500;
        exit when type1.count=0;
        forall in i..type1.count save exceptions 
        insert into the table.
        do something.....
        the computation goes on;
        Commit;
        exception when others then 
        for i in 1..sql%bulk_exceptions loop 
        Do somthing...
        end loop;
        rollback; => Fetch out of seq happens here...
       end loop;
    
    只有在前500条记录失败并且我发出rollback命令时,才会发生顺序外提取。当提交前500条记录时,它不会给出ora-01002,而对于接下来的500条记录,它会回滚

    有什么理由让它这么做。请建议是否有任何方法避免ora-01002错误

    很抱歉,由于公司政策,无法在此发布编码。但是上面给出的伪代码就是如何编码的

    附加信息->如果我以这种方式执行程序,则不会收到错误“ORA-01002”


    端环

    > P>当你这样处理你的记录时,你不应该在处理过程中有这样的<代码>提交/代码> /<代码>回滚< /代码>。strong>
    回滚
    无效的当前光标。在任何情况下,您都应该在500条记录之后提交,并处理异常

    一旦您回滚,Oracle就不可能回忆起光标应该在哪里

    和的语句7一样,您应该处理所有的统一异常,以防

    --- declare exception
    failure_in_forall   EXCEPTION;  
    PRAGMA EXCEPTION_INIT (failure_in_forall, -24381);  
    
    ...
    -- handle it
    EXCEPTION   
            WHEN failure_in_forall 
      ...
    

    然后你的好记录将被处理并提交,坏记录将在以后审查和处理

    @J Chomel非常感谢。我知道光标由于回滚而失效。但我仍然有疑问。仅当我用于更新时,回滚才会无效。如果我错了,请纠正我。谢谢,当我以前提交时,将bulk collect提取到类型中,然后给出rollback,问题就消失了。为什么会这样?我也不能对普通循环使用PRAGMA EXCEPTION_INIT,如果我错了请纠正我。@Premakumari,PRAGMA必须位于您的
    DECLARE
    部分;我不完全确定问题应该发生在哪里,但在我看来,像你一开始做的那样进行回滚是不正确的。幸好你找到了一个解决办法。但我无法解释为什么会这样。可能这是一个新事务的开始,需要允许下面的回滚。我还检查了光标是否关闭。但令我惊讶的是,光标并没有失效或关闭。它处于打开状态。这种奇怪行为的原因可能是什么?
    --- declare exception
    failure_in_forall   EXCEPTION;  
    PRAGMA EXCEPTION_INIT (failure_in_forall, -24381);  
    
    ...
    -- handle it
    EXCEPTION   
            WHEN failure_in_forall 
      ...