2012-09-06 38 views
0

如果我更新ACK或ReJ列,它應該使用相同的GlobalID更新所有其他列。使用觸發器更新後更新同一表中的多行

create table t_emp(
    empid varchar2(10) not null, 
    empname varchar2(50), 
    Dep varchar2(50), 
    ACk number(5), 
    REJ number(5), 
    globalID varchar2(10) default '0' 
); 

insert into t_emp t values ('TM01' , 'Logu','Java',null,null,'01'); 
insert into t_emp t values ('BT01' , 'Logu','Java' ,null,null,'01'); 
insert into t_emp t values ('Oracle01' , 'Logu','DBA' ,null,null,'01'); 
insert into t_emp t values ('Google01' , 'Logu','Design' ,null,null,'0'); 
insert into t_emp t values ('AR02' , 'Uthaya','CRM' ,null,null,'02'); 
insert into t_emp t values ('RIL02' , 'Uthaya','Java' ,null,null,'02'); 
insert into t_emp t values ('EA02' , 'Uthaya','DBA' ,null,null,'02'); 
insert into t_emp t values ('TCS02' , 'Uthaya','Java' ,null,null,null); 
insert into t_emp t values ('P05' , 'Krish','.Net' ,null,null,'05'); 
insert into t_emp t values ('TCS06' , 'Krish','.Net' ,null,null,'06'); 
insert into t_emp t values ('IBM06' , 'Krish','.Net' ,null,null,'06'); 

CREATE OR REPLACE TRIGGER t_emp_update 
AFTER UPDATE 
    ON t_emp 
    FOR EACH ROW 
DECLARE 
    t_Ack varchar2(15); 
    t_Rej varchar2(15); 
    t_globalID varchar2(10); 
    t_empid varchar2(10); 
BEGIN 
    t_globalID := :new.globalID; 
    t_Ack := :new.ACk; 
    t_Rej := :new.REJ; 
    t_empid := :new.empid; 
    IF t_Ack is not null then 
     DBMS_OUTPUT.PUT_LINE('t_Ack := ' || t_Ack || ', t_globalID := '|| t_globalID ||', t_empid := '||t_empid); 
     update t_emp set ACk = t_Ack where globalID = t_globalID and empid != t_empid; 
    end if; 
    IF t_Rej is not null then 
     DBMS_OUTPUT.PUT_LINE('t_REJ := ' || t_Rej || ', t_globalID := '|| t_globalID ||', t_empid := '||t_empid); 
     update t_emp set Rej = t_Rej where globalID = t_globalID and empid != t_empid; 
    end if; 
END; 

update t_emp v set Rej = 1 where empid = 'TCS06'; 

如果我更新empid = 'TCS06'應該在內部更新所有行具有相同的globalID(06)。

select * from t_emp order by empname,globalID; 

我在這個觸發器中收到一些錯誤。

ORA-04091: table TEST1.T_EMP is mutating, trigger/function may not see it 
ORA-06512: at "TEST1.T_EMP_UPDATE", line 17 
ORA-04088: error during execution of trigger 'TEST1.T_EMP_UPDATE' 

好心幫我...

回答

1

This linkthis other one應該是有益的理解的錯誤以及如何糾正它。同時檢查一個AFTER UPDATE觸發器的樣本。

檢查一個similar question這裏在SO與詳細的答案。

+1

謝謝,你我有一個不... 我搬到了應用程序更改... 但我學到了更多有關觸發器.. – Uthay

+1

歡迎您......教導一個人理智,他會一輩子思考;) – Yaroslav