SQL Server与Oracle的数据同步方案及解决过程

转载 2012年07月02日 18:08:28
SQL Server与Oracle的数据同步方案及解决过程,更多内容请参考下文: 
说到同步,其实是靠"作业"定时调度存储过程来操作数据,增,删,改,全在里面,结合触发器,游标来实现,关于作业调度,我使用了5秒运行一次来实行"秒级作业",这样基本就算比较快的"同步" 


我做的是SQL Server往Oracle端同步,先在sql server上建立往Oracle端的链接服务器,我用一个视图"封装"了一下链接服务器下的一张表。 


create view v_ora_PUBLISHLASTREC 

as 

select * from ORACLEDB..ROADSMS.PUBLISHLASTREC 


//ORACLEDB链接服务器名,ROADSMS为表空间名,PUBLISHLASTREC 为数据表名 


然后我们分别在sql server 要同步的表上建立,insert,delete,update触发器 


脚本如下: 


--说明:modiid等于1为insert,2为delete,3为update 

create trigger trg_PUBLISHLASTREC_insert on PUBLISHLASTREC for insert 

as 

insert into dbo.PublishLastRec_SQL(modiid,SignalGUID,AreaNo,SignalNote,AreaNote,PublishRoadStatus,PublishTime,IsExec) 

select '1',SignalGUID,AreaNo,SignalNote,AreaNote,PublishRoadStatus,PublishTime,'0' from inserted 


create trigger trg_PUBLISHLASTREC_update on PUBLISHLASTREC for update 

as 

insert into dbo.PublishLastRec_SQL(modiid,SignalGUID,AreaNo,SignalNote,AreaNote,PublishRoadStatus,PublishTime,IsExec) 

select '3',SignalGUID,AreaNo,SignalNote,AreaNote,PublishRoadStatus,PublishTime,'0' from inserted 


create trigger trg_PUBLISHLASTREC_delete on PUBLISHLASTREC for delete 

as 

insert into dbo.PublishLastRec_SQL(modiid,SignalGUID,AreaNo,SignalNote,AreaNote,PublishRoadStatus,PublishTime,IsExec) 

select '2',SignalGUID,AreaNo,SignalNote,AreaNote,PublishRoadStatus,PublishTime,'0' from deleted 


所有的操作都是把各幻表的数据插入到一张表中,上面统一插入的表为PublishLastRec_SQL,记录下操作的标识,以标识该条记录是插入,删除,还是修改,modiid等于1为insert,2为delete,3为update,字段isexec标识该条记录是否已处理,0为未执行的,1为已执行的 


接着就是最关键的一步,存储过程 


脚本如下: 


ALTER proc pro_PublishLastRec_Sql 

as 

declare @modiid int 

declare @signalguid int 

declare @areano numeric(1,0) 

declare @signalnote varchar(50) 

declare @areanote varchar(50) 

declare @publishroadstatus varchar(20) 

declare @publishtime varchar(50) 


if not exists(select * from PublishLastRec_SQL where IsExec=0) 

begin 

truncate table PublishLastRec_SQL 

return 

end 


declare cur_sql cursor for 

select modiid,SignalGUID,AreaNo,SignalNote,AreaNote,PublishRoadStatus,PublishTime from 

PublishLastRec_SQL where IsExec=0 order by [id]--IsExec 0为未执行的,1为已执行的 

open cur_sql 

fetch next from cur_sql into @modiid,@SignalGUID,@AreaNo,@SignalNote,@AreaNote,@PublishRoadStatus,@PublishTime 


while @@fetch_status=0 

begin 

if (@modiid=1) --插入 

begin 

insert into v_ora_PUBLISHLASTREC(SignalGUID,AreaNo,SignalNote,AreaNote,PublishRoadStatus,PublishTime) 

values(@SignalGUID,@AreaNo,@SignalNote,@AreaNote,@PublishRoadStatus,@PublishTime) 

end 

if (@modiid=2) --删除 

begin 

delete from v_ora_PUBLISHLASTREC where SignalGUID=@SignalGUID and AreaNo=@AreaNo 

end 

if (@modiid=3) --修改 

begin 

update v_ora_PUBLISHLASTREC 

set SignalNote=@SignalNote,AreaNote=@AreaNote,PublishRoadStatus=@PublishRoadStatus, 

PublishTime=@PublishTime 

where SignalGUID=@SignalGUID and AreaNo=@AreaNo 

