求一个触发器

xuedong1125 2011-02-25 01:22:52
假设本地的数据库为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表主键的触发器的写法,分数不多,如果有解决办法了,必将剩余的分全部送上!

在线等结果。。
...全文
118 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuedong1125 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 gelyon 的回复:]
引用 3 楼 xuedong1125 的回复:
那这个b表是N个用户都在往这里面插数据,能确保select回来的max(bh)就是我刚才插入的那条吗- -?


引用 2 楼 gelyon 的回复:
SQL code

--不知道是不是这种效果:
create or replace trigger tr_a_bh
before insert on a
for each row
……
[/Quote]

新建了个数据库,测试之后,在建立触发器的时候,提示:
ora-22816 ora-06512 ora-04088

看样子不能用与远程表。。

看样子没什么好的办法了,我准备用b表的几个字段做定位,多选几个条件加起来,定位的能比max准一些。
minitoy 2011-02-25
  • 打赏
  • 举报
回复
估计只能想paddy那样取max,returning是不能用于远程表的.
xuedong1125 2011-02-25
  • 打赏
  • 举报
回复
我先测试一下!~

[Quote=引用 6 楼 gelyon 的回复:]
引用 3 楼 xuedong1125 的回复:
那这个b表是N个用户都在往这里面插数据,能确保select回来的max(bh)就是我刚才插入的那条吗- -?


引用 2 楼 gelyon 的回复:
SQL code

--不知道是不是这种效果:
create or replace trigger tr_a_bh
before insert on a
for each row
……
[/Quote]
minitoy 2011-02-25
  • 打赏
  • 举报
回复
不能保证,只能说是近似.
这个需求很纠结,不好处理.
gelyon 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xuedong1125 的回复:]
那这个b表是N个用户都在往这里面插数据,能确保select回来的max(bh)就是我刚才插入的那条吗- -?


引用 2 楼 gelyon 的回复:
SQL code

--不知道是不是这种效果:
create or replace trigger tr_a_bh
before insert on a
for each row
declare
begin
insert i……
[/Quote]

--那有可能不是新插入的那个,不知道自治事务行不?
--或者就考虑用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;
xuedong1125 2011-02-25
  • 打赏
  • 举报
回复
写错了,只能插入数据和查询。。。

[Quote=引用 4 楼 zhuomingwang 的回复:]
B库为其他公司的数据库,只允许访问

只能访问 怎么可能修改b的数据呢...
[/Quote]
  • 打赏
  • 举报
回复
B库为其他公司的数据库,只允许访问

只能访问 怎么可能修改b的数据呢...
xuedong1125 2011-02-25
  • 打赏
  • 举报
回复
那这个b表是N个用户都在往这里面插数据,能确保select回来的max(bh)就是我刚才插入的那条吗- -?

[Quote=引用 2 楼 gelyon 的回复:]
SQL code

--不知道是不是这种效果:
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 :ne……
[/Quote]
gelyon 2011-02-25
  • 打赏
  • 举报
回复

--不知道是不是这种效果:
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;
gelyon 2011-02-25
  • 打赏
  • 举报
回复

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

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