Sql-Server

從 SQL Server 連接到 Oracle

  • April 20, 2018

我們正在將應用程序從 Oracle 遷移到 SQL Server。供應商負責大部分遷移工作,但有一個是內部開發的,我遇到了麻煩。

Oracle 上的舊應用程序有一個收集特定數據的過程,然後另一個過程將該數據插入到我們收入系統(不同的 Oracle 伺服器)中的臨時表中。這是一個通過 Oracle 公共數據庫連結的 Oracle 過程。

在 SQL Server 中,我嘗試使用 SQL Server 的連結伺服器重寫此過程。我已經創建了與收入系統的連結伺服器連接,它可以通過該連結進行連接。

從 SQL*Plus,我可以以該使用者的身份發出此語句:

select * from rs.rs_myapp;

我得到了結果。(rs 是收入系統使用者,而不是我連接的使用者。rs_MyApp 表是我們數據在他們系統中的臨時表。)

但如果我嘗試在 SQL Server 中執行此操作:

select * from [rstest-Link]..rs.rs_myapp

我收到這條消息:

消息 7314,級別 16,狀態 1,第 50 行連結伺服器“rstest-Link”的 OLE DB 提供程序“OraOLEDB.Oracle”不包含表“rs”。“rs_myapp”。該表不存在或目前使用者對該表沒有權限。

但是,我可以這樣做:

select * from openquery([rstest-Link], 'select count(*) from rs.rs_myapp')

這會返回結果,表明該連結確實有效。

但是,由於 7314 錯誤,我無法完成 SQL Server 過程。該過程非常基本,其中只有一行程式碼:

Insert Into [rstest-Link]..rs.rs_myapp (ACCOUNT_NUMBER, FROM_DATE, TO_DATE, 
       Data1, Data2, SAMPLE_DATE, Content1, Content2) 
   select ACCOUNT_NUMBER, FROM_DATE, TO_DATE, MyData1, MyData2, SAMPLE_DATE, MyContent1, MyContent2 
   FROM dbo.RS_INTERFACE;

但是如果不解決 7314 錯誤,就無法創建過程。

那麼我該怎麼做呢?我是否必須使用游標並為每一行發出某種程式碼,例如:

INSERT OPENQUERY ([rstest-Link], 'SELECT ... FROM ...')  
VALUES ('...'); 

Oracle 使用區分大小寫的目錄,並通過在 DDL 和 DML 中將未加引號的標識符靜默轉換為全部大寫來隱藏這個醜陋的事實。

您的表的名稱實際上是 RS.RS_MYAPP,並且 SQL Server 可能會將標識符作為“rs”.“rs_myapp”發送給 Oracle,這將在 Oracle 上失敗。

所以試試

選擇 * 從

$$ rstest-Link $$..RS.RS_MYAPP

首先:我將嘗試自己回答問題:當您直接引用 ORACLE 表時,[LinkedServerName]..[Schema].[Table] 您使用的是這種方法嗎?

如果是這樣,請確保通過連結伺服器登錄的使用者在 ORACLE 端設置為使用 RPC Out。(通過連結伺服器設置)

^^編輯:忽略以上。大衛的回答很到位。

現在有一些想法:

我已經通過連結伺服器使用 SQL Server –> ORACLE 幾年了,我可以肯定地說,為了純粹的易用性和穩定性,在 ORACLE SQL / PL/SQL 中寫出查詢並使用 OPENQUERY( ) 對我來說比使用連結伺服器的表和用 T-SQL 編寫查詢要好得多。

為什麼?

  1. 好吧,當你用 ORACLE SQL 編寫它並通過它傳遞它時OPENQUERY,是 ORACLE 引擎在做繁重的工作,而 SQL Server 不必通過 Oracle 的優化器來爭取它的方式。SQL Server 只是等待查詢完成並接受結果。

2)您可以在 ORACLE 端優化查詢,完成後在 SQL Server 端使用它。SQL Server 的優化器只是告訴我100% - 遠端查詢並將其保留在那裡。

  1. 如果您不必篩選 T-SQL,則問題(權限、優化等)更容易診斷。

4)當結果返回時,您仍然可以使用 T-SQL 操作結果(在外部 SELECT 語句中。這意味著您可以使用 Oracle 和 T-SQL Native 函式來處理您的查詢 。,,,,TRUNC它們都是可用的。SUBSTR``INSTR``CHARDINDEX

當我第一次開始使用 T-SQL 從 ORACLE 查詢時,我才精通 T-SQL,讓我告訴你,我一學會 PL/SQL,就開始OPENQUERY在 SQL Server 的語句中使用它。職責分離概念也適用於這些。當他們不打架時,他們會更快樂。

引用自:https://dba.stackexchange.com/questions/204428