2013-10-07 71 views
5

我有一個SQL Server鏈接服務器設置命中Oracle數據庫。我在SQL Server中有一個使用點符號連接到Oracle表的查詢。我收到來自Oracle的「未找到數據」錯誤。在Oracle方面,我打了一個表(不是視圖),也沒有涉及存儲過程。sql服務器鏈接到oracle的服務器返回沒​​有數據時發現數據存在

首先,當沒有數據時,我應該得到零行而不是錯誤。
其次,在這種情況下實際應該有數據。
三,我只看到PL/SQL代碼中的ORA-01403錯誤;從來沒有在SQL中。

這是完全錯誤消息:
OLE DB提供程序 「OraOLEDB.Oracle」 鏈接服務器 「OM_ORACLE」 返回消息 「ORA-01403:沒有找到數據」。
消息7346,級別16,狀態2,行1 無法從鏈接服務器「OM_ORACLE」的OLE DB提供程序「OraOLEDB.Oracle」獲取行的數據。

以下是一些更多細節,但它可能並不意味着什麼,因爲您沒有我的表格和數據。
這是有問題的查詢:

select * 
    from eopf.Batch b join eopf.BatchFile bf 
       on b.BatchID = bf.BatchID 
      left outer join [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] du 
       on bf.ReferenceID = du.documentUploadID; 




我不明白爲什麼我得到一個「沒有內容」的錯誤。下面的查詢使用相同的Oracle表並且不返回任何數據,但我沒有收到錯誤 - 我只是沒有返回行。

select * from [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] where documentUploadID = -1 



下面返回數據的查詢。我剛從連接中刪除了一個SQL Server表。但是刪除批處理表不會更改從batchFile返回的行(在這兩種情況下都是271行 - batchFile中的所有行都有批處理條目)。它應該仍然將相同的batchFile行連接到相同的Oracle行。

select * 
from eopf.BatchFile bf 
    left outer join [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] du 
     on bf.ReferenceID = du.documentUploadID; 



而這個查詢返回5行。它應該與原始查詢相同。 (我不能使用這個,因爲我需要來自batch和batchFile表的數據)。

 select * 
    from [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] du 
    where du.documentUploadId 
    in 
    (
    select bf.ReferenceID 
    from eopf.Batch b join eopf.BatchFile bf 
       on b.BatchID = bf.BatchID); 

有沒有人遇到過這個錯誤?

回答

1

我有同樣的問題。 解決方案1:將Oracle數據庫中的數據加載到臨時表中,然後加入到臨時表中 - 這裏是a link

從這個帖子a link你可以發現問題可以使用左連接。 我檢查了我的問題,並且改變了查詢它解決了問題。

0

在我的情況下,我有一個複雜的視圖,從鏈接表,3視圖基於鏈接表和本地表。我始終使用內部聯接,並且這個問題表現出來。將連接更改爲左外連接和右外連接(根據需要)可以解決問題。

0

我得到了同樣的問題,避免了「=」操作使用

select * from [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] where documentUploadID < 0 

相反 嘗試解決它。

感謝

0

另一種方法來解決問題是Oracle數據拉回到一個Table Valued Function。這將導致SQL Server出去並從Oracle檢索所有數據並將其放入結果表變量中。對於所有意圖和目的,如果在查詢中使用結果表值函數,則Oracle數據現在對SQL Server是「本地」的。

我相信最初的問題是SQL Server正試圖優化包含遠程Oracle查詢結果的複合查詢的執行。通過使用表值函數來包裝Oracle調用,SQL Server將優化對函數返回的結果表變量的複合查詢,而不是遠程查詢執行的結果。

CREATE function [dbo].[documents]() 
returns @results TABLE (

    DOCUMENT_ID INT NOT NULL, 
    TITLE VARCHAR(6) NOT NULL, 
    LEGALNAME VARCHAR(50) NOT NULL, 
    AUTHOR_ID INT NOT NULL, 
    DOCUMENT_TYPE VARCHAR(1) NOT NULL, 
    LAST_UPDATE DATETIME 
) AS 

BEGIN 
INSERT INTO @results 
SELECT  CAST(DOCUMENT_ID AS INT) AS DOCUMENT_ID, TITLE, LEGALNAME, CAST(AUTHOR_ID AS INT) AS AUTHOR_ID, DOCUMENT_TYPE, LAST_UPDATE 
FROM   OPENQUERY(ORACLE_SERVER, 
         'select DOCUMENT_ID, TITLE, LEGALNAME, AUTHOR_ID, DOCUMENT_TYPE, FUNDTYPE, LAST_UPDATE 
         from documents') 

return 
END 

然後,您可以使用表值函數,因爲它是表中的SQL查詢:

SELECT * FROM DOCUMENTS()

1

今天我遇到了同樣的問題,內連接。由於創建Table Valued Functioncodechurn建議或使用Temporary Table建議user1935511或更改Join Types建議cymorg是我沒有選擇,我喜歡分享我的解決方案。

我用Join Hints驅使查詢優化器進入正確的方向,因爲問題似乎是從本地的遠程表的嵌套循環連接策略中產生的。對我來說HASHMERGEREMOTE加入提示工作。

對於你REMOTE不會是一個選項,因爲它只能用於內部聯接操作。所以使用類似下面的內容應該可以工作。

select * 
from eopf.Batch b 
join eopf.BatchFile bf 
    on b.BatchID = bf.BatchID 
left outer merge join [OM_ORACLE]..[OM].[DOCUMENT_UPLOAD] du 
    on bf.ReferenceID = du.documentUploadID;