向各位武林高手请教:
有三张表,a表,b表,c表,当向a表中插入一条数据时,判断这条数据中的某个字段值是否与b表中的某条记录的某个字段相等,
如果相等就将b表中的值插入到c表中去;(注:a表与b表只有一个字段是等同的,b表与c表是结构相同的表)

解决方案 »

  1.   

    create or replace trigger test 
    before update or delete or insert 
    on a 
    for each row 
    if inserting then
    begin 
    if exists(select 1 from b where names=:new.names)
    begin
    insert into c
    select * from b where names=:new.names;
    end;
    end ;
    end if;
      

  2.   

    可以这样简化:
    create or replace trigger test 
    before update or delete or insert 
    on a 
    for each row 
    if inserting then
    begin 
    insert into c
    select * from b where names=:new.names;end ;
    end if;
      

  3.   

    少了提交语句,再修改一点点:
    create or replace trigger test 
    before update or delete or insert 
    on a 
    for each row 
    if inserting then 
    begin 
      if exists(select 1 from b where names=:new.names) 
      begin 
        insert into c 
        select * from b where names=:new.names; 
        commit;
      end; 
      end if; 
    end if; 
      

  4.   

    大侠,你这样如果C表有主键或唯一索引那就报错了,楼主要求插入的时候才响应的.另外在trigger里面加个commit感觉不太安全啊.
    不知道可不可以加个pragma autonomous_transaction;
    最好不要随便在表里面加trigger,有时在前台调试了半天也不知道问题在哪里?
      

  5.   

    想不到csdn中的高手如云啊..
    谢谢你们的指教..
      

  6.   

    楼一高手:
    请问题 names=:new.names是什么意思啊..
    我a表字段是:QUERYCODE,b表字段是:APPCODE
    要求这两个字段值相等请问该怎么写啊..
      

  7.   

    CREATE OR REPLACE TRIGGER TRI_TAB
      BEFORE INSERT ON TAB1
      REFERENCING NEW AS NEW OLD AS OLD
      FOR EACH ROW
    DECLARE
      V_COUNT NUMBER;
    BEGIN
      SELECT COUNT(*)
        INTO V_COUNT
        FROM TAB2
       WHERE T1 = :NEW.T1
         AND T2 = :NEW.T2;
      IF V_COUNT >= 1 THEN
        INSERT INTO TAB3 VALUES (:NEW.T1, :NEW.T2);
      END IF;
    END TRI_TAB;
      

  8.   

    create or replace trigger test 
    before update or delete or insert 
    on tablea
    for each row 
    declare 
    v_count int;
    begin 
    if inserting then 
      select count(*) into v_count from tableb where  names=:new.names; 
      --if exists(select 1 from tableb where names=:new.names) then
      if v_count>0 then
        insert into tablec
        select * from tableb where names=:new.names; 
      end if; 
    end if; 
    end;
    为什么oracle会提示if exists(select 1 from tableb where names=:new.names) then
    exists用于sql语句呢,用这个编译不过呢,
      

  9.   

    if exists(select * from tableb where names=:new.names) then