网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > 数据库技术 > Oracle > PL/SQL > 从ORACLE向SQL SERVER定时迁移实现  

从ORACLE向SQL SERVER定时迁移实现

2004-03-25  作者:BitsCN整理  来源:中国网管联盟  点评 投稿 收藏


  
  一、问题描述
  某事业单位很早以前开发了一套基于Oracle7.03数据库的管理系统,工作在WINDOWS 下,采用C/S工作模式,数据库的字符集为WE8ISO8859P1。由于工作需要,需开发一套在此基础上的查询系统。为保证原系统的安全和完整性,要求查询系统不得直接使用原数据库,影响目前系统的运行。只能通过中间件技术实现查询系统对原数据库的访问,同时由于原系统在使用过程中发现数据存取的速度很慢,要求查询系统使用SQL SERVER 2000数据库进行查询。
  
  二、解决方案分析
  根据用户的需求和原系统的工作模式,可采用的方案主要有以下三种:
  
  1、 利用SQL SERVER 的作业调度功能,定时执行数据迁移,实现数据同步。
  
  DTS(数据转换服务)是微软从SQL SERVER 7.0 开始引入的。DTS的主要目的是在系统之间迁移数据和数据库对象。DTS原来是用作SQL SERVER OLAP服务的ETL工具。后来微软意识到DTS 不仅可以作为OLAP 服务的数据抽取和载入工具,还可以实现异种数据库间的迁移,因此扩充了DTS的功能。在SQL SERVER 2000中提供了简单易用的DTS 设计器。利用DTS设计器可以很方便地解决本文涉及的问题。但是,如果要迁移的对象比较多,利用DTS设计器的工作量就相当大了。因此,提出了第二种解决方案。
网管u家www.bitscn.net

  
  2、 利用DTS 编程实现数据的定时迁移。
  
  该方法原理简单,但需要对 DTS 有一定的了解,性能也比较好。熟悉VB、VC、DELPHI等任一种编程语言,均可以利用SQL Server 提供的 DTS COM接口实现数据的迁移。
  
  DTS 迁移规范保存在一个称为包的实体中,DTS包是基本的DTS组件的容器,这些组件包括连接、任务、转换、工作流,不同的组件完成不同的功能,它们共同构成数据迁移的实现主体。要通过DTS编程实现数据库的迁移,至少需要两个连接对象。其中,一个提供数据,一个接收数据;至少需要一个转换对象,完成数据从源到目的服务器的转换;至少需要两个任务对象,完成迁移之前的目的服务器上的数据表的删除和重建;至少需要三个工作流对象,为迁移工作设计执行的步骤。
  
  为了实现定时执行,程序还要完成对SQL SERVER AGENT 进行编程实现迁移作业的提交和调度。由于SQL SERVER 的作业调度是通过 SQL SERVER AGENT 来管理的,因此需要在启动SQL SERVER 时同时启动SQL SERVER AGENT。
  
  3、 采用中间件技术
  
  前面两种方案都是利用DTS,离不开SQL Server 的DTS。利用中间件技术,可以通过实现一服务程序,定时将数据从ORACLE服务器取出然后转换成SQL SERVER 数据库的数据格式,传入SQL SERVER。其工作原理如下图:
网管u家bitscn.net

  
  
  
  该技术可以通过通过ODBC 或OLE DB技术编程实现数据的定时获取和转换传出。对于编程的工作量较大,原因在于ORACLE 和SQL SERVER的数据类型的不一致必须通过类型转换实现数据的一致。同时效率也比较低。由于作为一种服务程序长驻内存,对程序的质量要求至少不得出现内存泄露,否则,可能使服务器瘫痪。不过这种方案的好处在于可以脱离SQL SERVER ,维护的工作量相对要轻一些。
  
  比较上述的三种方案,从实现的难度上比较,第一种最低,最后一种最高。从效率上比较,最后一种最低,第一种与第二种最高。从可维护性来比较,第一种最低,最后一种最高。
  
  综合三种方案,笔者认为第二中方案较好。发布到目标系统上,只需在现场运行一次数据迁移的任务安装程序,就能实现SQL Server 定时从Oracle服务器迁移数据。同时,所有的工作量也只是选择要迁移的数据表。该工作,如果要迁移的表是已知的,甚至可以从文件中直接读入,就能实现任务的安装。
  
  下面介绍采用第二种方案用VB编写在SQL SERVER上能定时自动进行数据迁移任务的安装程序的方法。
  
  三、数据迁移的实现

