Allmänna råd för felsökning av "Inga mer data att läsa från uttaget"-fel.
Dessa fel orsakas vanligtvis av ett annat allvarligt fel, till exempel ett ORA-600-fel. Ett problem så allvarligt att serverprocessen kraschade och inte ens kunde skicka ett korrekt felmeddelande till klienten. (En annan vanlig orsak till dessa fel är en nätverksavbrott orsakad av SQLNET.EXPIRE_TIME eller någon annan process som dödar gamla sessioner.)
Titta på varningsloggen för att ta reda på det ursprungliga felmeddelandet.
Leta efter filen alert_[name].log i denna katalog:select value from v$parameter where name = 'background_dump_dest';
När du har hittat det specifika felmeddelandet och detaljerna går du till support.oracle.com. Använd "ora-600-verktyget" och slå sedan upp det första numret efter ORA-600-meddelandet.
Det kommer vanligtvis att finnas en eller flera artiklar för den specifika typen av ORA-600-fel. Använd den exakta versionen och plattformen för att begränsa den möjliga listan över buggar. (Men bli inte förvånad om "berörda versioner" i artikeln är felaktiga. Oracles påståenden om "fixad i version x.y" är inte alltid sanna.)
Artiklarna förklarar vanligtvis mer detaljerat hur problemet uppstod, möjliga lösningar och en lösning som vanligtvis innebär en patch eller uppgradering.
I praktiken vill du sällan lösa dessa problem. Det "typiska" rådet är att kontakta Oracle Support för att verifiera att du verkligen har samma problem, skaffa en patch, få tillstånd och ta ner miljön/miljöerna och sedan applicera patchen. Och sedan inser förmodligen att patchen inte fungerar. Grattis, du har bara slösat bort mycket tid.
Istället kan du vanligtvis undvika problemet med en subtil ändring av frågan eller proceduren. Det finns många funktioner i Oracle, det finns nästan alltid ett annat sätt att göra det på. Om koden ser lite konstig ut, lägg till en kommentar för att varna framtida programmerare:"Den här koden ser konstig ut för att undvika bugg X, som bör fixas i version Y."
Särskilda råd för den här koden
Om det verkligen är hela din procedur bör du ersätta den med något sånt här:
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;
Generellt sett bör du alltid göra saker i SQL om det är möjligt. Speciellt om du kan undvika att öppna många markörer. Och särskilt om du kan undvika att öppna många markörer till en fjärrdatabas.