<script type="text/javascript">
</script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
保存点( SavePoint)是事务处理过程中的一个标志,与回滚命令(ROLLBACK)结合使用,主要的用途是允许用户将某一段处理回滚而不必回滚整个事务,这在PL/SQL开发中还是很有用处的。
下面的例子中,把 SavePoint标记在INSERT语句之前,如果这条INSERT语句试图将重复的数据保存到EMP表中的话,将触发执行预先定义的DUP_VAL_ON_INDEX例外处理,在这里面的ROLLBACKTOdo_insert命令将回滚上面的那条INSERT操作,而不会影响前面的任何操作。
DECLARE
emp_id emp.empno%TYPE;
BEGIN
UPDATEempSET...WHEREempno=emp_id;
DELETEFROMempWHERE...
...
SavePointdo_insert;
INSERTINTOempVALUES(emp_id,...);
EXCEPTION
WHENDUP_VAL_ON_INDEXTHEN
ROLLBACKTOdo_insert;
END;
如果你定义了多个 SavePoint,当你指定回滚到某个 SavePoint时,那么回滚操作将回滚这个 SavePoint后面的所有操作(即使后面可能标记了N个 SavePoint)。例如,在一段处理中
你定义了五个 SavePoint,从第三个 SavePoint回滚,后面的第四、第五个标记的操作都将被回滚,如果不使用ROLLBACKTO SavePoint_name而使用ROLLBACK,将会滚整个事务处理。
如果你在递归子程序里面定义了一个 SavePoint,如果每一个递归层都设置了 SavePoint.此时,你只能回滚到最近的一个 SavePoint.
SavePoint的声明可以在同一个事务处理里面重复定义.它的作用就是把 SavePoint从上一个位置转移到目前的位置.因而,执行回滚也只回滚到最近的 SavePoint.
下面是一个例子:
BEGIN
...
SavePointmy_point;
UPDATEempSET...WHEREempno=emp_id;
...
SavePointmy_point; --movemy_pointtocurrentpoint
INSERTINTOempVALUES(emp_id,...);
EXCEPTION
WHENOTHERSTHEN
ROLLBACKTOmy_point;
END;
另外,没有对每个session里面可以使用的 SavePoint个数做限制.
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript">
</script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
保存点( SavePoint)是事务处理过程中的一个标志,与回滚命令(ROLLBACK)结合使用,主要的用途是允许用户将某一段处理回滚而不必回滚整个事务,这在PL/SQL开发中还是很有用处的。
下面的例子中,把 SavePoint标记在INSERT语句之前,如果这条INSERT语句试图将重复的数据保存到EMP表中的话,将触发执行预先定义的DUP_VAL_ON_INDEX例外处理,在这里面的ROLLBACKTOdo_insert命令将回滚上面的那条INSERT操作,而不会影响前面的任何操作。
DECLARE
emp_id emp.empno%TYPE;
BEGIN
UPDATEempSET...WHEREempno=emp_id;
DELETEFROMempWHERE...
...
SavePointdo_insert;
INSERTINTOempVALUES(emp_id,...);
EXCEPTION
WHENDUP_VAL_ON_INDEXTHEN
ROLLBACKTOdo_insert;
END;
如果你定义了多个 SavePoint,当你指定回滚到某个 SavePoint时,那么回滚操作将回滚这个 SavePoint后面的所有操作(即使后面可能标记了N个 SavePoint)。例如,在一段处理中
你定义了五个 SavePoint,从第三个 SavePoint回滚,后面的第四、第五个标记的操作都将被回滚,如果不使用ROLLBACKTO SavePoint_name而使用ROLLBACK,将会滚整个事务处理。
如果你在递归子程序里面定义了一个 SavePoint,如果每一个递归层都设置了 SavePoint.此时,你只能回滚到最近的一个 SavePoint.
SavePoint的声明可以在同一个事务处理里面重复定义.它的作用就是把 SavePoint从上一个位置转移到目前的位置.因而,执行回滚也只回滚到最近的 SavePoint.
下面是一个例子:
BEGIN
...
SavePointmy_point;
UPDATEempSET...WHEREempno=emp_id;
...
SavePointmy_point; --movemy_pointtocurrentpoint
INSERTINTOempVALUES(emp_id,...);
EXCEPTION
WHENOTHERSTHEN
ROLLBACKTOmy_point;
END;
另外,没有对每个session里面可以使用的 SavePoint个数做限制.
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript">
</script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>