触发器调用带有参数的存储过程不能使数据同步的问题

第一次发帖还是比较激动的。新人,新鸟,刚接触java半年,刚工作两个月,有些比较困扰的问题解决出来了想跟大家分享一下。前排混脸熟,大神请指点一二,顺便求大腿罩~

最近在用dblink做数据库同步,在数据库层面写触发器调用存储过程的时候老是不能实现两个数据库的数据同步,代码(已改原来代码,举个例子)如下:


触发器:

create or replace trigger TRI_DEPINFO_INERT
AFTER insert on t_dept
for each row
declare
PRAGMA AUTONOMOUS_TRANSACTION;
begin
PRO_WORK_INSERT(:NEW.F_ID);
commit;
end TRI_DEPINFO_INERT;

存储过程:
create or replace procedure PRO_WORK_INSERT(IDS IN NUMBER) as
NUMS NUMBER;
begin
SELECT COUNT(*)
INTO NUMS
FROM (select V.F_ID
from (SELECT *
FROM T_DEPARTMENT T
CONNECT BY PRIOR T.F_ID = T.F_PID
START WITH T.F_ID = ‘1381’) V) S
where S.F_ID = IDS;
if NUMS > 0 then
INSERT INTO V_DEPARTMENT@dblink1
(ID,
UNITCODE,
UNITNAME,
UNITBELONG,
UNITTYPEID,
ISOLD,
OPERID
)
SELECT F_ID, F_ID, F_NAME, F_PID ,
F_NODETYPE, ‘0’, F_ID
FROM T_DEPARTMENT
WHERE F_ID = IDS;
END IF;
end PRO_WORK_SELECT;


很简单的insert过程,看上去没错,真的,运行起来也不报错,但就是不能实现
两个表的内容同步。本人经过验证,:new.f_id在触发器能取到值,debug赋值给存储过程也能实现同步,但为什么感觉就是不走呢?困扰本菜鸟两天,无意中把ids
直接给成要添加的数据id值,没同步,很是伤心;我就在想是不是:new.f_id没法这么用?但是网上说这样挺正确的呀,抱着好奇心创建了个types depart,然后用获取到的:new.f_id赋值给 depart.id传值过去,结果还是没法同步。无意中又添加一条数据,上条id值没变,卧槽,上条同步过去了。
是不是子查询有问题?看着已经创建一个types了,干脆用types定义个table depart当中间表用,然后再查询。确确实实同步过去了。

修改后代码如下:


触发器:
create or replace trigger TRI_DEPINFO_INERT
AFTER insert on t_dept
for each row
declare
PRAGMA AUTONOMOUS_TRANSACTION;
begin
INSERT INTO depart T
(T.F_ID,T.F_NAME,T.F_PID,T.F_NODETYPE)
VALUES
(:NEW.F_ID,
:NEW.F_NAME,
:NEW.F_PID,
:NEW.F_NODETYPE);
PRO_WORK_INSERT(:NEW.F_ID);
commit;
end TRI_DEPINFO_INERT;

存储过程:
create or replace procedure PRO_WORK_INSERT(IDS IN NUMBER) as
NUMS NUMBER;
begin
SELECT COUNT(*)
INTO NUMS
FROM (select V.F_ID
from (SELECT *
FROM depart T
CONNECT BY PRIOR T.F_ID = T.F_PID
START WITH T.F_ID = ‘1381’) V) S
where S.F_ID = IDS;
if NUMS > 0 then
INSERT INTO V_DEPARTMENT@dblink1
(ID,
UNITCODE,
UNITNAME,
UNITBELONG,
UNITTYPEID,
ISOLD,
OPERID
)
SELECT F_ID, F_ID, F_NAME, F_PID ,
F_NODETYPE, ‘0’, F_ID
FROM depart
WHERE F_ID = IDS;
END IF;
end PRO_WORK_SELECT;


有心的同学可以把中间表的insert再写到存储过程中去。

从这点来说,当使用本表数据同步同时子查询本表的时候是查询不到新增数据的id的,这条数据还没有被添加。当把这条数据放到中间表然后再查询中间表的时候就解决了。

虽然解决了,但是感觉还是一直半懂,毕竟看过数据库基础,也不知道自己说得对不对。请大神们指正。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值