网管u家bitscn.net


  为了能在目标机上顺利实现数据迁移,将DTS包存储到SQL SERVER,在SQL SEVRE AGENT 的作业调度中采用DTSRUN 来加载和执行DTS包。这样,所有的工作只需作一次,就可将整个数据迁移的DTS包和SQL SERVER的作业发布到目标机上。
  
  (一)算法设计
  
  程序的流程图如下:
  
   
  
  (二)关键技术说明
  
  要实现数据的迁移,必须考虑两个问题,第一、数据的迁移要求目标系统上的数据与ORACLE 数据库中的数据要一致,因此,目标数据库中的相应表必须在迁移之前被删除。所以迁移任务的第一个是对相应表执行删除的SQL 任务;第二、由于目标表被删除,迁移的数据失去寄托,因此迁移任务的第二步必须在目标系统上重建相应的表。在建表时,由于ORACLE 数据库的数据类型与SQL SERVER 不一致,因此必须进行类型转换。它们之间的对应关系和转换要求如下表:
  Oracle Microsoft SQL Server
  
  CHAR
  
  建议使用CHAR 类型。这种类型的数据由于采用固定长度存储,其存取速度在某些情况下要比使用 VARCHAR 类型快。
  
  VARCHAR2 和 LONG
  
  VARCHAR 或 TEXT。 (如果在ORACLE 中的长度超过8000字节应在SQL SERVER 中使用 TEXT 类型,否则使用 VARCHAR 数据类型。) 网管联盟bitsCN@com
  
  RAW 和 LONG RAW
  
  VARBINARY 或 IMAGE. (如果在ORACLE 中的长度超过8000字节应在SQL SERVER 中使用 IMAGE 类型,否则使用 VARBINARY 数据类型。)
  
  NUMBER
  
  如果整型在0 至255 之间,用TINYINT。
  如果整型在-32768 至32767之间,用 SMALLINT。
  如果整型在-2,147,483,648 至2,147,483,647 之间,用 INT。
  如果需要浮点数,使用 NUMERIC (ORACLE 数据列中有PRECISION 和 SCALE值).
  注意:
  
  1、尽量不要使用 FLOAT 或 REAL ,这是因为在转换时数据有四舍五入。
  
  2、如果自己的把握性不大,最好使用 NUMERIC,该类型与ORACLE的NUMBER 类型最接近。
  
  DATE 和 DATETIME
  
  (三)程序设计
  
  1、 界面设计,如图所示:
  
  
  
  2、 编码
  
  (1) 在整个程序运行过程中,需要两个全局变量:DTS 包 oPackage 和Oracle 服务器连接 oraCon。
  
  当设置好连接参数后,单击“连接Oracle服务器”,将与 ORACLE 服务器连接,并取出所有表。然后填充第一个列表框,并在下面表格中显示相应的数据(如果选中了“显示数据”) 网管u家www.bitscn.net
  
  Private Sub Command1_Click()
  Dim rst As New ADODB.Recordset
  With oraCon
  .Provider = "OraOLEDB.Oracle.1"
  .Properties("User ID") = Text2(0).Text
  .Properties("Password") = Text3(0).Text
  .Properties("Data Source") = Text1(0).Text
  .Properties("Persist Security Info") = True
  .Open
  End With
  With rst
  .Source = "select * from all_tables where tablespace_name<>'SYSTEM' order by owner,table_name"
  .ActiveConnection = oraCon
  .CursorType = adOpenKeyset
  .LockType = adLockOptimistic
  .Open
  End With
  RefreshGrid rst
  FillTabList rst
  rst.Close
  Command1.Enabled = False
  End Sub
  
  (2) 在第一个列表框中双击数据表列表,将选中的表加入第二个列表,如果“显示数据”被选中,将显示相应表的数据。同时显示表的结构信息。在第二个列表框中双击数据表将选中项移出该列表框。
  
  Private Sub List1_DblClick()
  Dim rst As New ADODB.Recordset
  Dim strSQL As String 中国网管论坛bbs.bitsCN.com
  Dim tmpStr As String
  List2.AddItem (List1.List(List1.ListIndex))
  If Check1.Value = 1 Then
  With rst
  .Source = "select * from " & List1.List(List1.ListIndex)
  .ActiveConnection = oraCon
  .CursorType = adOpenKeyset
  .LockType = adLockOptimistic
  .Open
  End With
  RefreshGrid rst
  rst.Close
  End If
  tmpStr = List1.List(List1.ListIndex)
  strSQL = "SELECT COLUMN_ID, COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE "
  strSQL = strSQL & "FROM SYS.ALL_TAB_COLUMNS WHERE TABLE_NAME="
  strSQL = strSQL & "'" & Mid(tmpStr, InStr(1, tmpStr, ".", vbTextCompare) + 1) & "'"
  strSQL = strSQL & " and OWNER='" & Mid(tmpStr, 1, InStr(1, tmpStr, ".", vbTextCompare) - 1) & "'"
  With rst
  .Source = strSQL
  .ActiveConnection = oraCon
  .CursorType = adOpenKeyset
  .LockType = adLockOptimistic
  .Open
  End With
  rst.MoveFirst
  RefreshPropGrid rst
  rst.Close 网管网www_bitscn_com
  PropGrid.Visible = True
  SQLScriptList.Visible = False
  End Sub
  Private Sub RefreshGrid(rst As ADODB.Recordset)
  Dim fld As ADODB.Field
  On Error Resume Next
  FlxGrid1.Clear
  rst.MoveFirst
  If rst.EOF Then
  Exit Sub
  End If
  With FlxGrid1
  .Redraw = False
  .Clear
  .FixedCols = 0
  .FixedRows = 0
  .Cols = rst.Fields.Count
  rst.MoveLast
  .Rows = rst.RecordCount + 1
  .Row = 0
  .Col =
