Generiske råd til fejlfinding af "Ingen flere data at læse fra socket"-fejl.
Disse fejl er normalt forårsaget af en anden alvorlig fejl, såsom en ORA-600 fejl. Et problem så alvorligt, at serverprocessen styrtede ned og ikke engang kunne sende en ordentlig fejlmeddelelse til klienten. (En anden almindelig årsag til disse fejl er en netværksafbrydelse forårsaget af SQLNET.EXPIRE_TIME eller en anden proces, der dræber gamle sessioner.)
Kig på advarselsloggen for at finde den oprindelige fejlmeddelelse.
Se efter filen alert_[name].log i denne mappe:select value from v$parameter where name = 'background_dump_dest';
Når du har fundet den specifikke fejlmeddelelse og detaljer, skal du gå til support.oracle.com. Brug "ora-600-værktøjet", og find derefter det første tal efter ORA-600-meddelelsen.
Der vil normalt være en eller flere artikler for den specifikke type ORA-600 fejl. Brug den nøjagtige version og platform til at indsnævre den mulige liste over fejl. (Men bliv ikke overrasket, hvis "Berørte versioner" i artiklen er forkerte. Oracles påstande om "fast i version x.y" er ikke altid sande.)
Artiklerne forklarer typisk mere detaljeret, hvordan problemet opstod, mulige løsninger og en løsning, der normalt involverer en patch eller opgradering.
I praksis vil du sjældent løse disse problemer. Det "typiske" råd er at kontakte Oracle Support for at bekræfte, at du virkelig har det samme problem, få en patch, få tilladelse og nedbringe miljøet/miljøerne og derefter anvende patchen. Og så sikkert indse, at patchen ikke virker. Tillykke, du har bare spildt en masse tid.
I stedet kan du normalt undgå problemet med en subtil ændring af forespørgslen eller proceduren. Der er mange funktioner i Oracle, der er næsten altid en anden måde at gøre det på. Hvis koden ender med at se lidt mærkelig ud, skal du tilføje en kommentar for at advare fremtidige programmører:"Denne kode ser mærkelig ud for at undgå fejl X, som burde rettes i version Y."
Specifikke råd til denne kode
Hvis det virkelig er hele din procedure, bør du erstatte den med noget som dette:
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;
Generelt bør du altid gøre ting i SQL, hvis det er muligt. Især hvis du kan undgå at åbne mange markører. Og især hvis du kan undgå at åbne mange markører til en ekstern database.