ORACLE与SQL之间的数据迁移

oracle|数据

高级数据迁移

       很多时间,要在异构数据库之间进行数据迁移或抽取,如果在SQL中提取ORACLE的数据,可以通过ODBC、OLEDB等多种方式,要从ORACLE提取SQL中的数据,大都是通过透明网关来实现的。

       在异构数据抽取过程中,最好采用SQL92标准的语法编写SQL代码,同时要注意不同数据库之间数据类型的转换关系,如ORACLE的日期类型用DATE、SQL用Datetime等。

 

一 关于ORACLE的透明网关配置

       ORACLE安装时(9i),将TRANSPARENT GATEWAY FOR MSSQL选中,在ORACLE主目录\BIN中,有个tg4msql.exe程序,它是透明网关程序啦,同时在主目录中还有tgrmsql的一个目录,ORACLE_HOME\tg4msql\admin目录中的inittg4msql.ora就是需要进行配置才能在ORACLE中连接SQL。

图2.1 tg4msql

1 如何配置透明网关呢?打开inittg4msql.ora:

#

# HS init parameters

# xzh代表SQL服务名,pubs代表要访问的SQL数据库

#

HS_FDS_CONNECT_INFO="SERVER=xzh;DATABASE=pubs"

HS_FDS_TRACE_LEVEL=OFF

HS_FDS_RECOVERY_ACCOUNT=RECOVER

HS_FDS_RECOVERY_PWD=RECOVER

2 监听的配置oracle_home\network\admin\Listiner.ora

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS_LIST =

        (ADDRESS = (PROTOCOL = TCP)(HOST = xzh)(PORT = 1521))

      )

      (ADDRESS_LIST =

        (ADDRESS = (PROTOCOL = TCP)(HOST = xzh)(PORT = 1527))

      )

    )

  )

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = xzh.world)

      (ORACLE_HOME = D:\oracle\ora92)

      (SID_NAME = xzh)

    )

    (SID_DESC =

       (GLOBAL_DBNAME = tg4msql)

       (PROGRAM = tg4msql)

       (SID_NAME = tg4msql)

       (ORACLE_HOME = D:\oracle\ora92)

    )

  )

       加亮代码是要在监听文件中新加部分,GLOBAL_DBNAME、SID_NAME可以任意,PROGRM必须指向tg4msql如图2.1所示。

3 本地服务文件的配置oracle_home\network\admin\TnsNames.ora

XZH =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = xzh)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = xzh.world)

    )

  )

 

TG4MSQL =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = xzh)(PORT = 1527))

    )

    (CONNECT_DATA =

      (SID = tg4msql)

    )

    (HS = OK)

  )

       使用SQL的本地服务名为TG4MSQL,可以任意写,SID必须是Listiner.ora中指定的那个SID_NAME,PORT也必须是监听中指定的PORT,主机等都要符合一致。 到此为止,我们把透明网关大致已经配置好啦,如果要访问SQL,还要使用数据库链才方便。

4 在SQL中创建登录帐号xzh口令xzh,使用可以访问PUBS数据库。

CREATE  DATABASE  LINK sql CONNECT TO xzh IDENTIFIED BY xzh

USING ‘TG4MSQL’

这里的USING ‘TG4MSQL’是tnsnames.ora中配置好的本地服务名,sql是我们以后要引用的数据库链名。

SQL>SELECT * FROM sales@sql

如果有数据返回,表示我们访问SQL数据库的通道已经建成,请大胆使用吧,但对远程异构数据库不充许进行DDL操作。

SQL>CREATE TABLE all_users@tg4msql FRIN all_users;

                      *

ERROR 位于第 1 行:

ORA-02021: 不允许对远程数据库进行 DDL 操作

 

二 SQL访问ORACLE的方法

1 通过行集函数OPENDATASOURCE

       OPENDATASOURCE ( provider_name, init_string )

    SELECT  *

FROM OPENDATASOURCE(

         'MSDAORA',

         'Data Source=xzh.oracle;User ID=POS;Password=POS')..POS.A0325

       MSDAORA是OLEDB FOR ORACLE的驱动,初始化字符串指定本地服务名、用户名、口令。然后引用表中数据时要以服务器..用户名.表名。注意一定是四部分组成,用户名与表名一定要大写。

       SELECT * INTO PUBS.DBO.A0325 FROM

