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;