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 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示