日期:2014-05-17  浏览次数:20729 次

请教一个sp中回滚的问题
sp内容如下:
begin

  --插入激活申请录入数据
  insert into kmms.tb_acc_activ_apply
  (id,
  apply_man,
  cust_name,
  capital_account,
  fund_sum_minuscule,
  fund_sum_capital,
  sh_stockholder,
  sz_stockholder,
  bank_id,
  bank_assign_date,
  remark,
  status)
  select v_apply_id,
  i_user_id,
  i_cust_name,
  v_capital_account,
  i_fund_sum_minuscule,
  kmms.fc_get_dx_money(i_fund_sum_minuscule),
  v_sh_stockholder,
  v_sz_stockholder,
  i_bank_id,
  i_bank_assign_date,
  i_remark,
  v_status_dsp
  from dual;
  commit;

  begin
  select t.id
  into v_approve_man_id
  from ksmanage.tb_user t
  inner join sysmanage.tb_emp_position ep on t.id = ep.user_id
  inner join sysmanage.tb_user_position up on ep.position_id = up.id
  inner join kmms.tb_acc_activ_apply_appr_pos ap on ap.user_pos =
  ep.position_id
  where up.if_trunk = v_if_trunk_no
  and t.dept_id = v_dept_id_user
  and ap.approve_segment = v_approve_seg1;
  exception
  when no_data_found then
  ROLLBACK;
  --员工所在营业部未设置流程1的审批人,返回提示
  o_return_status := -13;
  o_return_msg := '您所在营业部未设置流程1的审批人,请联系电脑部系统管理员';
  return;
  when too_many_rows then
  rollback;
  --员工所在营业部设置了多个流程1的审批人,返回提示
  o_return_status := -13;
  o_return_msg := '您所在营业部设置了多个流程1的审批人,请联系电脑部系统管理员';
  return;
  end;

  select KMMS.SEQ_792006101.NEXTVAL into v_approve_id from dual;
  --插入审批流程数据
  insert into kmms.tb_acc_activ_apply_approve
  (id,
  apply_id,
  approve_segment,
  approve_remark,
  approve_man,
  set_time,
  set_date,
  if_end)
  select v_approve_id,
  v_apply_id,
  v_approve_seg1,
  '第一次审批',
  v_approve_man_id,
  to_char(sysdate, 'HH24:MI:SS'),
  to_char(sysdate, 'YYYYMMDD'),
  v_if_end_no
  from dual;
  o_return_status := 0;
  o_return_msg := '添加成功!';
  commit;
 

问题如下:
在前台录入数据时,过了第一个commit后走入“exception
  when no_data_found then
  ROLLBACK;
  --员工所在营业部未设置流程1的审批人,返回提示
  o_return_status := -13;
  o_return_msg := '您所在营业部未设置流程1的审批人,请联系电脑部系统管理员';
”返回'您所在营业部未设置流程1的审批人,请联系电脑部系统管理员';
提示,但是查询了一下,发现rollback根本未起作用,第一个commit前面的表的数据还是录入成功了。

请问除了前面不用commit并且后面加入rollback这样的方法之外,如果前面加了commit有什么方法可以使得在后面出错时可将数据回滚?

在线等。
谢谢各位关注的大侠。

------解决方案--------------------
commit的数据时不能rollback的。非要想完成rollback的工作,可以再执行删除或者更新之前的操作。
------解决方案--------------------
要想回滚,只能做成一个事务,commit之后,数据被永久更改;
commit默认开启另一个事务,rollback只能回滚当前事务,以其它事务无关。
------解决方案--------------------
楼主说的功能,是嵌套事务。

SQL SERVER里有这个功能,

但ORACLE里没有。