TAGs迁移   实现   定时   数据   DTS   类型   SQLSERVER   数据库    
 上一篇:Oracle 常用SQL查询列表   下一篇:神秘的 ORACLE DUAL
相关文章列表
从ORACLE向SQL SERVER定时迁移实现 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
1.PL/SQL - 嵌套游标 cursor-PLSQL
2.用一个实例讲解Oracle数据库的PL/SQL语句
3.PL/SQL----触发器-PLSQL
4.mysql存储过程写法—动态参数运用-PLSQL
5.PL/SQL Developer导出分区索引脚本-PLSQL
6.PL/SQL collection— table() 函数-PLSQL
7.SQL Server 2005 中的架构与用户-PLSQL
8.Oracle数据库维护常用SQL语句集合(2)-P
9.Oracle数据库维护常用SQL语句集合(3)-P
10.再议SQL Server临时表和表变量-PLSQL
最新推荐文章:
1.与数据库无关的处理放到数据库以外来实现
2.Oracle 10g第2版新特性之SQL和PL/SQL
3.通过PL/SQL访问Web Services
4.菜鸟学oracle - 用PL/SQL画直方图
5.重新编译PLSQL中无效对象或指定对象
6.Oracle高级技巧
7.深入了解Oracle 10g新的多重集运算符
8.在SQL中删除重复记录(多种方法)
9.Oracle:PL/SQL中怎样使用Array
10.数据库手册:速查Oracle函数列表
网管论坛交流:
·大家来开心一下吧---看了会很开心的东西-
·中国人不可不知道的知识
·@@小鹏◎◎小鹏同志与某位女明星亲密接触
·◎◎小鹏◎◎发现不明生物,居然正在交配
·[图文]^^^版主是什么?????
·泡论坛的女人是好女人
·做个“水性杨花”的女人
·献给mm俱乐部的所有mm
·深圳一集团企业电脑基础应用培训教程
·■■■■十一遊玩照■■■■■