end 

update PublishLastRec_SQL 

set IsExec=1 

where current of cur_sql 

fetch next from cur_sql into @modiid,@SignalGUID,@AreaNo,@SignalNote,@AreaNote,@PublishRoadStatus,@PublishTime 

end 

deallocate cur_sql 


该存储过程使用游标逐行提取PublishLastRec_Sql记录,根据modiid判断不同的数据操作,该条记录处理完毕后把isexec字段更新为1. 


最后是调用该存储过程的作业,我们先建一个一分钟运行一次的作业,然后在"步骤"的脚本中这样写: 


DECLARE @dt datetime 

SET @dt = DATEADD(minute, -1, GETDATE()) 

WHILE @dt < GETDATE() 

BEGIN 

EXEC pro_PublishLastRec_Sql --这里pro_PublishLastRec_Sql 为你要作业执行的存储过程 

WAITFOR DELAY '00:00:05' -- 等待5秒, 根据你的需要设置即可 

END 

现在,我们即可以实现5秒执行一次该存储过程,做到5秒数据同步。

存储过程参数为DataTable

开发要求,前台一次性将多笔记录存入数据库中。也就是说,将一个DataTable作为一个参数传入。而数据库的存储过程,也得有一个表数据类型(sql2008) http://www.cnblogs.com...
  • CsethCRM
  • CsethCRM
  • 2013年12月25日 12:56
  • 3387

SQL Server 存储过程详解

一. 什么是存储过程系统存储过程是系统创建的存储过程,目的在于能够方便的从系统表中查询信息或完成与更新数据库表相关的管理任务或其他的系统管理任务。系统存储过程主要存储在master数据库中,以“sp”...
  • younghaiqing
  • younghaiqing
  • 2017年03月17日 11:38
  • 1414

oracle 动态SQL在存储过程中的使用

1、      静态SQL和动态SQLOracle编译PL/SQL程序块分为两个种(其它SQL代码块包括存储过程也是如此):其一为前期联编(early binding),即SQL语句在程序编译期间就已...
  • mchdba
  • mchdba
  • 2016年07月24日 01:03
  • 3391

Oracle sql语句执行过程图文分析

这个可以算是学习笔记吧, 是参照甲骨论老相老师的视频做的:http://www.jiagulun.com/thread-2674-1-1.html1.数据库文件Oracle 数据库文件大概可分为3种,...
  • nvd11
  • nvd11
  • 2013年04月02日 00:56
  • 1250

关于Oracle与SQL Server中数据迁移的办法

最近遇到一个需求,需要把Oracle中一部分表的数据迁移到SQL Server数据库中。但是这些表的结构是有些差异的。 方法一,使用SQL Develper的数据导出工具,导出SQL insert...
  • sundacheng1989
  • sundacheng1989
  • 2014年05月23日 09:50
  • 3139

SQL Server 存储过程

Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。 ...
  • qq61394323
  • qq61394323
  • 2016年04月29日 00:32
  • 502

sql server存储过程 以及几个常用案例

转载自http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html SQL Server 存储过程 Transact-S...
  • yuliangliang092
  • yuliangliang092
  • 2016年04月23日 10:41
  • 634

跟踪oracle中sql语句执行过程及相关知识拓展

select * from v$sqlarea;         可以跟踪sql语句的执行过程,如果想跟踪某个时间点前后的语句,可以通过first_load_time时间进行控制。 select * ...
  • xunzaosiyecao
  • xunzaosiyecao
  • 2014年09月02日 09:39
  • 1685

有了SQLServer的基础,轻松学习Oracle

最近想要了解一下Oracle,就和度娘借了点资料,学习学习。Oracle,我知道也是数据库,至于其他的,我就不清楚了。所以,还是了解一下吧。 其既然也是数据库,那和SQLService应该有所异同...
  • u010785685
  • u010785685
  • 2015年05月31日 23:47
  • 1083

pl/sql developer中用execute调用存储过程弹出‘无效的sql语句’解决方法

转自:http://www.myexception.cn/oracle-management/267605.html——解决方案——————–1、在sql的执行窗口中只能这样调用”call OUT_T...
  • dongzhongyan
  • dongzhongyan
  • 2017年01月06日 10:55
  • 1989
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL Server与Oracle的数据同步方案及解决过程
举报原因:
原因补充:

(最多只允许输入30个字)