Que situações causam o Oracle Pacotes para se tornar inválido?
-
06-07-2019 - |
Pergunta
O cenário que criou esta pergunta:
Temos um pacote que é uma dependência de outro pacote, por vezes, de fazer alterações no pacote de "pai" faz com que o pacote dependente para se tornar inválido, mas às vezes isso não acontece.
Ele nos pegou de surpresa antes.
Seria muito útil para compreender simplesmente o que faz com que a invalidação para que eu pudesse prever / plano para ele.
Solução
Alterar objeto qualquer coisa que um pacote baseia-se (por exemplo, tabelas, views, triggers, outros pacotes) vai marcar automaticamente o pacote como inválido. Como tuinstoel notas acima, a Oracle é bastante inteligente para recompilar o pacote quando ele é usado pela primeira vez.
Se você está preocupado com isso, toda vez que fizer alterações de esquema (por exemplo, tabelas, views, triggers, procedimentos), executar um DBMS_UTILITY.compile_schema
(ou ter o seu DBA fazê-lo). Isto irá forçar compilar todos os pacotes e deixá-lo saber onde, ou se há erros antes de encontrá-los da maneira mais difícil.
Outras dicas
Ou você pode consultar a tabela a seguir para ver quais dependências você tem
select *
from dba_dependencies
where name = 'YOUR_PACKAGE'
and referenced_owner = 'ANYUSER' --- Comment this out if you are looking for yourself
and owner = USER --- Or can be set to any user
Isto irá mostrar todas as dependências. Para que sua objetos de consulta user_dependencies.
BTW, Se eu estou completamente errado sobre a situação ... desculpas antecipadamente
Pego de surpresa?
Não sei o que as implicações disso são ...
Será que algo quebra na produção?
O que aconteceu exatamente?
A razão que eu peço é porque compreender ramificações de cada mudança possível é muito mais difícil do que lidar com o resultado. Por que a invalidação se tornar um problema? Meu palpite é porque você tem um "estado existente do pacote foi descartado" erro na sua aplicação. É que o real questão?
Mais uma vez eu suspeito que é e se assim for, vamos apenas lidar com isso em vez da lista de mudanças que como eu colocar em um comentário é a versão específica. (Faixas 11g de dependência para baixo para a coluna de uma mesa, em vez da mesa, como um todo, por exemplo).
Isto não pode parecer como um erro importante para você se você não está usando o estado pacote. Se você fosse isso seria um erro importante e você não teria sido surpreendido, então eu estou supondo que você não é.
Uma vez que você não é esse erro é ok para ignorar. Desde que você pode ignorá-la com segurança, você pode codificar seu aplicativo cliente para ignorar este erro e tentar novamente a sua chamada, porque, como outros apontaram a Oracle irá recompilar o pacote para você. Este é um exercício que vale a pena. Porque ao invés de conhecer cada coisa possível que você precisa se preocupar quando você faz uma alteração, em seguida, na correção de emergência você esquecer um desses, a sua aplicação só vai lidar com isso e seguir em frente, sem se preocupar.
Eu concordo com Thomas Jones-Low no entanto, há um par mais coisas para fazer com sessões longas e recompilação.
Se você faz referência a um pacote em uma sessão e que o pacote (ou um pacote dependente) fica recompilados durante a mesma sessão, em seguida, você vai ter de erro Oracle "ORA-06508: PL / SQL: não foi possível encontrar unidade de programa que está sendo chamado de"
Uma vez que você referenciou o pacote em uma sessão você geralmente não pode alterar o pacote sem invalidar-lo para essa sessão. Este é um problema particular para ambientes de desenvolvimento onde os pacotes mudam com freqüência, mas também um problema para ambientes de produção onde você quer fazer uma pequena mancha sem tomar todo o ambiente para baixo. Note-se que este erro ocorrerá mesmo quando não há erros nos pacotes alterados.
Além de resposta de Thomas Jones-Low, se você só modificar o corpo do pacote, um objeto dependente pode não ser marcado como inválido.
No entanto, assim que você modificar a especificação do pacote, que está prestes a acontecer.
Se tentar executar um pacote Oracle inválido, a Oracle vai tentar compilá-lo. Só quando permanece inválido depois de compilar a Oracle vai lançar uma exceção.