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,
     re,
     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_re,
           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_re,
     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有什么方法可以使得在后面出错时可将数据回滚?在线等。
谢谢各位关注的大侠。

解决方案 »

  1.   

    commit的数据时不能rollback的。非要想完成rollback的工作,可以再执行删除或者更新之前的操作。
      

  2.   

    要想回滚,只能做成一个事务,commit之后,数据被永久更改;
    commit默认开启另一个事务,rollback只能回滚当前事务,以其它事务无关。
      

  3.   

    楼主说的功能,是嵌套事务。SQL SERVER里有这个功能,但ORACLE里没有。
      

  4.   

    谢谢各位,原来是因为不是在一个事物里造成的。
    我还是决定选择不加commit的方法了。
    就是上来请教一下原因的。