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;

    评论

报告相同问题?

悬赏问题

  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常