【转】Sqlserver通过链接服务器访问Oracle的解决办法
一、创建sqlserver链接服务(sqlserver链接oracle)
首先sqlserver 链接oracle可以通过两个访问接口:
“MSDAORA” 和“OraOLEDB.Oracle”
1、“MSDAORA”访问接口是由Microsoft OLE DB Provider for Oracle提供的,这里建议不使用此接口进行链接。通过该访问接口建立的链接服务器在进行查询oracle表(带数据类型CLOB、BLOB字段)时会报这个错误
“链接服务器""的 OLE DB 访问接口 "MSDAORA" 返回了消息 "发生了一个 Oracle 错误,但无法从 Oracle 中检索错误信息。"。
链接服务器""的 OLE DB 访问接口 "MSDAORA" 返回了消息 "数据类型不被支持。"。
消息
7321,级别 16,状态 2,第 1 行
准备对链接服务器 "" 的 OLE DB 访问接口 "MSDAORA" 执行查询"select * from
SYS_MESSAGE"时出错。”
链接服务器
"LINK2ORACLE" 的 OLE DB 访问接口 "MSDAORA" 为列提供的元数据不一致。对象
""CMCC"."OS2_GIS_CELL"" 的列 "ISOPENED" (编译时序号为 20)在编译时有 130 的 "DBTYPE",但在运行时有错。
2、“OraOLEDB.Oracle” 访问接口是由oracle 的Oracle Probider for OLE DB 驱动提供的。它解决了两个数据库类型不一致的的问题。而且如果需要使用分布式事务,必须使用它来创建链接服务器。后文会有详细介绍。
在创建之前,在SQLSERVER中,链接服务器->访问接口->OraOLEDB.Oracle->右键属性,选中 "Allow
inprocess" (中文为:允许进程内)
这一步是使我们选择的OraOLEDB.Oracle接口打开执行操作。如未设置会报如下错误:
“无法初始化链接服务器 "null" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 的数据源对象"
使用Oracle
Probider for OLE DB 驱动创建sqlserver链接服务器的代码:
--建立数据库链接服务器
EXEC sp_addlinkedserver
@server =N'OraclePolice', --要创建的链接服务器别名
@srvproduct=N'Oracle', --产品名称
@provider=N'OraOLEDB.Oracle', --OLE DB 驱动名称
@datasrc=N'ORCL' --数据源oracle"ora10g"network"admin"tnsnames.ora查看 EXEC sp_addlinkedsrvlogin
'OraclePolice', --已建立的链接服务器名
'false', -- 固定 */
NULL, --为每个登陆SQL SERVER的用户使用此链接服务器,则写用户名*/
'TESTDB', --帐号(oracle)
'TESTDB123' --密码 exec sp_serveroption 'OraclePolice','rpc out','true'
exec sp_serveroption 'OraclePolice','rpc','true'
--这两个是打开rpc,rpc out的,默认为False,打开后可以支持远程更改分布式事务。(如有分布式事务操作必须要设置)
这样我们就建好了链接服务器,已经可以通过它对oracle数据库进行查询,这里有两种查询方式。
1、SELECT * FROM OraclePolice..TESTDB.TABLE_TEST
(链接服务器别名..Oracle名.oracle表,注意使用大写)
这种方式可以进行操作,优点是使用简单,一目了然,而缺点是性能太差,查询大数据量表很慢。效率太差。
2、SELECT * FROM openquery(OraclePolice,'SELECT * FROM TABLE_TEST')
经试验,这种查询方式速度几乎和在Oralce中一样快。并且我们可以将openquery() 当做表来用。例如
insert into openquery(OraclePolice,'SELECT * FROM TABLE_TEST')
values();--向oracle数据表插入数据
SELECT * FROM openquery(OraclePolice,'SELECT * FROM TABLE_TEST')
where TEST_NAME='' (TEST_NAME为TABLE_TEST表中的字段)
故推荐这种查询方式。
二、通过sqlserver链接服务器调用oracle 存储过程
在oracle里数据库里写了一个测试存储过程,需要一个传入参数和传出参数。
下面是创建和调用这个存储过程的代码:
-- oracle 中创建存储过程
create or replace procedure A_TEST_NQ
(
namecode varchar2,
namevalue out varchar2
)
is
c varchar2(200);
begin
c:='';
select NAME_VALUE into c FROM ALINK_SERVER_TEST WHERE NAME_CODE=namecode;
namevalue:=c;
end; -- ----------------------------------------------
-- 邪恶的分割线
-- ---------------------------------------------- -- sqlserver 中调用存储过程
declare @namecode varchar(200)-- 传入参数
declare @namevalue varchar(5000)-- 传出参数 set @namecode=''
-- 调用存储过程
EXEC('begin A_TEST_PRC(?,?);end;',@namecode,@namevalue output) at OraclePolice
这里要注意传出参数,一定要加上Output,不然会报错。
“链接服务器"OraclePolice"的 OLE DB 访问接口 "OraOLEDB.Oracle" 返回了消息 "ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小
ORA-06512: 在 "SACON.A_TEST_NQ", line 11
ORA-06512: 在 line 1"。
消息
7215,级别 17,状态 1,第 6 行
无法在远程服务器 'OraclePolice' 上执行语句。”
三、通过sqlserver链接服务器实现分布式事务
许许多多的同行就是在这一步中躺下的,因为这一步配置繁琐,同时和sqlserver、oracle数据库版本,甚至是操作系统版本等都有关,驱除睡意,和我一步步来进行配置吧。
1、首先必须安装好
Oracle Services For Microsoft Transaction Server
(版本与你的oracle版本一致)
它是ODAC中的一部分,因为oracle本身是不支持分布式事务的,通过这个驱动开放与微软的事务服务。 我想绝大多数人配置好MSDTC并解析好名称后仍会报“无法启动分布式服务”就是因为这个驱动没装。
消息
7391,级别 16,状态 2,第 5 行
无法执行该操作,因为链接服务器 "oracletest" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 无法启动分布式事务。
2、必须用Oracle Probider for OLE DB 驱动提供的OraOLEDB.Oracle访问接口来创建链接服务。(这个可能是因为microsoft提供的访问接口并不存在oracle事务机制,所以只能通过oracle提供的访问接口)
3、MSDTC设置。
打开"管理工具--组件服务",依次打开"组件服务--计算机",在"我的电脑"上点击右键。在MSDTC选项卡中,点击"安全配置"按钮,在安全配置窗口中做如下设置:
-->选中"网络DTC访问";
-->在客户端管理中选中"允许远程客户端""允许远程管理";
-->在事务管理通讯中选"允许入站""允许出站""不要求进行验证";
-->保证DTC登陆账户为:NT Authority\NetworkService ;
4、双方启动MSDTC服务
MSDTC服务提供分布式事务服务,如果要在数据库中使用分布式事务,必须
在参与的双方服务器启动MSDTC(Distributed Transaction Coordinator)服务。
5、打开双方135端口
MSDTC服务依赖于RPC(Remote Procedure Call (RPC))服务,RPC使用135端口,保证RPC服务启动,如果服务器有防火墙,保证135端口不被防火墙挡住。
6、在事务开始前加入set xact_abort ON语句
对于大多数 OLE DB 提供程序(包括 SQL Server),必须将隐式或显示事务中的数据修改语句中的 XACT_ABORT
设置为 ON。唯一不需要该选项的情况是在提供程序支持嵌套事务时。
7、服务器名解析
在创建链接服务器时@server或者@datasrc设置为sql server服务器名时,需要做名称解析,就是把服务器名解析为ip地址。
在"C:\WINDOWS\system32\drivers\etc\hosts"文件中增加一条记录:
xxx.xxx.xxx.xxx 服务器名
8、远程服务器上的名称解析
分布式事务的参与服务器是需要相互访问的,发起查询的服务器要根据机
器名或ip查找远程服务器的,同样远程服务器也要查找发起服务器,远程服务器通过发起服务器的机器名查找服务器,所以要保证远程服务器能够通过发起服务器的机器名访问到发起服务器。一般的,两个服务器在同一网段机器名能就行很好的解析,但是也不保证都能很好的解析,所以比较保险的做法是:
在远程服务器的在"C:\WINDOWS\system32\drivers\etc\hosts"文件中增加一条记录:
xxx.xxx.xxx.xxx 发起服务器名
通过以上的一些列操作应该差不多了,这期间的操作你会抓狂,时而崩溃,时而暴走,笔者唯一的建议就是:将试验、探索坚持到底,因为笔者已经证实SQLSERVER通过链接服务器到oracle能够使用分布式事务。
-- 分布式事务测试
set xact_abort ON
begin tran
insert into openquery(OraclePolice,'SELECT * FROM ALINK_SERVER_TEST ') values('','TESTtest',''); if @@ERROR <>0
rollback tran;
else
commit TRAN;
-- 语句执行成功
【转】Sqlserver通过链接服务器访问Oracle的解决办法的更多相关文章
- Sqlserver通过链接服务器访问Oracle的解决办法
转自http://blog.sina.com.cn/s/blog_614b6f210100t80r.html 一.创建sqlserver链接服务(sqlserver链接oracle) 首先sqlse ...
- Sqlserver通过链接服务器访问Oracle的那些事儿
前言: 1.不经历风雨,怎能见彩虹. 2.充分利用BaiDu.google等搜索引擎查找资料并整合分析! 3.世上无难事只怕有心人! 本文由来:笔者在研究SQLSERVER链接服务器到oracle并使 ...
- 【转】Sqlserver通过链接服务器访问Oracle的那些事儿!
原文:http://blog.sina.com.cn/s/blog_614b6f210100t80r.html 前言:1.不经历风雨,怎能见彩虹.2.充分利用BaiDu.google等搜索引擎查找资料 ...
- Sqlserver通过链接服务器访问Oracle
工作中遇到的情况,win 7 64位操作系统的就安装64位的oracle 客户端,然后重启sql service服务后再创建sql 链接服务器.关于如何创建链接服务器请查看下面的大神的链接: http ...
- SQLServer通过链接服务器调用Oracle 存储过程
语法: declare @输出参数 数据类型; exec(' exec 存储过程(?, ?)', 输入参数, @输出参数 out) at 链接服务器名 参考文章: SQL2008 链接Oracle 调 ...
- sql server中使用链接服务器访问oracle数据库
一. 安装配置oracle客户端 要访问orcale数据,必须在访问的客户端机器上安装oracle客户端. Orcale有两种形式的客户端: l 完整的客户端 包括访问服务器端数据库 ...
- SQLserver通过链接服务器连接oracle
在SQLserver中一直使用的是DTS抽取数据,但是DTS微软只支持到2008,到了2012后就没有这个工具了,现在需要在SQLserver跟Oracle中间建立一个通道,借助这个通道,将Oracl ...
- SQLServer通过链接服务器远程删除数据性能问题解决
原文:SQLServer通过链接服务器远程删除数据性能问题解决 在上一遍文章中介绍了SQLServer通过链接服务器访问Oracle性能问题的解决方法,本文介绍链接服务器下远程删除SQLServer数 ...
- sql server 数据库创建链接服务器访问另外一个sql server 数据库
继上篇在sql server中创建链接服务器访问oracle数据库:http://www.cnblogs.com/527289276qq/p/4770379.html 本文介绍在sql server中 ...
随机推荐
- Python开发 第01课 Python 简介
一.Python 介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...
- JDK原子类操作
JDK原子类操作及原理 在JDK5之后,JDK提供了对变量的原子类操作, java.util.concurrent.atomic里都是原子类 原子类的分类 原子更新基本类型 原子更新数组 原子更新抽象 ...
- 单线程单元(STA)线程都应使用泵式等待基元
CLR 无法从 COM 上下文 0x20ad98 转换为 COM 上下文 0x20af08,这种状态已持续 60 秒.拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows ...
- 重新安装Magento CE 2.1.0
删除 var/cache 文件夹 删除 var/generation文件夹 删除 app/etc/config.php 删除 app/etc/env.php 如果您觉得阅读本文对您有帮助,欢迎转载本文 ...
- ACCESS中通过一个字段补齐更新另一个字段
[干货从下面红字开始] 搞了好久的一个问题终于有结果…… 根据学生进出馆的次数和学生报名人数来分配自习间 学生报名是通过工号(学号)来报名的: 而门禁系统统计出来的数据有绝一大部分仅有 卡号没有 工号 ...
- 《超实用的HTML代码段》阅读笔记1——HTML5自动聚焦
在页面加载完成后自动将输入焦点定位到需要的元素,用户就可以直接在改元素中进行输入而不需要手动选择它. 通过autofocus的属性就可以指定这种自动聚焦的功能,示例代码如下: <form nam ...
- arcgis jsapi接口入门系列(6):样式
symbol: function () { //线样式 //样式详情请看官方文档 let style = { //线颜色,支持多种格式: //CSS color string:例如"dodg ...
- TitleBar(标题栏)的使用
github地址:https://github.com/buhuiming/BHMAndroid 使用compile 'com.bhm.sdk.bhmlibrary:BHMLibrary:1.1.2' ...
- 在Eclipse上运行Spark(Standalone,Yarn-Client)
欢迎转载,且请注明出处,在文章页面明显位置给出原文连接. 原文链接:http://www.cnblogs.com/zdfjf/p/5175566.html 我们知道有eclipse的Hadoop插件, ...
- myeclipse报错MA
以下问题萌新问了我很多次了,无奈写个随笔.之后问的我都在这个随笔里补充. 断电/自动关机导致的问题: Could not open the editor: the file does not exis ...