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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top