sql >> Base de Datos >  >> RDS >> Oracle

No más datos para leer del socket

Consejos genéricos para solucionar los errores "No hay más datos para leer del socket".

Estos errores suelen ser causados ​​por otro error grave, como un error ORA-600. Un problema tan grave que el proceso del servidor colapsó y ni siquiera pudo enviar un mensaje de error adecuado al cliente. (Otra razón común de estos errores es una desconexión de la red provocada por SQLNET.EXPIRE_TIME o algún otro proceso que elimina sesiones antiguas).

Consulte el registro de alertas para averiguar el mensaje de error original.

Busque el archivo alert_[name].log en este directorio:select value from v$parameter where name = 'background_dump_dest';

Después de encontrar el mensaje de error específico y los detalles, vaya a support.oracle.com. Use la "herramienta ora-600" y luego busque el primer número después del mensaje ORA-600.

Por lo general, habrá uno o más artículos para ese tipo específico de error ORA-600. Utilice la versión y la plataforma exactas para reducir la lista de errores posibles. (Pero no se sorprenda si las "Versiones afectadas" en el artículo son incorrectas. Las afirmaciones de Oracle de "corregido en la versión x.y" no siempre son ciertas).

Los artículos normalmente explican con más detalles cómo ocurrió el problema, las posibles soluciones y una solución que normalmente implica un parche o una actualización.

En la práctica, rara vez desea resolver estos problemas. El consejo "típico" es ponerse en contacto con Oracle Support para verificar que realmente tiene el mismo problema, obtener un parche, obtener permiso y apagar los entornos y luego aplicar el parche. Y luego probablemente te des cuenta de que el parche no funciona. Felicidades, acabas de perder mucho tiempo.

En su lugar, normalmente puede evitar el problema con un cambio sutil en la consulta o el procedimiento. Hay muchas características en Oracle, casi siempre hay otra forma de hacerlo. Si el código parece un poco raro, agregue un comentario para advertir a los futuros programadores:"Este código se ve raro para evitar el error X, que debería corregirse en la versión Y".

Consejos específicos para este código

Si ese es realmente todo su procedimiento, debe reemplazarlo con algo como esto:

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 general, siempre debe hacer las cosas en SQL si es posible. Especialmente si puedes evitar abrir muchos cursores. Y especialmente si puede evitar abrir muchos cursores a una base de datos remota.