使用触发器使用DBLINK同步带有CLOB字段的表的DML

版权声明:本文为原创文章,转载请标明出处。 https://blog.csdn.net/zwjzqqb/article/details/81484502
-- 本机vincent用户创建clob测试表
conn vincent/vincent
create table emp_clob(empno NUMBER(4), ename CLOB);
alter table emp_clob add constraint PK_emp_clob primary key (empno);
create table emp_clob_copy(empno NUMBER(4), ename CLOB);
alter table emp_clob_copy add constraint PK_emp_clob_copy primary key (empno);
-- 注意此处必须得添加主键,否则同一个会话多个事务反复insert时会重复复制,原因未知
-- 本机vincent用户创建dblink连接到自己
conn / as sysdba
grant create database link to vincent;
conn vincent/vincent
create database link vincent251
  connect to vincent identified by vincent
  using '(DESCRIPTION =
          (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.251)(PORT = 1521)))
          (CONNECT_DATA = (SERVICE_NAME = XXX)))';
select count(*) from emp_clob@vincent251;
-- 本机vincent用户创建触发器,使用dblink同步INSERT到带有CLOB的表
Create Global Temporary Table temp_emp_clob
  (empno NUMBER(4), ename CLOB) On Commit Delete Rows;

create or replace trigger tri_emp_clob
  after INSERT OR DELETE OR UPDATE on emp_clob
  for each row
begin
  case
    when inserting THEN
      insert into temp_emp_clob
        (empno,ename)
      values
        (:NEW.empno,:NEW.ename);
      insert into emp_clob_copy@vincent251
      select * from temp_emp_clob where empno=:NEW.empno;
    when deleting THEN
      delete from emp_clob_copy@vincent251 where empno=:OLD.empno;
    when updating THEN
      update emp_clob_copy@vincent251
         set empno=:NEW.empno,
             ename=:NEW.ename
       where empno=:OLD.empno;
  end case;
end;
/
-- 测试:
insert into emp_clob select empno,ename from emp;
commit;
select count(*) from emp_clob;
select count(*) from emp_clob_copy;
-- 如果表没有主键,则当前会话反复insert
-- emp_clob_copy表中会有很多重复复制的记录
-- insert into emp_clob select empno,ename from emp;
-- commit;
-- insert into emp_clob select empno,ename from emp;
-- commit;
-- select count(*) from emp_clob;
-- select count(*) from emp_clob_copy;

delete from emp_clob where empno=7788;
commit;
select count(*) from emp_clob;
select count(*) from emp_clob_copy;

update emp_clob set ename='VINCENT' where empno=7369;
commit;
select * from emp_clob_copy;

[TOC]

猜你喜欢

转载自blog.csdn.net/zwjzqqb/article/details/81484502