最近写了个触发器
同步2张表
但是现在触发器内写的insert不能用
create or replace trigger xnuser
after insert
on tab_webusers
for each row
declare
-- local variables here
integrity_error exception;
errno integer;
errmsg char(200);
maxid integer;
sex char(10);
type1 char(1);
orgid char(1);
begin select max(id) into maxid from vr_userinfo@xnsql;
maxid:=maxid+1; if inserting then
if :new.utype='1' then
type1:='1';
orgid:='1';
else
type1:='3';
orgid:='3';
end if;
if :new.usex='1' then
sex:='男';
elsif :new.usex='2' then
sex:='女';
else
sex:='';
end if;
insert into vr_userinfo@xnsql("ID","Code","Pass","Name","Type","AdminType","Level","SpriteCode","Sex","OrgID","Re","Status") values
(maxid,:NEW.USENO,:NEW.UPASSWORD,:NEW.UNAME,type1,'0','1','man1',sex,orgid,'dead测试','1');
end if;
exception
when integrity_error then
raise_application_error(errno, errmsg);end xnuser;单独把insert语句拿出来运行没有问题 但是放在触发器内就有问题 发生死锁 说被事务挂起
谁帮我分析分析?
同步2张表
但是现在触发器内写的insert不能用
create or replace trigger xnuser
after insert
on tab_webusers
for each row
declare
-- local variables here
integrity_error exception;
errno integer;
errmsg char(200);
maxid integer;
sex char(10);
type1 char(1);
orgid char(1);
begin select max(id) into maxid from vr_userinfo@xnsql;
maxid:=maxid+1; if inserting then
if :new.utype='1' then
type1:='1';
orgid:='1';
else
type1:='3';
orgid:='3';
end if;
if :new.usex='1' then
sex:='男';
elsif :new.usex='2' then
sex:='女';
else
sex:='';
end if;
insert into vr_userinfo@xnsql("ID","Code","Pass","Name","Type","AdminType","Level","SpriteCode","Sex","OrgID","Re","Status") values
(maxid,:NEW.USENO,:NEW.UPASSWORD,:NEW.UNAME,type1,'0','1','man1',sex,orgid,'dead测试','1');
end if;
exception
when integrity_error then
raise_application_error(errno, errmsg);end xnuser;单独把insert语句拿出来运行没有问题 但是放在触发器内就有问题 发生死锁 说被事务挂起
谁帮我分析分析?
maxid := maxid + 1;
这种方式生成ID存在并发问题,改成序列
maxid := maxid + 1;
就是单独的
insert into vr_userinfo@xnsql
("ID","Code","Pass","Name","Type","AdminType","Level","SpriteCode","Sex","OrgID","Re","Status")
values
('1','1','1','1','1','0','1','man1','1','1','dead测试','1');
这样插入 也在触发器内也还是报一样的错误
单独执行INSERT就可以 所以很纳闷
after insert
on tab_webusers
for each row
declare
-- local variables herebegin
if inserting then
insert into vr_userinfo@xnsql
("ID","Code")
values
('10','10');end xnuser;我都改成这样了 还是报错 说事务挂起~难道触发器内不能INSERT?
TRIGGER TCLM.XNUSER 编译错误错误:PLS-00103: 出现符号 "DBMS_SESSSION"在需要下列之一时:
:= . ( @ % ;
符号 ":=" 被替换为 "DBMS_SESSSION" 后继续。
行:16
文本:exec dbms_sesssion.close_database_link('xnsql');
--事情是这样的,oracle中存在事务的概念,而事务是由oracle自动维护的
--而类似于 insert into xxx@dblink_name .... 这样的语句,将数据插入到远端数据库的操作
--会造成oracle无法控制远端数据库的事务而导致 事务发生终端,因此oracle中是不允许进行类似的操作的。
----换句话说你的触发器设计思路就存在问题--不过你可以改一个思路,在本地建一个表 vr_userinfo,将数据插入
--然后在远端数据库上建一个定时任务,同步这个表
----insert into vr_userinfo select * from vr_userinfo@dblink_name;
-----这样的语句是不会导致oracle的事务中断而报错的。
高手求解~
ORACLE不准~~555