Sql 取出顺序错误<;ora-01002>;回降
今天我遇到了“提取顺序错误”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
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
...