Oracle与SQL Server实现表数据同步
将SQLServer2008中的某些表同步到Oracle数据库中,不同数据库类型之间的数据同步我们可以使用链接服务器和SQLAgent来实现。
实例1:
SQLServer2008有一个表employ_epl是需要同步到一个EHR系统中(Oracle11g),实现数据库的同步步骤如下:
1.在Oracle中建立对应的employ_epl表,需要同步哪些字段我们就建那些字段到Oracle表中。
注意:Oracle的数据类型和SQLServer的数据类型是不一样的,需要进行转换
--查看SQLServer和其他数据库系统的数据类型对应关系
--SQL转Oracle的类型对应
SELECT *FROM msdb.dbo.MSdatatype_mappings --详细得显示了各个数据库系统的类型对应
SELECT *FROM msdb.dbo.sysdatatypemappings
2.建立链接服务器
将Oracle系统作为SQLServer的链接服务器加入到SQLServer中。
http://www.cnblogs.com/Snowfun/p/5284357.html
3.使用SQL语句通过链接服务器将SQLServer数据写入Oracle中
DELETE FROM TESTORACLE..SCOTT.EMPLOY_EPL
insert into TESTORACLE..SCOTT.EMPLOY_EPL
select * from employ_epl --查看Oracle数据库中是否已经有数据了。
select * from TESTORACLE..SCOTT.EMPLOY_EPL
4.建立SQLAgent,将以上同步SQL语句作为执行语句,每天定时同步。
实例2:依靠"作业"定时调度存储过程来操作数据,增,删,改,全在里面,结合触发器,游标来实现,关于作业调度,使用了5秒运行一次来实行"秒级作业",这样基本就算比较快的"同步"
--1.准备一个新表
--SqlServer表EmployLastRec_Sql用于记录employ_epl表的增删改记录
CREATE TABLE [dbo].[EmployLastRec_Sql](
[id] [int] IDENTITY(1,1) NOT NULL,
[modiid] [int] NULL,
[IsExec] [int] NULL,
[epl_employID] [varchar](30) NULL,
[epl_employName] [varchar](30) NULL,
[epl_Sex] [int] NULL,
[epl_data] [datetime] NULL
) --2.用一个视图"封装"了一下链接服务器下的一张表
create view v_ora_employ
as
--TESTORACLE链接服务器名
select * from TESTORACLE..SCOTT.EMPLOY_EPL
--3.SQL2008表employ_epl建立触发器,用表EmployLastRec_Sql记录下操作的标识
--modiid等于1为insert,2为delete,3为update,字段isexec标识该条记录是否已处理,0为未执行的,1为已执行的
create trigger trg_employ_epl_insert on employ_epl for insert
as
insert into EmployLastRec_Sql(modiid,IsExec,epl_employID,epl_employName,epl_Sex)
select '1','0',epl_employID,epl_employName,epl_Sex from inserted create trigger trg_employ_epl_update on employ_epl for update
as
insert into EmployLastRec_Sql(modiid,IsExec,epl_employID,epl_employName,epl_Sex)
select '3','0',epl_employID,epl_employName,epl_Sex from inserted create trigger trg_employ_epl_delete on employ_epl for delete
as
insert into EmployLastRec_Sql(modiid,IsExec,epl_employID,epl_employName,epl_Sex)
select '2','0',epl_employID,epl_employName,epl_Sex from deleted
--4.创建存储过程进行导数到ORACLE
--使用游标逐行提取EmployLastRec_Sql记录,根据modiid判断不同的数据操作,该条记录处理完毕后把isexec字段更新为1.
create proc sp_EmployLastRec_Sql
as --epl_employID,epl_employName,epl_Sex
declare @modiid int
declare @employID varchar(30)
declare @employName varchar(50)
declare @sex int --字段IsExec标识该条记录是否已处理,0为未执行的,1为已执行的
if not exists(select * from EmployLastRec_Sql where IsExec=0)
begin
truncate table EmployLastRec_Sql----不存在未执行的,则清空表
return
end declare cur_sql cursor for
select modiid,epl_employID,epl_employName,epl_Sex
from EmployLastRec_Sql where IsExec=0 order by [id]--IsExec 0为未执行的,1为已执行的 open cur_sql
fetch next from cur_sql into @modiid,@employID,@employName,@sex
while @@fetch_status=0
begin
if (@modiid=1) --插入
begin
----将数据插入到ORACLE表中
insert into v_ora_employ(epl_employID,epl_employName,epl_Sex)values(@employID,@employName,@sex)
end if (@modiid=2) --删除
begin
delete from v_ora_employ where epl_employID=@employID
end if (@modiid=3) --修改
begin
update v_ora_employ set epl_employName=@employName,epl_Sex=@sex,epl_data=getdate()
where epl_employID=@employID
end update EmployLastRec_Sql set IsExec=1 where current of cur_sql fetch next from cur_sql into @modiid,@employID,@employName,@sex
end deallocate cur_sql
--5.调用该存储过程的作业,实现5秒执行一次该存储过程,做到5秒数据同步。
--先建一个一分钟运行一次的作业,然后在"步骤"的脚本中这样写:
DECLARE @dt datetime
SET @dt = DATEADD(minute, -1, GETDATE())
--select @dt
WHILE @dt < GETDATE()
BEGIN
EXEC sp_EmployLastRec_Sql
WAITFOR DELAY '00:00:05' -- 等待5秒, 根据你的需要设置即可
END
Oracle与SQL Server实现表数据同步的更多相关文章
- Oracle与Sql Server复制表结构和数据
1.Oracle create table 新表名 AS SELECT * FROM 源表名 2.Sql Server SELECT * into 新表名 from 源表名 版权声明:笔者:jiank ...
- sql server作业实现数据同步
作业介绍 SQL SERVER的作业是一系列由SQL SERVER代理按顺序执行的指定操作.作业可以执行一系列活动,包括运行Transact-SQL脚本.命令行应用程序.Microsoft Acti ...
- SQL Server 的表数据简单操作(表数据查询)
--表数据查询----数据的基本查询-- --数据简单的查询--select * | 字段名[,字段名2, ...] from 数据表名 [where 条件表达式] 例: use 商品管理数据库 go ...
- SQL Server 的表数据简单操作
--表数据操作----添加表数据----向现有表添加数据--[use 要操作数据表的数据库名称go]insert [into] 数据表 [(字段名1,字段名2,字段名3, ...)] values(值 ...
- sql server复制表数据到另外一个表 的存储过程
) Drop Procedure GenerateData go CREATE PROCEDURE GenerateData @tablename sysname AS begin ) ) ) dec ...
- sql server多表数据批量更新
update wset w.TagCount=x.TagCountfrom (select ItemID,COUNT(*) as TagCount from r where IsValid=1 gro ...
- ogg实现oracle到sql server 2005的同步
一.源端(oracle)配置1.创建同步测试表create table gg_user.t01(name varchar(20) primary key);create table gg_user.t ...
- ORACLE和SQL SERVER的数据同步常用方法
ORACLE和SQL SERVER的数据同步常用方法 1. 自己编程,或者第三方工具2. 在sqlserver中,使用linkedserver,访问oracle,然后编写job进行数据同步3. 在or ...
- Oracle和sql server中复制表结构和表数据的sql语句
在Oracle和sql server中,如何从一个已知的旧表,来复制新生成一个新的表,如果要复制旧表结构和表数据,对应的sql语句该如何写呢?刚好阿堂这两天用到了,就顺便把它收集汇总一下,供朋友们参考 ...
随机推荐
- 10.排序数组中和为给定值的两个数字[Find2NumbersWithGivenSum]
[题目] 输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字.要求时间复杂度是O(n).如果有多对数字的和等于输入的数字,输出任意一对即可. 例如输入数组1 ...
- socketserver模块简介
1. socketserver模块简介 在python的socket编程中,实用socket模块的时候,是不能实现多个连接的,当然如果加入其 它的模块是可以的,例如select模块,在这里见到的介绍下 ...
- Amazon 发送个人文档无回复
Amazon 个人文档问题 注意注意 详情见:[使用您的[发送至Kindle]电子邮箱] 重点提示 在电子邮件主题中输入"Convert"以将您的文档转换为Kindle格式,然后再 ...
- 如何快速上手.net下单元测试工具NUnit?
NUnit基本使用 准备知识: 读此博文需要了解单元测试基本概念及NUnit的的安装. 传送门:单元测试之道(使用NUnit) 1.常见的错误 当学习一个新东西时,先学习错误,是最快的方式. 1.1 ...
- 【MFC】MFC改变对话框中静态文本的字体大小
MFC改变对话框中静态文本的字体大小 2010/08/09 11:30 VC的对话框字体设置对所有控件都有效,你不能单独地改变某个静态文本的字体.对于你的问题,需要首先用CreateFont来建立一个 ...
- 用eclipse来制作并使用可执行的jar文件
我近来用java写了一个股票收益分析的小程序,用于计算我的股票操作所带来的的收益.这里,记录了如何将源代码打包成可执行的命令的一个过程. 1:生成可执行的jar文件 选中工程,选择菜单中的export ...
- python之Beautiful Soup库
1.简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索 ...
- 【1】基于quartz框架和Zookeeper实现集群化定时任务系统
(1)quartz本身可以支持集群化,是基于数据库做协调,现在构想基于zookeeper做协调实现集群化定时系统 流程图如下:
- bzoj 4881 [Lydsy1705月赛]线段游戏
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4881 1.当一块相互交织的线段中有3个或以上两两相交的那种线段时,无解. 这就是最长下降子序 ...
- compoer 全局和单个项目切换源 composer update killed
演示地址: https://blog.csdn.net/hpugym/article/details/72588393 composer update killed https://cloud.ten ...