写触发器的时候,注意写字段触发 before insert or update of department_id on employees 这样,就不会产生嵌套了。 不过,注意,再次更新的内容不能是触发器所触发的字段
create or replace trigger MR_FI_APS_ORGWORKCALENDAR before update of ISONDUTY on MT_PB_CL_ORGWORKCALENDAR for each row declare nISONDUTY_Old number(1); --是否上班 nISONDUTY_New number(1); --是否上班 nEXCEPTION_SIGN number(1);--例外标志 vPB_CL_ORGWORKCALENDARID varchar(36); --部门工作日历明细表ID begin --判断物理工厂数据是否符合触发条件 nISONDUTY_Old:= :old.ISONDUTY; nISONDUTY_New:= :new.ISONDUTY; nEXCEPTION_SIGN:= :old.EXCEPTION_SIGN; vPB_CL_ORGWORKCALENDARID:= :new.PB_CL_ORGWORKCALENDARID; BEGIN dbms_output.put_line(nISONDUTY_Old); dbms_output.put_line(nISONDUTY_New); dbms_output.put_line(nEXCEPTION_SIGN); END; if(nISONDUTY_Old <> nISONDUTY_New ) then if(nEXCEPTION_SIGN=1) then --原记录为例外 UPDATE MT_PB_CL_ORGWORKCALENDAR SET EXCEPTION_SIGN = 0 --更新例外标志 WHERE PB_CL_ORGWORKCALENDARID = vPB_CL_ORGWORKCALENDARID; else --原记录为正常 UPDATE MT_PB_CL_ORGWORKCALENDAR SET EXCEPTION_SIGN = 1 --更新例外标志 WHERE PB_CL_ORGWORKCALENDARID = vPB_CL_ORGWORKCALENDARID; end if; end if; end MR_FI_APS_ORGWORKCALENDAR;
不行啊,如果不用for each row 不能读取new和old的值
如果不用for each row 不能读取new和old的值, 因為沒有for each row,Trigger觸發的對象是整個Table,針對整個表的更新或操作,所以不會有:old,:new 有each row,表示觸發的對象是每一條記錄,所以對單筆記錄有:old的值和:New的值之分 因此,應該是for each row的只會鎖定被更新列,如果沒有for each row,該表整個表會被鎖定不允許再做update類的操作,可以試試...
select 1=1,1='1', '1.0'=1, '1'='1.0', '01' = ' 1', '01' = ' 1 ', 1='01 ', '1 '=1, '1.'=1, 1.00=1.0, '1.00'='1.0';What's the result in MYSQL? If using Oracle, add "from dual" at the end.DO YOU KNOW BEFORE RUNNING IT?
before insert or update
of department_id
on employees
这样,就不会产生嵌套了。
不过,注意,再次更新的内容不能是触发器所触发的字段
before update of ISONDUTY on MT_PB_CL_ORGWORKCALENDAR for each row
declare
nISONDUTY_Old number(1); --是否上班
nISONDUTY_New number(1); --是否上班
nEXCEPTION_SIGN number(1);--例外标志
vPB_CL_ORGWORKCALENDARID varchar(36); --部门工作日历明细表ID
begin
--判断物理工厂数据是否符合触发条件
nISONDUTY_Old:= :old.ISONDUTY;
nISONDUTY_New:= :new.ISONDUTY;
nEXCEPTION_SIGN:= :old.EXCEPTION_SIGN;
vPB_CL_ORGWORKCALENDARID:= :new.PB_CL_ORGWORKCALENDARID;
BEGIN
dbms_output.put_line(nISONDUTY_Old);
dbms_output.put_line(nISONDUTY_New);
dbms_output.put_line(nEXCEPTION_SIGN);
END;
if(nISONDUTY_Old <> nISONDUTY_New ) then
if(nEXCEPTION_SIGN=1) then --原记录为例外
UPDATE MT_PB_CL_ORGWORKCALENDAR SET EXCEPTION_SIGN = 0 --更新例外标志
WHERE PB_CL_ORGWORKCALENDARID = vPB_CL_ORGWORKCALENDARID;
else --原记录为正常
UPDATE MT_PB_CL_ORGWORKCALENDAR SET
EXCEPTION_SIGN = 1 --更新例外标志
WHERE PB_CL_ORGWORKCALENDARID = vPB_CL_ORGWORKCALENDARID;
end if;
end if;
end MR_FI_APS_ORGWORKCALENDAR;
因為沒有for each row,Trigger觸發的對象是整個Table,針對整個表的更新或操作,所以不會有:old,:new
有each row,表示觸發的對象是每一條記錄,所以對單筆記錄有:old的值和:New的值之分
因此,應該是for each row的只會鎖定被更新列,如果沒有for each row,該表整個表會被鎖定不允許再做update類的操作,可以試試...