Ogólne porady dotyczące rozwiązywania problemów z błędami „Brak danych do odczytania z gniazda”.
Błędy te są zwykle spowodowane innym poważnym błędem, takim jak błąd ORA-600. Problem na tyle poważny, że proces serwera uległ awarii i nie mógł nawet wysłać poprawnego komunikatu o błędzie do klienta. (Inną częstą przyczyną tych błędów jest rozłączenie sieci spowodowane przez SQLNET.EXPIRE_TIME lub inny proces, który zabija stare sesje.)
Spójrz na dziennik alertów, aby znaleźć oryginalny komunikat o błędzie.
Poszukaj pliku alert_[name].log w tym katalogu:select value from v$parameter where name = 'background_dump_dest';
Po znalezieniu konkretnego komunikatu o błędzie i szczegółów przejdź na stronę support.oracle.com. Użyj „narzędzia ora-600”, a następnie wyszukaj pierwszy numer po komunikacie ORA-600.
Zwykle będzie jeden lub więcej artykułów dotyczących tego konkretnego typu błędu ORA-600. Użyj dokładnej wersji i platformy, aby zawęzić listę możliwych błędów. (Ale nie zdziw się, jeśli "Wersje, których dotyczy problem" w artykule są błędne. Twierdzenia Oracle o "poprawionej wersji x.y" nie zawsze są prawdziwe.)
Artykuły zazwyczaj wyjaśniają bardziej szczegółowo, w jaki sposób wystąpił problem, możliwe obejścia i rozwiązanie, które zwykle wiąże się z poprawką lub aktualizacją.
W praktyce rzadko chcesz rozwiązać te problemy. „Typową” radą jest skontaktowanie się z Oracle Support, aby sprawdzić, czy rzeczywiście masz ten sam problem, uzyskać poprawkę, uzyskać pozwolenie i wyłączyć środowiska, a następnie zastosować poprawkę. A potem prawdopodobnie zdasz sobie sprawę, że łatka nie działa. Gratulacje, właśnie zmarnowałeś dużo czasu.
Zamiast tego możesz zwykle unikać problem z subtelną zmianą zapytania lub procedury. W Oracle jest wiele funkcji, prawie zawsze można to zrobić w inny sposób. Jeśli kod wygląda trochę dziwnie, dodaj komentarz, aby ostrzec przyszłych programistów:„Ten kod wygląda dziwnie, aby uniknąć błędu X, który powinien zostać naprawiony w wersji Y”.
Szczegółowe porady dotyczące tego kodu
Jeśli to naprawdę cała procedura, powinieneś ją zastąpić czymś takim:
insert into local.tab3(col1, col2, col3, col4)
select tab1.col1, tab1.col2, tab2.col1, tab2.col2
from [email protected] tab1
join [email protected] tab2
on tab1.col1 = tab2.col1
and tab1.col2 = tab2.col2;
Ogólnie rzecz biorąc, jeśli to możliwe, zawsze powinieneś robić rzeczy w SQL. Zwłaszcza jeśli możesz uniknąć otwierania wielu kursorów. I zwłaszcza jeśli możesz uniknąć otwierania wielu kursorów do zdalnej bazy danych.