OPENDATASOURCE(

         'MSDAORA',

         'Data Source=xzh.oracle;User ID=POS;Password=POS' )..POS.A0325

     --将ORACLE中POS模式的A0325导入SQL的PUBS数据库。

 2 通过SQL的链接服务器引用ORACLE的数据

   --查看已经存在的链接服务器

   SELECT*FROM SYSSERVERS

   --添加链接服务器到SQL

   EXEC SP_ADDLINKEDSERVER

   @server = 'ORCL',                    --ORCL是SQL中链接服务器名称

   @srvproduct = 'Oracle',        --Oracle        固定的            

   @provider = 'MSDAORA',             --MSDAORA   固定的

   @datasrc = 'xzh.oracle'                 --DataSrc      本地服务名

  

   EXEC SP_DROPSERVER ‘ORCL’       --删除链接服务器

  

       在这里声明一下,如果现在就访问ORACLE肯定不能,因为没有提供登录ORACLE的用户名/口令

       EXEC SP_ADDLINKEDSRVLOGIN 'ORCL', false, 'sa', 'POS', 'POS'

Sa是SQL本地登录帐号,POS/POS是ORACLE的登录帐号,但这句话对我们要达到的目的没有帮助。

SELECT * FROM ORCL..POS.A0325

还是四部分组成,注意事项同上,为什么不行呢,本人一直在寻找解决办法,最后发现通过SQL语句没法解决,只有打开SQL的企业管理器。

图2.2 配置ORACLE的远程帐号

图2.3设置远程登录帐号

SELECT * FROM ORCL..POS.A0325   --这次终于OK。

SELECT * FROM OPENQUERY(ORCL, 'SELECT * FROM POS.A0325')

3 使用SQL的OPENROWSET函数

SELECT a.*

FROM OPENROWSET('MSDAORA',

   'xzh.oracle';'POS';'POS', POS.A0325) AS a ORDER BY a.ID

 

有些地方要用别名才能引用,请大家注意。

 

4使用ODBC的方式

SELECT A.*

FROM OPENROWSET('MSDASQL','ORCL_ODBC';'POS';'POS',

   POS.A0325) AS  A

ORDER BY A.ID

 

ORCL_ODBC是ORACLE的ODBC数据源,创建ODBC不用我说吧,以上所有代码在SQL QUERY ANALYZE 中通过。

 

三 总结

       关于SQL访问ORACLE有四种方式,其中通过ODBC与链接服务器的方式做起来难度较大,对手新手会麻烦一些,使用OLE DB FOR ORACL驱动时,有OPENDATASOURCE与OPENROWSET函数可以使用,都很方便,笔记喜欢使用后者,交待一下,在数据存取方面,这四种方面效率相当。

 

时间: 2024-09-20 18:27:05

ORACLE与SQL之间的数据迁移的相关文章

使用IBM Data Movement Tool从SQL Server/Oracle到DB2的表数据迁移

SQL Server,Oracle 及 DB2 都是目前市场上很多应用程序所使用的关系型数据库,随着应用程序功能的日趋强大,应用程序的版本升级和重新安装都将要求保留原有数据.这样不同类型数据库之间的迁移成了现在应用程序功能中数据迁移部分的重点.目前市场上出现了一些数据库迁移工具(比如:IBM Data Movement Tool).互联网上针对这些工具的介绍大部分都是基于数据对象的整体迁移,也就是在数据结构迁移的基础上进行数据迁移.但是有些应用程序并不需要数据结构的迁移,而是仅仅需要表数据的迁移

oracle和sql server的数据比较

问题描述 oracle和sql server的数据比较 oracle和sql server分别有同样的一堆表,来源一样,但是由于导入导出的时候可能会出错,想设计一个程序比较两个数据库中的那些表的大小,就是想比较两个数据库中具有相同表名的表的行数是否相等,不相等的最好能输出是在oracle的数据量比较多还是sqlserver里面的数据量比较多,并输出成一个文档,最好是excel或者是txt,急,求大神!!!额,不限工具,不过最好用R语言.python.C语言.MATLAB等以便我装逼的语言,万分感

