create  trigger  tri_test  
after  insert  or update on a  
for  each  row 
begin
insert into b values (...);
...
end tri_test;
/

解决方案 »

  1.   

    to  bzszp(SongZip) ,
        A 表 insert 的时候对 B 表 insert,如果 B 表有对应的 id 值时,就 update 该记录。
        A 表 update 的时候对 B 表 update,但是如果 B 表没有对应的 id 值时,就插入该 update 的记录。
        应该怎么写?麻烦写详细一点,给我参考一下。我真的之前没怎么用过 sql 。就知道一些 select 语句。先谢过。
      

  2.   

    create  trigger  tri_test      
    after  insert  or  update  on  a      
    for  each  row   
    declare
    v_num number; 
    begin  
    if inserting then
    insert  into  b  values  (:new.col1,:new.col2,...);  
    end if;
    if updating then
    select count(*) into v_num from b where b.id=:new.id;
       if v_num<1 then
        insert into  b  values  (:new.col1,:new.col2,...);  
       else
        update b set col1=:new.col1,col2=:new.col2 ... where id=:new.id;
       end if;
    end if;
    end  tri_test;  
    /
      

  3.   

    写好了执行就可以了?不用保存什么的?这样,每当 db 起来的时候,trigger 就会自动开始吧?不用再执行了吧?
      

  4.   

    CREATE OR REPLACE TRIGGER SCCADMSEM.TRG_ALERT_NOTICE_PUBLISH_NEW2--给发送者产生一条警讯
    AFTER INSERT
    ON SCCADMSEM.A表
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    DECLARE
      param_alert_category_id VARCHAR2(50):='new_notice_publish';
      param_num INTEGER:=0;
      err_num NUMBER;
      err_msg VARCHAR2(100);
      shouldDisply_All VARCHAR2(1);
      param_description VARCHAR2(20):='新通告发布: ';  BEGIN
               SELECT COUNT(*) INTO param_num FROM A表名 A WHERE :NEW.NOTICE_PUBLISH_ID = A.NOTICE_PUBLISH_ID;
    IF param_num > 0 THEN
       shouldDisply_All := 'Y';
    END IF;
    INSERT INTO B表名(issue_id,issue_category_id,supplier_id,customer_id,create_date_time,reference_value_1,reference_value_2,last_modified_date_time,case_ended,description) 
    VALUES(issue_seq.NEXTVAL,param_alert_category_id,:NEW.PUBLISH_PARTY_ID,:NEW.PUBLISH_PARTY_ID,SYSDATE,TO_CHAR(:NEW.NOTICE_PUBLISH_ID),shouldDisply_All,SYSDATE,0, '->'||:NEW.PUBLISH_PARTY_ID ||':'||TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss')||param_description||TO_CHAR(:NEW.NOTICE_TOPIC));
      END;
    以上是个很简单的例子
      

  5.   

    不行,为什么按 F8 执行的时候,老是报错:ora-00942: Table or view does not exist. 其中 B 表是 DB link 的表。难道不支持?create  trigger  tri_test      
    after  insert  or  update  on  a      
    for  each  row   
    declare
    v_num number; 
    begin  
    if inserting then
    insert  into  b@tst1 (name, id, time, data1, data2) values  (:new.name,:new.id,:new.time,:new.data1,:new.data2);  
    end if;
    if updating then
    select count(*) into v_num from b where b.id=:new.id;
       if v_num<1 then
        insert into b@tst1 (name, id, time, data1, data2) values  (:new.name,:new.id,:new.time,:new.data1,:new.data2);  
       else
        update b@tst1 set time=:new.time,data1=:new.data1,data2=:new.data2 where id=:new.id;
       end if;
    end if;
    end  tri_test;
      

  6.   

    select  count(*)  into  v_num  from  b@tst1  where  b.id=:new.id;
      

  7.   

    to bzszp,      上一贴笔误,已经是 
    select  count(*)  into  v_num  from  b@tst1  where  id=:new.id; 了。
          总是出现,00942 错误。
      

  8.   

    单独执行下面的语句都没有问题啊!!!怪了。帮帮忙啊救命啊。
    insert  into  b@tst1 (name, id, time, data1, data2) values  ('x5',9,'20040102',89,99);  select count(*) from b@tst1 where id=2;update b@tst1 set time='20040102',data1=89,data2=99 where id=2;
      

  9.   

    你写一个简单的,
    看是不是在存储过程里面不能访问b@tst1表?
      

  10.   

    我试过了,连下面最简单的trigger都compile出错。晕啊。难道跟字符集有关?日文的。
    create  trigger  tri_test      
    after  insert  or  update  on  a      
    for  each  row   begin  insert  into  b@tst1 (name, id, time, data1, data2) values  (:new.name,:new.id,:new.time,:new.data1,:new.data2);  end  tri_test;
      

  11.   

    如果还是那个错误的话,
    就比较奇怪了
    用同样的用户登陆sql*plus执行这条语句可以访问b@tst1表?
      

  12.   

    to bzszp(SongZip),    谢谢,我发现问题了,用户!!!a表是另一个用户创建的。我换了一个用户再做一次就可以了。
        再一个问题,现在,我想通过 sql
    insert into b@tst1 (name, id, time, data1, data2) select name, id, time, data1, data2 from a
        把a表的所有数据都事先导入 b@tst1 表中,但是 b@tst1 表已存在 id 的记录就不覆盖了,sql该怎么写?上面的 sql 在 insert 的时候,因为 id 是 key 值,所以出错。
      

  13.   

    方法 一:如果你的id是key值,那么id列是不允许有重复值得 ,如果你的 a表里的数据不多,而且id值可以改变
    的话,可以尝试把id改一下。
    方法二:改变b表的主健。
    方法三:用“序列”但是这样你的a表的id还是要变得。
    由于不太清楚你的数据是怎么样的情况,所以只能说这些了,不对之处请大家指正。
      

  14.   

    insert  into  b@tst1  (name,  id,  time,  data1,  data2)  select  name,  id,  time,  data1,  data2  from  a 
    where not exists(select 1 from b@tst1 t where t.id=a.id); 
      

  15.   

    to cat_cat,
        主键不能动,因为另一个程序在读写a表,a,b表的数据很多,上万条,我觉得通过写 insert update 的 sql 导入初始数据最安全方便了。你觉得呢?to bzszp(SongZip) ,
        insert 的 sql 可以了。
        那如果,把a表的所有数据都导入 b@tst1 表时,对于 b@tst1 表已存在 id 的记录,如果 a.time>b.time就用 update sql 更新。这个 update 的 sql 又该怎么写?在这里先感谢帮忙了,不管怎样,明天给分。祝大侠,高高手国庆快乐。