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.