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

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;
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • qq_35919090 bzme 2年前

    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;

    点赞 评论 复制链接分享

相关推荐