Общ съвет за отстраняване на грешки „Няма повече данни за четене от сокет“.
Тези грешки обикновено са причинени от друга сериозна грешка, като например грешка ORA-600. Толкова сериозен проблем, че сървърният процес се срина и дори не може да изпрати правилно съобщение за грешка на клиента. (Друга често срещана причина за тези грешки е прекъсване на връзката с мрежата, причинено от SQLNET.EXPIRE_TIME или друг процес, който убива старите сесии.)
Погледнете дневника на сигналите, за да разберете оригиналното съобщение за грешка.
Потърсете файла alert_[name].log в тази директория:select value from v$parameter where name = 'background_dump_dest';
След като намерите конкретното съобщение за грешка и подробности, отидете на support.oracle.com. Използвайте „инструмента ora-600“ и след това потърсете първото число след съобщението ORA-600.
Обикновено ще има една или повече статии за този конкретен тип грешка ORA-600. Използвайте точната версия и платформа, за да стесните възможния списък с грешки. (Но не се учудвайте, ако „засегнатите версии“ в статията са грешни. Твърденията на Oracle за „фиксирано във версия x.y“ не винаги са верни.)
Статиите обикновено обясняват по-подробно как е възникнал проблемът, възможните решения и решение, което обикновено включва корекция или надстройка.
На практика рядко искате да решите тези проблеми. „Типичният“ съвет е да се свържете с поддръжката на Oracle, за да потвърдите, че наистина имате същия проблем, да получите корекция, да получите разрешение и да свалите средата(ите) и след това да приложите корекцията. И тогава вероятно ще разберете, че пластирът не работи. Поздравления, просто загубихте много време.
Вместо това обикновено можете да избягвате проблемът с фина промяна в заявката или процедурата. Има много функции в Oracle, почти винаги има друг начин да го направите. Ако кодът изглежда малко странен, добавете коментар, за да предупредите бъдещите програмисти:„Този код изглежда странно, за да се избегне грешка X, която трябва да бъде коригирана във версия Y.“
Конкретен съвет за този код
Ако това наистина е цялата ви процедура, трябва да я замените с нещо подобно:
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;
По принцип винаги трябва да правите нещата в SQL, ако е възможно. Особено ако можете да избегнете отварянето на много курсори. И особено ако можете да избегнете отварянето на много курсори към отдалечена база данни.