3

我有一个 Oracle 包,它循环遍历过程列表并动态调用它们。在每个过程调用之前,都会创建一个 SAVEPOINT,如果引发异常,它会发出回滚并记录问题。最近引入了一个错误,其中一个动态过程添加了一个 COMMIT,当触发它时,SAVEPOINT 无效。如果相同的过程随后失败(引发异常)并且调用包的异常处理程序尝试回滚,则在异常处理程序块内引发以下异常:

ORA-01086: savepoint 'EXAMPLE_SAVEPOINT' never established in this session or is invalid

现在,我可以在我的异常处理程序中放置另一个异常处理程序来处理这个特定的异常,但是如果我可以在尝试发出之前快速检查 SAVEPOINT 以查看它是否有效,那会更整洁回滚。这可能吗?

4

1 回答 1

2

我认为您将不得不忘记它;对不起。2013 年 4 月有人问 Tom Kyte 这个问题,他的回答是:

2) oracle 在哪里跟踪我们创建的保存点?是否为创建的保存点创建 SCN?

我们说...

...

2)保存点在概念上只是指向您的撤消流的指针。我们不需要 SCN,我们只需要知道在撤消流中回滚到多远。

Jonathan LewisBurleson都不认为它们存储在数据字典中的任何位置。如果您正在使用Workspace Manager或想要使用还原点,那么数据将分别存储在ALL_WM_MODIFIED_TABLESV$RESTORE_POINT中,但这似乎有点过头了。

于 2013-11-04T13:31:40.437 回答