2013-10-07 10 views
5

Mam połączoną konfigurację serwera SQL Server, aby trafić bazę danych Oracle. Mam kwerendę w SQL Server, który łączy się na stole Oracle za pomocą notacji kropkowej. Otrzymuję komunikat "Brak danych znalezionych" od Oracle. Po stronie Oracle uderzam w tabelę (nie widok) i nie jest zaangażowana procedura przechowywana.Serwer połączony z serwerem sql do oracle zwraca dane, które nie zostały znalezione, gdy istnieją dane.

Po pierwsze, gdy nie ma danych, powinienem otrzymać zero wierszy, a nie błąd.
Po drugie, w tym przypadku powinny być dane.
Po trzecie, widziałem tylko błąd ORA-01403 w kodzie PL/SQL; nigdy w SQL.

Jest to pełny komunikat o błędzie:
OLE DB provider "OraOLEDB.Oracle" dla serwera połączonego "OM_ORACLE" zwrócony komunikat "ORA-01403: nie znaleziono żadnych danych".
Msg 7346, poziom 16, Stan 2, wiersz 1 Nie można uzyskać danych wiersza od dostawcy OLE DB "OraOLEDB.Oracle" dla serwera połączonego "OM_ORACLE".

Oto kilka szczegółów, ale prawdopodobnie nie ma znaczenia, ponieważ nie masz moich tabel i danych.
To zapytanie z problemem:

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; 




Nie mogę zrozumieć, dlaczego dostaję „Brak danych” błąd. Poniższe zapytanie używa tej samej tabeli Oracle i nie zwraca żadnych danych, ale nie pojawia się błąd - po prostu nie zwracam żadnych wierszy.

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



Kwerenda zwraca dane poniżej. Właśnie usunąłem jeden z tabel SQL Server z join. Ale usunięcie tabeli wsadowej nie zmienia wierszy zwróconych z pliku wsadowego (271 wierszy w obu przypadkach - wszystkie wiersze w pliku wsadowym mają wpis wsadowy). Powinien nadal dołączać te same wiersze pliku wsadowego do tych samych wierszy Oracle.

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



I ta kwerenda zwraca 5 rzędów. Powinien być taki sam 5 z pierwotnego zapytania. (Nie mogę tego użyć, ponieważ potrzebuję danych z tabeli wsadowej i pliku wsadowego).

 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); 

Czy ktoś napotkał ten błąd?

Odpowiedz

1

Mam ten sam problem. Rozwiązanie 1: załaduj dane z bazy danych Oracle do tabeli tymczasowej, a następnie dołącz do tej tabeli tymczasowej - tutaj jest a link.

Z tego wpisu a link możesz dowiedzieć się, że problem może dotyczyć używania łączenia lewostronnego. Sprawdziłem z moim problemem i po zmianie zapytanie rozwiązuje problem.

0

W moim przypadku miałem złożony widok z połączonej tabeli, 3 widoki na podstawie połączonej tabeli i tabeli lokalnej. Używałem Inner Joins od początku i ten problem się zamanifestował. Zmiana połączeń na lewą i prawą łączność zewnętrzną (jeśli dotyczy) rozwiązała problem.

0

Mam ten sam problem i rozwiązać go poprzez unikanie operatora '=' spróbuj

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

Zamiast.

Dzięki

0

Innym sposobem obejścia tego problemu jest, aby wyciągnąć dane Oracle z powrotem do Table Valued Function. Spowoduje to, że SQL Server wyjdzie i pobierze wszystkie dane z Oracle i wyrzuci je do wynikowej zmiennej tabeli. Dla wszystkich celów i przeznaczenia dane Oracle są teraz "lokalne" dla SQL Server, jeśli korzystasz z wynikowej funkcji wycenianej w tabeli w zapytaniu.

wierzę oryginalny problemem jest to, że SQL Server próbuje zoptymalizować wykonanie zapytania związek, który zawiera wyniki zapytania zdalnych Oracle In-line. Korzystając z funkcji Valued do zawijania wywołania Oracle, SQL Server zoptymalizuje zapytanie złożone na wynikowej zmiennej tabeli zwróconej przez funkcję, a nie wyniki ze zdalnego wykonania zapytania.

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 

Następnie można użyć tabeli Ceniąca działać jak to było w stół zapytań SQL:

SELECT * FROM DOCUMENTS()

1

Dzisiaj przeżyłem ten sam problem z sprzężenie wewnętrzne. Ponieważ tworzenie Table Valued Function zasugerowanego przez codechurn lub użycie Temporary Table zasugerowanego przez user1935511 lub zmiana Join Types zasugerowana przez cymorg nie są dla mnie żadnymi opcjami, lubię udostępniać moje rozwiązanie.

Użyłem Join Hints do popchnięcia optymalizatora zapytań we właściwym kierunku, ponieważ problem wydaje się wznosić z zagnieżdżonych pętli strategii łączenia ze zdalną tabelą lokalnie. Dla mnie HASH, MERGE i PILOT dołączyć podpowiedzi pracował.

Dla ciebie REMOTE nie będzie opcja, ponieważ może być używany tylko do operacji łączenia wewnętrznego. Tak więc powinno działać coś podobnego do poniższego.

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; 
Powiązane problemy