net里面MYSQL和SQL之间的数据互导的问题

问题描述 net里面MYSQL和SQL之间的数据互导的问题,如何把MYSQL的数据写入SQL里面 解决方案 解决方案二:方法1用SQL语句直接导方法2用存储过程dao方法3用C#程序读出->处理-->导入

oracle 分页sql 分段查数据和分段求和 sql语句 和java代码

自己搞报表,数据量比较海的时候就不能一次性查询出来,要分段才可以,我们采用rownum伪列进行查询,伪列有个特点只能从1开始,想实现 x > 10 and x <20不能按照常规的那种一条sql搞定,必须要双层嵌套才可以的,这个算是个经验吧,同理,求和sum(某列)的时候,如果想查找从第100行到第200行的数据某列之和的时候,你也要嵌套一下,between and 是不行的... 1.最佳oracle分页sql 1

Oracle 10g 到11g的数据迁移 导入导出 顺序步骤 expdp/impdp

原库版本:Oracle 10.2.0.4.0 目标库版本:Oracle 11.2.0.1.0 使用expdp导出原库数据: expdp system/xxxxxx schemas=test1201 directory=easbak dumpfile=test1201.dmp logfile=zytest1201.log; impdp前准备: 1:确保目标数据库和原库字符集一致 2:创建好所需表空间,可以在原库里查询test1201这个用户使用了哪些表空间查询语句如下: select distin

Oracle中sql loader的基本概念

1.sql loader的概念 将外部数据(比如文本型)数据导入oracle database.(用于数据导入.不同类型数据库数据迁移) 2.sqlloader 导入数据原理:在段(segment 表)insert 记录 1)normal :将记录插入到segment的HWM(高水位线)以下的块,要首先访问bitmap ,来确定那些block 有free space 2)direct: 将记录插入到segment的HWM(高水位线)以上的从未使用过的块,加快插入速度 3.sql loader 帮

《卸甲笔记》-PostgreSQL和Oracle的SQL差异分析之四:特殊字符和符号

PostgreSQL是世界上功能最强大的开源数据库,在国内得到了越来越多机构和开发者的青睐和应用.随着PostgreSQL的应用越来越广泛,Oracle向PostgreSQL数据库的数据迁移需求也越来越多.数据库之间数据迁移的时候,首先是迁移数据,然后就是SQL.存储过程.序列等程序中不同的数据库中数据的使用方式的转换.下面根据自己的理解和测试,写了一些SQL以及数据库对象转换方面的文章,不足之处,尚请多多指教. 空字符串( '' ) Oracle中,空字符串( '' )很多时候是和null同样

《卸甲笔记》-PostgreSQL和Oracle的SQL差异分析之二:序列的使用

PostgreSQL是世界上功能最强大的开源数据库,在国内得到了越来越多机构和开发者的青睐和应用.随着PostgreSQL的应用越来越广泛,Oracle向PostgreSQL数据库的数据迁移需求也越来越多.数据库之间数据迁移的时候,首先是迁移数据,然后就是SQL.存储过程.序列等程序中不同的数据库中数据的使用方式的转换.下面根据自己的理解和测试,写了一些SQL以及数据库对象转换方面的文章,不足之处,尚请多多指教. 序列 序列是一种数据库对象.可以供多个用户同时使用,得到不重复的.递增的数字值.O

《卸甲笔记》-PostgreSQL和Oracle的SQL差异分析之三:rownum和聚合函数

PostgreSQL是世界上功能最强大的开源数据库,在国内得到了越来越多机构和开发者的青睐和应用.随着PostgreSQL的应用越来越广泛,Oracle向PostgreSQL数据库的数据迁移需求也越来越多.数据库之间数据迁移的时候,首先是迁移数据,然后就是SQL.存储过程.序列等程序中不同的数据库中数据的使用方式的转换.下面根据自己的理解和测试,写了一些SQL以及数据库对象转换方面的文章,不足之处,尚请多多指教. rownum rownum是Oracle内部的一个伪列,用来表示数据在结果集中的行