我有一个Oracle软件包,它循环遍历一系列过程并动态调用它们。在每次过程调用之前,都会创建一个SAVEPOINT,如果引发异常,它会发出回滚并记录问题。最近引入了一个错误,其中一个动态过程添加了一个COMMIT,当触发时,它会使SAVEPOINT无效。如果相同的过程失败(引发异常)并且调用包的异常处理程序尝试回滚,则会在异常处理程序块 中引发以下异常:
ORA-01086: savepoint 'EXAMPLE_SAVEPOINT' never established in this session or is invalid
现在,我可以在我的异常处理程序中放置另一个异常处理程序来处理这个特定的异常,但是如果我能快速检查SAVEPOINT以查看它是否是在尝试发出回滚之前有效或不有效。这可能吗?
答案 0 :(得分:2)
我认为你将不得不忘记它;抱歉。 2013年4月有人问Tom Kyte这个问题,his response:
2)oracle在哪里跟踪我们创建的保存点?是SCN 是为创建的保存点创建的?
我们说...
...
2)保存点在概念上是指向撤消流的指针。 我们不需要SCN,我们只需要知道它有多远 你的撤销流回滚到。
Jonathan Lewis和Burleson都不认为它们存储在数据字典中的任何位置。如果您正在使用Workspace Manager或想要使用Restore Points,那么数据将分别存储在ALL_WM_MODIFIED_TABLES和V$RESTORE_POINT中,但这似乎有些过分。