by 오재민 [SQL Query] after insert trigger [2012.11.05 21:28:04]
productnumber 가 product테이블의 PK인데요 첨에 입력 할 때 시퀀스 넘버로 값 넣어서
insert 한 후에 productcategory 값에 따라서 productnumber를 업데이트 해주는 트리거 인데 오류가 나네요..ㅜㅜ
1 행: ORA-04091: table HR.PRODUCT is mutating, trigger/function may not see it
ORA-06512: at "HR.SETPRODUCTNUMBER", line 24
ORA-04088: error during execution of trigger 'HR.SETPRODUCTNUMBER'
ORA-06512: at line 1
소스코드
create or replace
trigger setproductnumber after update of productnumber or insert on product
for each row
declare
i_category varchar2(40) := :new.productcategory;
i_productnumber int := :new.productnumber;
begin
if updating then
UPDATE order_line
set order_line.productnumber = :NEW.productnumber
where order_line.productnumber = :OLD.productnumber;
elsif inserting then
if i_category = '남자 상의 긴 옷' then
update product
set productnumber = (111*10000000 + i_productnumber)
where productnumber = i_productnumber;
elsif i_category = '남자 상의 짧은 옷' then
update product
set productnumber = (112*10000000 + i_productnumber)
where productnumber = i_productnumber;
elsif i_category = '남자 하의 긴 옷' then
update product
set productnumber = (121*10000000 + i_productnumber)
where productnumber = i_productnumber;
elsif i_category = '남자 하의 짧은 옷' then
update product
set productnumber = (122*10000000 + i_productnumber)
where productnumber = i_productnumber;
elsif i_category = '여자 상의 긴 옷' then
update product
set productnumber = (211*10000000 + i_productnumber)
where productnumber = i_productnumber;
elsif i_category = '여자 상의 짧은 옷' then
update product
set productnumber = (212*10000000 + i_productnumber)
where productnumber = i_productnumber;
elsif i_category = '여자 하의 긴 옷' then
update product
set productnumber = (221*10000000 + i_productnumber)
where productnumber = i_productnumber;
else
update product
set productnumber = (222*10000000 + i_productnumber)
where productnumber = i_productnumber;
end if;
end if;
end;
CREATE OR REPLACE TRIGGER setproductnumber BEFORE UPDATE OF productnumber OR INSERT ON product FOR EACH ROW BEGIN IF UPDATING THEN UPDATE order_line SET order_line.productnumber = :NEW.productnumber WHERE order_line.productnumber = :OLD.productnumber; ELSIF INSERTING THEN :NEW.productnumber = CASE :NEW.productcategory WHEN '남자 상의 긴 옷' THEN 111*10000000 + :NEW.productnumber; WHEN '남자 상의 짧은 옷' THEN 112*10000000 + :NEW.productnumber; WHEN '남자 하의 긴 옷' THEN 121*10000000 + :NEW.productnumber; WHEN '남자 하의 짧은 옷' THEN 122*10000000 + :NEW.productnumber; WHEN '여자 상의 긴 옷' THEN 211*10000000 + :NEW.productnumber; WHEN '여자 상의 짧은 옷' THEN 212*10000000 + :NEW.productnumber; WHEN '여자 하의 긴 옷' THEN 221*10000000 + :NEW.productnumber; ELSE 222*10000000 + :NEW.productnumber; END; END IF; END;
-- Case 문은 아마도 Select 문에서만 사용 가능 할 것입니다. -- PL/SQL 에서는 IF 문을 써야 할것입니다. CREATE OR REPLACE TRIGGER setproductnumber BEFORE UPDATE OF productnumber OR INSERT ON product FOR EACH ROW DECLARE i_category VARCHAR2(40) := :new.productcategory; i_productnumber INT := :new.productnumber; i_temp INT; BEGIN IF UPDATING THEN UPDATE order_line SET order_line.productnumber = :NEW.productnumber WHERE order_line.productnumber = :OLD.productnumber ; ELSIF INSERTING THEN IF i_category = '남자 상의 긴 옷' THEN i_temp := 111; ELSIF i_category = '남자 상의 짧은 옷' THEN i_temp := 112; ELSIF i_category = '남자 하의 긴 옷' THEN i_temp := 121; ELSIF i_category = '남자 하의 짧은 옷' THEN i_temp := 122; ELSIF i_category = '여자 상의 긴 옷' THEN i_temp := 211; ELSIF i_category = '여자 상의 짧은 옷' THEN i_temp := 212; ELSIF i_category = '여자 하의 긴 옷' THEN i_temp := 221; ELSE i_temp := 222; END IF; :NEW.productnumber = i_temp * 10000000 + i_productnumber; END IF; END; /