Oracle
 sql >> Database >  >> RDS >> Oracle

Non ci sono più dati da leggere dal socket

Consigli generici per la risoluzione dei problemi "Nessun dato più da leggere dal socket".

Questi errori sono in genere causati da un altro errore grave, come un errore ORA-600. Un problema così grave che il processo del server si è bloccato e non è riuscito nemmeno a inviare un messaggio di errore corretto al client. (Un altro motivo comune per questi errori è una disconnessione di rete causata da SQLNET.EXPIRE_TIME o qualche altro processo che interrompe le vecchie sessioni.)

Guarda il registro degli avvisi per scoprire il messaggio di errore originale.

Cerca il file alert_[name].log in questa directory:select value from v$parameter where name = 'background_dump_dest';

Dopo aver trovato il messaggio di errore specifico e i dettagli, vai su support.oracle.com. Usa lo "strumento ora-600" e poi cerca il primo numero dopo il messaggio ORA-600.

Di solito ci saranno uno o più articoli per quel tipo specifico di errore ORA-600. Usa la versione e la piattaforma esatte per restringere il possibile elenco di bug. (Ma non sorprenderti se le "Versioni interessate" nell'articolo sono sbagliate. Le affermazioni di Oracle di "corretto nella versione x.y" non sono sempre vere.)

Gli articoli in genere spiegano in modo più dettagliato come si è verificato il problema, possibili soluzioni alternative e una soluzione che di solito prevede una patch o un aggiornamento.

In pratica raramente vuoi risolvere questi problemi. Il consiglio "tipico" è di contattare l'assistenza Oracle per verificare di avere davvero lo stesso problema, ottenere una patch, ottenere l'autorizzazione e disattivare gli ambienti, quindi applicare la patch. E poi probabilmente realizzi che la patch non funziona. Congratulazioni, hai perso un sacco di tempo.

Invece, di solito puoi evitare il problema con una leggera modifica alla query o alla procedura. Ci sono molte funzionalità in Oracle, c'è quasi sempre un altro modo per farlo. Se il codice finisce per sembrare un po' strano, aggiungi un commento per avvisare i futuri programmatori:"Questo codice sembra strano per evitare il bug X, che dovrebbe essere corretto nella versione Y."

Consigli specifici per questo codice

Se questa è davvero la tua intera procedura, dovresti sostituirla con qualcosa del genere:

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;

In generale, dovresti sempre fare le cose in SQL, se possibile. Soprattutto se puoi evitare di aprire molti cursori. E soprattutto se puoi evitare di aprire molti cursori su un database remoto.