Algemeen advies voor het oplossen van problemen met "Geen gegevens meer om uit socket te lezen".
Deze fouten worden meestal veroorzaakt door een andere ernstige fout, zoals een ORA-600-fout. Een probleem dat zo ernstig was dat het serverproces vastliep en niet eens een correct foutbericht naar de client kon sturen. (Een andere veelvoorkomende reden voor deze fouten is een netwerkverbinding die wordt veroorzaakt door SQLNET.EXPIRE_TIME of een ander proces dat oude sessies beëindigt.)
Bekijk het waarschuwingslogboek om de oorspronkelijke foutmelding te achterhalen.
Zoek naar het bestand alert_[name].log in deze map:select value from v$parameter where name = 'background_dump_dest';
Nadat u het specifieke foutbericht en de details hebt gevonden, gaat u naar support.oracle.com. Gebruik de "ora-600 tool" en zoek dan het eerste nummer op na het ORA-600 bericht.
Er zullen meestal een of meer artikelen zijn voor dat specifieke type ORA-600-fout. Gebruik de exacte versie en het exacte platform om de mogelijke lijst met bugs te verfijnen. (Maar wees niet verbaasd als de "betroffen versies" in het artikel verkeerd zijn. Oracle's beweringen over "opgelost in versie x.y" zijn niet altijd waar.)
In de artikelen wordt meestal gedetailleerder uitgelegd hoe het probleem is ontstaan, mogelijke tijdelijke oplossingen en een oplossing waarvoor meestal een patch of upgrade nodig is.
In de praktijk wil je zelden oplossen deze problemen. Het "typische" advies is om contact op te nemen met Oracle Support om te controleren of u echt hetzelfde probleem heeft, een patch te krijgen, toestemming te krijgen en de omgeving(en) te verwijderen en vervolgens de patch toe te passen. En dan waarschijnlijk beseffen dat de patch niet werkt. Gefeliciteerd, je hebt gewoon veel tijd verspild.
In plaats daarvan kunt u meestal vermijden het probleem met een subtiele wijziging in de vraag of procedure. Er zijn veel functies in Oracle, er is bijna altijd een andere manier om het te doen. Als de code er een beetje raar uitziet, voeg dan een opmerking toe om toekomstige programmeurs te waarschuwen:"Deze code ziet er raar uit om bug X te vermijden, die in versie Y moet worden opgelost."
Specifiek advies voor deze code
Als dat echt je hele procedure is, moet je die vervangen door zoiets als dit:
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;
Over het algemeen moet u dingen indien mogelijk altijd in SQL doen. Vooral als je kunt voorkomen dat je veel cursors opent. En vooral als u kunt voorkomen dat u veel cursors naar een externe database opent.