Sql 通过DB链路从相关远程表移动数据

Sql 通过DB链路从相关远程表移动数据,sql,database,oracle,plsql,Sql,Database,Oracle,Plsql,有两个远程表A_-REM和B_-REM具有外键关系,但没有外键约束,每天在表A_-REM和表B_-REM中有大约10000行新行。大多数操作都是插入操作。现在我想将数据从A_REM和B_REM移动到本地表A_LOC和B_LOC,并在处理时锁定行。移动后,应删除表A_REM和B_REM中的行 A_REM B_REM 1 ----- |_ 1 |_ 2 |_ 3 -------------------- 2 ----- |_ 4 |_ 5 row

有两个远程表A_-REM和B_-REM具有外键关系,但没有外键约束,每天在表A_-REM和表B_-REM中有大约10000行新行。大多数操作都是插入操作。现在我想将数据从A_REM和B_REM移动到本地表A_LOC和B_LOC,并在处理时锁定行。移动后,应删除表A_REM和B_REM中的行

A_REM    B_REM
1 ----- |_ 1
        |_ 2
        |_ 3
--------------------
2 ----- |_ 4
        |_ 5 rows 2 and 4-6 are locked while moving
        |_ 6
--------------------
3 ----- |_ 7
        |_ 8
        |_ 9
在保持表A_REM和B_REM(一致性)数据之间的关系的同时,移动数据的最佳方式是什么。如果我只有一个表,我会将“FOR UPDATE OF”语句与游标()结合使用


非常感谢。

如果事务中只有一个远程数据库,则它不是分布式事务,因此其行为与本地事务相同(而不是跨多个远程数据库的分布式事务)。以下示例显示了如何获得正确的行级锁,并在单个工作单元中以所需的数据一致性移动数据

create table a_rem ( aid number, acontent varchar2(10) );
create table b_rem ( bid number, aid number, bcontent varchar(10) );

create table a_loc ( aid number, acontent varchar2(10) );
create table b_loc ( bid number, aid number, bcontent varchar(10) );

insert into a_rem values ( 1, 'A-One' );
insert into a_rem values ( 2, 'A-Two' );
insert into a_rem values ( 3, 'A-Three' );

insert into b_rem values ( 1, 1, 'B-One' );
insert into b_rem values ( 2, 1, 'B-Two' );
insert into b_rem values ( 3, 2, 'B-Three' );
insert into b_rem values ( 4, 3, 'B-Four' );
insert into b_rem values ( 5, 3, 'B-Five' );

commit;
-- look Ma, no data integrity! :(

-- let us pretend I want to move a_rem.aid = 2 information from both tables
declare
   cursor row_level_locks is 
   select a.*, b.* 
     from a_rem a, b_rem b 
    where a.aid = b.aid and a.aid = 2 
      for update;
begin
   open row_level_locks; -- begins transaction, obtains proper row level locking
   insert into a_loc select * from a_rem where aid = 2;
   insert into b_loc select * from b_rem where aid = 2;
   delete a_rem where aid = 2;
   delete b_rem where aid = 2;
   commit;
   close row_level_locks;
end;

最后一点注意:如果两个表之间的数据完整性很重要,请继续在引用A_REM的B_REM上创建外键约束。如果不能/不愿意,则数据完整性不重要。要确保它不被执行,这不可能既重要又琐碎。

听起来您正在尝试构建自己的复制解决方案。您没有利用任何Oracle内置复制技术的原因是什么?例如,您是否可以在本地系统上创建物化视图,在远程系统上创建物化视图日志,而不是维护单独的更改表?您可以使用Streams或CDC吗?是的,标准复制解决方案将是最好的方法。但目前还不可能建立一个。谢谢