CREATE OR REPLACE TRIGGER SEWRANINGTIME_TRIG
before INSERT ON SEWARNINGTIME
FOR EACH ROW 
DECLARE
v_type_name sewarningtime.type_name%type;BEGIN
SELECT type_name
INTO v_type_name 
FROM DICTIONARY
WHERE type_id= :new.type_id;:new.type_name:= v_type_name;
END;

解决方案 »

  1.   

    根据ORACLE的规则,DML触发器不能同时在写基表的时候读基表本身
    你的问题可以用替代视图实现
    基本思路
    AA表
    ID  NAME  TYPE_NAMEBB表
    ID  NAME  TYPE_NAME先建立一张AA表的视图
    create or replace view as select * from aa;然后在aa_view上建立替代视图update_aa
    create or replace trigger update_aa
    instead of insert on aa_view
    referencing new as n
    for each row
    declare
     rowcnt number;
     btype_name bb.type_name%type;
    begin
     select count(*) into rowcnt from aa where id=:n.id;
     if rowcnt != 0 then
        update aa set type_name=(select type_name from bb where id=:n.id)
        where aa.id=:n.id;
     else
        select type_name into btype_name from bb where id=:n.id;
        insert into aa values(:n.name,:n.id,btype_name);
     end if;
    end;
    /这样,不要对AA表进行INSERT 操作,只要对AA_VIEW进行INSERT 操作就可以啦
    我的触发器你自己可以改进一下的