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

ORA-04061:o estado existente do corpo do pacote PACKAGE.NAME foi invalidado persiste


O Oracle faz isso porque a recompilação de um pacote PL/SQL invalida qualquer variável de sessão em uso.

Não há muito que possamos fazer para evitar isso, exceto usando boas práticas de implantação. Não implemente alterações enquanto o banco de dados estiver em uso, certifique-se de que todas as conexões estejam desconectadas corretamente etc. É mais fácil falar do que fazer nesta era de CI/CD, tempo de inatividade zero e outras inovações interessantes.

Portanto, há uma coisa na parte de trás do armário:pragma serially_reusable; . Esta instrução significa que o estado do pacote é mantido durante uma única chamada de servidor . Por exemplo, se tivermos um bloco PL/SQL que chama um procedimento SR três vezes, qualquer variável alterada por esse procedimento manterá o valor nas três chamadas. Mas na próxima vez que executarmos o bloco - na mesma sessão - as variáveis ​​terão sido redefinidas para seus valores iniciais.

Existem várias limitações para PL/SQL reutilizável em série - por exemplo, ele não pode ser usado em consultas SQL. Mas a grande atração da sua perspectiva não é mais os erros ORA-04068 ou ORA-04061. Nenhum estado de sessão, nada para invalidar.

pragma serially_reusable deve ser declarado no nível do pacote e no corpo, bem como na especificação. Portanto, você deve ter certeza de que nenhum dos procedimentos empacotados precisa manter o estado nas chamadas do servidor.