Oracle
 sql >> Base de données >  >> RDS >> Oracle

Plus de données à lire à partir du socket

Conseils génériques pour le dépannage des erreurs "Plus de données à lire depuis le socket".

Ces erreurs sont généralement causées par une autre erreur grave, telle qu'une erreur ORA-600. Un problème si grave que le processus du serveur s'est écrasé et n'a même pas pu envoyer un message d'erreur approprié au client. (Une autre raison courante de ces erreurs est une déconnexion du réseau causée par SQLNET.EXPIRE_TIME ou un autre processus qui tue les anciennes sessions.)

Consultez le journal des alertes pour connaître le message d'erreur d'origine.

Recherchez le fichier alert_[name].log dans ce répertoire :select value from v$parameter where name = 'background_dump_dest';

Une fois que vous avez trouvé le message d'erreur spécifique et les détails, accédez à support.oracle.com. Utilisez "l'outil ora-600", puis recherchez le premier numéro après le message ORA-600.

Il y aura généralement un ou plusieurs articles pour ce type spécifique d'erreur ORA-600. Utilisez la version et la plate-forme exactes pour réduire la liste des bogues possibles. (Mais ne soyez pas surpris si les "Versions affectées" dans l'article sont fausses. Les affirmations d'Oracle de "corrigé dans la version x.y" ne sont pas toujours vraies.)

Les articles expliquent généralement plus en détail comment le problème s'est produit, les solutions de contournement possibles et une solution qui implique généralement un correctif ou une mise à niveau.

En pratique, vous voulez rarement résoudre ces problèmes. Le conseil "typique" consiste à contacter le support Oracle pour vérifier que vous rencontrez réellement le même problème, obtenir un correctif, obtenir l'autorisation et désactiver le ou les environnements, puis appliquer le correctif. Et puis probablement réaliser que le patch ne fonctionne pas. Félicitations, vous venez de perdre beaucoup de temps.

Au lieu de cela, vous pouvez généralement éviter le problème avec une modification subtile de la requête ou de la procédure. Il y a beaucoup de fonctionnalités dans Oracle, il y a presque toujours une autre façon de le faire. Si le code finit par avoir l'air un peu bizarre, ajoutez un commentaire pour avertir les futurs programmeurs :"Ce code a l'air bizarre pour éviter le bogue X, qui devrait être corrigé dans la version Y."

Conseil spécifique pour ce code

Si c'est vraiment toute votre procédure, vous devriez la remplacer par quelque chose comme ceci :

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;

En général, vous devriez toujours faire les choses en SQL si possible. Surtout si vous pouvez éviter d'ouvrir de nombreux curseurs. Et surtout si vous pouvez éviter d'ouvrir de nombreux curseurs vers une base de données distante.