Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Não há mais dados para ler do soquete

Conselho genérico para solução de problemas de erros "Não há mais dados para ler do soquete".


Esses erros geralmente são causados ​​por outro erro grave, como um erro ORA-600. Um problema tão sério que o processo do servidor travou e não conseguiu nem enviar uma mensagem de erro adequada ao cliente. (Outro motivo comum para esses erros é uma desconexão de rede causada por SQLNET.EXPIRE_TIME ou algum outro processo que mata sessões antigas.)

Consulte o Log de alertas para descobrir a mensagem de erro original.

Procure o arquivo alert_[name].log neste diretório:select value from v$parameter where name = 'background_dump_dest';

Depois de encontrar a mensagem de erro e os detalhes específicos, acesse support.oracle.com. Use a "ferramenta ora-600" e procure o primeiro número após a mensagem ORA-600.

Geralmente haverá um ou mais artigos para esse tipo específico de erro ORA-600. Use a versão e a plataforma exatas para restringir a lista possível de bugs. (Mas não se surpreenda se as "Versões afetadas" no artigo estiverem erradas. As afirmações da Oracle de "corrigido na versão x.y" nem sempre são verdadeiras.)

Os artigos geralmente explicam com mais detalhes como o problema aconteceu, possíveis soluções alternativas e uma solução que geralmente envolve um patch ou atualização.

Na prática, você raramente deseja resolver estes problemas. O conselho "típico" é entrar em contato com o Suporte da Oracle para verificar se você realmente tem o mesmo problema, obter um patch, obter permissão e desativar o(s) ambiente(s) e, em seguida, aplicar o patch. E então provavelmente percebe que o patch não funciona. Parabéns, você acabou de perder muito tempo.

Em vez disso, normalmente você pode evitar o problema com uma mudança sutil na consulta ou procedimento. Existem muitos recursos no Oracle, quase sempre há outra maneira de fazer isso. Se o código parecer um pouco estranho, adicione um comentário para avisar os futuros programadores:"Este código parece estranho para evitar o bug X, que deve ser corrigido na versão Y."

Aconselhamento específico para este código


Se esse for realmente todo o seu procedimento, você deve substituí-lo por algo assim:
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;

Em geral, você deve sempre fazer as coisas em SQL, se possível. Especialmente se você puder evitar abrir muitos cursores. E especialmente se você puder evitar abrir muitos cursores para um banco de dados remoto.