liero1982 2019-02-15 09:28 采纳率: 0%
浏览 913

ORACLE触发器如何向客户端抛出自定义错误,同时写表记录该事件?

ORACLE建立一个触发器,记录pat_visit 表的某字段被修改的情况,写入tmp_msg表。
记录部分是正常工作的,直到后来为了向客户端抛出错误提示“非法操作,护士……”增加了后面的raise_application_error那一大段。
如果抛出自定义异常的话,前面的记录操作也一同失效,即使是加了commit也不管用。
如何能够即抛出自定义异常同时又能修改(其他表)记录呢?

create or replace trigger TMP_REC_WHO_CHANGE_ADDEPT
  before update of dept_admission_to on pat_visit  
  for each row
--监视pat_visit入院科室改动
declare
  mymsg varchar(2000);
begin
  select ... into mymsg from v$session where audsid=sys_context('USERENV','SESSIONID');

  if :old.dept_admission_to <> :new.dept_admission_to then
    insert into tmp_msg(rec_creator,rec_msg) 
      values ('REC_WHO_CHANGE_ADDEPT',mymsg);
    commit; --如果下方向客户端抛出异常,提交也不起作用

    if upper(mymsg) like '%NURSE.EXE%' then
      if sysdate - nvl(:old.admission_date_time,sysdate) > 0.25 then
        raise_application_error('-20002', '非法操作,护士站尝试修改入院日期');
      end if;
    end if;
  end if;
end tmp_rec_who_change_ADDEPT;
  • 写回答

2条回答 默认 最新

  • bzme 2019-11-11 11:32
    关注

    create or replace trigger TMP_REC_WHO_CHANGE_ADDEPT
    before update of dept_admission_to on pat_visit

    for each row
    --监视pat_visit入院科室改动
    declare
    mymsg varchar(2000);
    begin
    select ... into mymsg from v$session where audsid=sys_context('USERENV','SESSIONID');

    if :old.dept_admission_to <> :new.dept_admission_to then
    insert into tmp_msg(rec_creator,rec_msg)
    values ('REC_WHO_CHANGE_ADDEPT',mymsg);
    commit; --如果下方向客户端抛出异常,提交也不起作用

    if upper(mymsg) like '%NURSE.EXE%' then
      if sysdate - nvl(:old.admission_date_time,sysdate) > 0.25 then
        raise_application_error('-20002', '非法操作,护士站尝试修改入院日期');
      end if;
    end if;
    

    end if;

    WHEN OTHERS THEN --在这里把错误处理掉即可
           dbms_output.put_line('吃掉了错误,commit即能生效,要注意在函数中如果已经修改了表,但在这里不再次raise错误而return,一旦客户端误commit,会导致表的数据部分修改而混乱');
            --raise;
            --return 0;
    

    end tmp_rec_who_change_ADDEPT;

    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器