Sqlserverがリンクサーバを介してOracleにアクセスする解決策


転入先http://blog.sina.com.cn/s/blog_614b6f210100t80r.html
一、sqlserverリンクサービスの作成(sqlserverリンクoracle)
まず、sqlserverリンクoracleでは、2つのアクセスインタフェースを使用できます.
MSDAORAとOraOLEDB.Oracle
1、MSDAORAアクセスインタフェースは、Microsoft OLE DB Provider for Oracleから提供されています.ここでは、このインタフェースをリンクしないことをお勧めします.このアクセスインタフェースによって確立されたリンクサーバは、oracleテーブル(データ型CLOB、BLOBフィールド付き)をクエリーするときにこのエラーを報告します.
MSDAORA「リンクサーバ」のOLE DBアクセスインタフェース「MSDAORA」は、「Oracleエラーが発生しましたが、Oracleからエラー情報を取得できません」というメッセージを返します.リンクサーバ「」のOLE DBアクセスインタフェース「MSDAORA」は、「データ型はサポートされていません」というメッセージを返します.メッセージ7321、レベル16、ステータス2、1行目は、リンクサーバ"のOLE DBアクセスインタフェース"MSDAORA"に対してクエリ"select*from SYS_MESSAGE"を実行する準備中にエラーが発生しました."
リンクサーバ「LINK 2 O RACLE」のOLE DBアクセスインタフェース「MSDAORA」は、カラムに提供されるメタデータが一致しません.対象""CMCC"."OS2_GIS_CELL""の列「ISO PENED」(コンパイル時シーケンス番号20)はコンパイル時に130の「DBTYPE」がありますが、実行時にエラーがあります.
2、「OraOLEDB.Oracle」アクセスインタフェースは、oracleのOracle Probider for OLE DBドライバによって提供されます.2つのデータベース・タイプが一致しないという問題を解決しました.また、分散トランザクションを使用する必要がある場合は、リンク・サーバを作成するために使用する必要があります.後で詳しく紹介します.作成前にSQLSERVERで、リンクサーバ->アクセスインタフェース->OraOLEDB.Oracle->右クリック・プロパティ、「Allow inprocess」(中国語:プロセス内を許可)を選択するには、OraOLEDBを選択します.Oracleインタフェースは、実行アクションを開きます.設定されていない場合は、「リンクサーバnullのOLE DBアクセスインタフェースOraOLEDB.Oracleのデータソースオブジェクトを初期化できません」というエラーが表示されます.
Oracle Probider for OLE DBドライバを使用してsqlserverリンクサーバを作成するコード:
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データベースをクエリーできるリンクサーバが構築されました.ここには2つのクエリー方法があります.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();--OraclePolice,'SELECT*FROM TABLE_TEST')のデータをoracleデータテーブルに挿入します.
where TEST_NAME='(TEST_NAMEはTABLE_TESTテーブルのフィールド)であるため、このクエリ方式が推奨されます.
二、sqlserverリンクサーバを通じてoracleストレージプロセスを呼び出し、oracle内のデータベースにテストストレージプロセスを書き、入力パラメータと出力パラメータが必要である.次に、このストレージ・プロシージャを作成および呼び出すコードを示します.
1: -- 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;
14: 
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を付けなければなりません.そうしないと、エラーが発生します.
out
リンクサーバ「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.提供するOraOLEDBをOracle Probider for OLE DBで駆動しなければならない.Oracleは、リンク・サービスを作成するためにインタフェースにアクセスします.(これはmicrosoftが提供するアクセスインタフェースにoracleトランザクションメカニズムが存在しないため、oracleが提供するアクセスインタフェースしか使用できないためかもしれません)
3、MSDTC設定.「管理ツール-コンポーネントサービス」を開き、「コンポーネントサービス-コンピュータ」を順に開き、「マイコンピュータ」を右クリックします.MSDTCタブで、「セキュリティ構成」ボタンをクリックし、セキュリティ構成ウィンドウで次の設定を行います.-->「ネットワークDTCアクセス」を選択します.-->クライアント管理で「リモートクライアントの許可」「リモート管理の許可」を選択します.-->取引管理通信で「インバウンドの許可」「アウトバウンドの許可」「検証不要」を選択します.-->DTCログインアカウントの保証:NT AuthorityNetworkService;
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:WINDOWSsystem 32driversetchosts」ファイルにレコードを追加します.
   xxx.xxx.xxx.xxxサーバ名
8.リモートサーバ上の名称解析分散トランザクションの参加サーバは相互にアクセスする必要があり、クエリを開始するサーバはマシンに従って
器名またはipがリモートサーバを検索する場合、同様にリモートサーバも発起サーバを検索し、リモートサーバは発起サーバのマシン名でサーバを検索するので、リモートサーバが発起サーバのマシン名で発起サーバにアクセスできることを保証します.一般的に、2つのサーバーは同じネットワークセグメントのマシン名でよく解析できますが、いずれもよく解析できる保証はありません.そのため、比較的保険的な方法は、リモートサーバーの「C:WINDOWSsystem 32driversetchosts」ファイルに記録を追加することです.xxx.xxx.xxx.xxxイニシエータ名
以上のいくつかの列を通じて操作はそれほど悪くないはずです.この間の操作は狂ったり、崩れたり、暴走したりします.筆者の唯一の提案は、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: --       

succ
私は以下のサイトを通じてインスピレーションを得て、原作者に感謝します.http://blog.csdn.net/akuoma/archive/2010/01/29/5269496.aspxhttp://mlj04.blog.163.com/blog/static/5448108220101855248191/http://www.chinaitpower.com/A/2004-06-13/83416.htmlhttp://www.cnblogs.com/huanghai223/archive/2010/12/28/1919073.html