Sqlserver通过链接服务器访问Oracle
本文转自: http://blog.sina.com.cn/s/blog_517cae3c01017n2s.html 一、创建sqlserver链接服务(sqlserver链接oracle) ? “MSDAORA” 和“OraOLEDB.Oracle” 1、“MSDAORA”访问接口是由Microsoft OLE DB Provider forOracle提供的,这里建议不使用此接口进行链接。通过该访问接口建立的链接服务器在进行查询oracle表(带数据类型CLOB、BLOB字段)时会报这个错误
链接服务器 "LINK2ORACLE" 的 OLE DB 访问接口"MSDAORA" 为列提供的元数据不一致。对象 ""CMCC"."OS2_GIS_CELL"" 的列 "ISOPENED"(编译时序号为 20)在编译时有 130 的 "DBTYPE",但在运行时有错。 2、“OraOLEDB.Oracle” 访问接口是由oracle 的Oracle Probiderfor OLE DB驱动提供的。它解决了两个数据库类型不一致的的问题。而且如果需要使用分布式事务,必须使用它来创建链接服务器。后文会有详细介绍。
1: --建立数据库链接服务器
2: EXEC sp_addlinkedserver 3: @server =N'OraclePolice',--要创建的链接服务器别名 4: @srvproduct=N'Oracle',--产品名称 5: @provider=N'OraOLEDB.Oracle',--OLE DB 驱动名称 6: @datasrc=N'ORCL' --数据源oracle"ora10g"network"admin"tnsnames.ora查看 7:? 8: EXEC sp_addlinkedsrvlogin 9: 'OraclePolice',--已建立的链接服务器名 10: 'false',-- 固定 */ 11: NULL,--为每个登陆SQL SERVER的用户使用此链接服务器,则写用户名*/ 12: 'TESTDB',--帐号(oracle) 13: 'TESTDB123' --密码 14:? 15: exec sp_serveroption 'OraclePolice','rpc out','true' 16: exec sp_serveroption 'OraclePolice','rpc','true' 17: --这两个是打开rpc,rpc out的,默认为False,打开后可以支持远程更改分布式事务。(如有分布式事务操作必须要设置)
? 这样我们就建好了链接服务器,已经可以通过它对oracle数据库进行查询,这里有两种查询方式。 (链接服务器别名..Oracle名.oracle表,注意使用大写) 这种方式可以进行操作,优点是使用简单,一目了然,而缺点是性能太差,查询大数据量表很慢。效率太差。 2、SELECT * FROMopenquery(OraclePolice,'SELECT *FROM? values();--向oracle数据表插入数据 where TEST_NAME=''(TEST_NAME为TABLE_TEST表中的字段) 二、通过sqlserver链接服务器调用oracle存储过程 2: create or replace procedure A_TEST_NQ 3: (
4: namecode varchar2,
5: namevalue out varchar2 6: )
7: is 8: c varchar2(200);
9: begin 10: c:=''; 11: select NAME_VALUE into c FROM ALINK_SERVER_TEST WHERE NAME_CODE=namecode; 12: namevalue:=c;
13: end; 15: -- ---------------------------------------------- 16: -- 邪恶的分割线 17: -- ---------------------------------------------- 18:? 19: -- sqlserver 中调用存储过程 20: declare @namecode varchar(200)-- 传入参数 21: declare @namevalue varchar(5000)-- 传出参数 22:? 23: set @namecode='01' 24: -- 调用存储过程 25: EXEC('begin A_TEST_PRC(?,?);end;',@namecode,@namevalue output) at OraclePolice 这里要注意传出参数,一定要加上Output,不然会报错。 “链接服务器"OraclePolice"的 OLE DB 访问接口 "OraOLEDB.Oracle" 返回了消息"ORA-06502: PL/SQL: 数字或值错误 :? 三、通过sqlserver链接服务器实现分布式事务 ? Oracle Services For MicrosoftTransaction Server (版本与你的oracle版本一致)它是ODAC中的一部分,因为oracle本身是不支持分布式事务的,通过这个驱动开放与微软的事务服务。 我想绝大多数人配置好MSDTC并解析好名称后仍会报“无法启动分布式服务”就是因为这个驱动没装。 消息 7391,级别 16,状态 2,第 5 行 ?
在参与的双方服务器启动MSDTC(Distributed TransactionCoordinator)服务。
? ? 在"C:WINDOWSsystem32driverset ?
在远程服务器的在"C:WINDOWSsystem32driverset ? 通过以上的一些列操作应该差不多了,这期间的操作你会抓狂,时而崩溃,时而暴走,笔者唯一的建议就是:将试验、探索坚持到底,因为笔者已经证实SQLSERVER通过链接服务器到oracle能够使用分布式事务。 1: -- 分布式事务测试2: set xact_abort ON 3: begin tran 4:? 5: insert into openquery(OraclePolice,'SELECT * FROM ALINK_SERVER_TEST ') values ('456000','TESTtest',''); 6:? 7: if @@ERROR <>0 8:? 9: rollback tran; 10: else 11:? 12: commit TRAN; 13: -- 语句执行成功
本人通过以下网址获得灵感,感谢原作者。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |