假设本地的数据库为A,其中有表a(a_pk varchar2(10) primary key,b_bh varchar(10),b_name varchar(10),...),
有其他公司数据库为B,其中有表b(bh varchar(10) primary key,name varchar(10),...),
表b有触发器tr_b_bh,如下:(数据库B中有间隔设置为1的序列seq_b_bh)
---------------------------
create trigger tr_b_bh
before insert on b
for each row
declare
begin
  select seq_b_bh.nextval into :new.bh from dual;
end tr_b_bh;
--------------------------
B库为其他公司的数据库,只允许访问,不让修改表结构和建触发器建表之类的操作,
现在要实现的是,在本地的a表中插入数据,然后通过a的触发器自动插入到B库的b表中,b表的bh字段不能写入,只能由对方公司数据库自己生成。
因为向b表插入数据后,还要根据b表的改动对应修改a表的数据,但是b表数据项中只有bh一个唯一标识,所以需要在向b表插入数据后,自动取回到b表的主键bh字段,并更新回a表中。
试过returning方法,但是不能作用于远程数据库现求能向b表插入数据并取回b表主键的触发器的写法,分数不多,如果有解决办法了,必将剩余的分全部送上!在线等结果。。

解决方案 »

  1.   


    --创建DBLINK  ad_link  来访问B数据库啊,然后在A数据库a表创建触发器,触发器中往B数据库b表插值
    --要返回B数据库b表中最新插入的那个序列bh,只需要查询就是了啊
    --select max(bh) into b_bh from b@ad_link;
      

  2.   


    --不知道是不是这种效果:
    create or replace trigger tr_a_bh
    before insert on a
    for each row
    declare
    begin
      insert into b@ad_link(name,....) values (:new.name ,....) ;
      select max(bh) into :new.b_bh from b@ad_link;
    end tr_b_bh;
      

  3.   

    那这个b表是N个用户都在往这里面插数据,能确保select回来的max(bh)就是我刚才插入的那条吗- -?
      

  4.   


    --那有可能不是新插入的那个,不知道自治事务行不?
    --或者就考虑用returning方式呢?
    create trigger tr_a_bh
    before insert on a
    for each row
    declare
    sql_str varchar2(1000);
    begin
      sql_str:='insert into b@ad_link(name,....) values (:1 ,:2,....) returning bh into :3' ;
      execute immediate sql_str using :new.name,..... returning bulk collect into :new.b_bh;
    end tr_a_bh;
      

  5.   

    估计只能想paddy那样取max,returning是不能用于远程表的.
      

  6.   


    新建了个数据库,测试之后,在建立触发器的时候,提示:
    ora-22816 ora-06512 ora-04088看样子不能用与远程表。。看样子没什么好的办法了,我准备用b表的几个字段做定位,多选几个条件加起来,定位的能比max准一些。