SavePoint(bzszp)

<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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值