欢迎来到天天文库
浏览记录
ID:34758617
大小:54.91 KB
页数:8页
时间:2019-03-10
《如何通过linkedserver对远程oracle进行数据操作》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、如何通过linkedserver对远程Oracle进行数据操作 1. OpenqueryOpenquery是使用linkedserver中非常推荐使用的函数。通常情况下,如果我们用四段式的名称访问远程的oracletable,比如:Select*fromlinkedserver.oracledb.user.tablewhereid=n由于SQLServer没有办法获得Oracle端的统计信息,即使在ID字段上有index,以上的语句还是没有办法使用oracle端的index,默认的行为就是把所有的数据传送给SQLServer然后在SQLServer
2、端做过滤. 如果我们使用OpenQuery进行insert、update和delete操作,我们可以手工的决定哪个部分的语句直接传递给oracle执行。具体用法举例为: DELETEfromOPENQUERY(oracle92,'SELECT*FROMTESTWHEREID=1')INSERTOPENQUERY(ORACLE92,'SELECT*FROMTEST')VALUES(2,'CC')UPDATEOPENQUERY(ORACLE92,'SELECT*FROMTESTWHEREID=1')SETNAME='CCC' 同时,Openquery
3、可以跳过元数据的类型校验,因此是linkedserver语句的访问性能提高。有时在相互兼容性不够好的两种数据库之间,比如SQLServer和DB2之间,直接用四段式的方式访问是没有办法通过元数据校验并且返回结果集的,但是当我们改用openquery函数的时候,就可以成功的访问远程数据了。 1.如何通过linkedserver调用远程oracle的存储过程。Linkedserver是不支持直接调用非SQLServer的远程数据库的带参数的存储过程的。下面列出了三种方法,这里只有方法2在32位及64位的SQLServer都可用: ***方法1*** 可
4、以使用msdaora调用一个没有参数的Oracle存储过程。使用oraOLEDB.oracle,会引发错误7357,这意味着在64位oraOLEDB.oracle接口上会执行失败。(64bit上没有msdaora)错误信息:Msg7357,Level16,State2,Line1Cannotprocesstheobject"{CALLSCOTT.USP_WCARROLL_PROC({resultset25,OUTPUT})}".TheOLEDBprovider"OraOLEDB.Oracle"forlinkedserver"ORACLE92"ind
5、icatesthateithertheobjecthasnocolumnsorthecurrentuserdoesnothavepermissionsonthatobject./*创建Oracle对象的SQLPlus代码*/createorreplaceprocedureSCOTT.USP_WCARROLL_PROC(OUTPUTOUTdbms_output.chararr)isbeginOUTPUT(1):='One';OUTPUT(2):='Two';OUTPUT(3):='Three';end;/ select*fromopenquery(O
6、RACLE92,'{CALLSCOTT.USP_WCARROLL_PROC({resultset25,OUTPUT})}'); ***方法2***向Oracle表中插入记录,且该操作触发一个会调用存储过程的触发器可以在Oracle中创建一个表,并在上面放置一个由insert操作触发的触发器;在触发器中,会调用Oracle存储过程。如果你的Oracle技术比我好,你的触发器应当能够得到被插入的记录数据并把它们传递到Oracle存储过程作为参数。为了返回数据,可以利用存储过程更新Oracle表中的记录,然后重新查询记录,以此从SQLServer中得到返
7、回参数。这种方法在msdaora和oraOLEDB.oracle上都适用。所以这个方法将适用于Oracle64位的OLEDB接口。 /*创建Oracle对象的SQLPlus代码*/createtableSCOTT.TBL_WCARROLL(idint,mydatevarchar2(100));/ createtableSCOTT.TBL_WCARROLL_CALLPROC(idint,param1int,param1varchar2(100));/ createorreplaceprocedureSCOTT.USP_WCARROLLasbegini
8、nsertintoSCOTT.TBL_WCARROLLvalues(99,'Success')end;/ createor
此文档下载收益归作者所有