Domanda

Lo scenario che ha creato questa domanda:

Abbiamo un pacchetto che è una dipendenza di un altro pacchetto, a volte apportando modifiche a " parent " pacchetto rende il pacchetto dipendente non valido, ma a volte no.

Ci ha sorpreso prima.

Sarebbe molto utile capire semplicemente cosa causa l'invalidazione in modo che io possa prevederlo / pianificarlo.

È stato utile?

Soluzione

La modifica di qualsiasi oggetto su cui si basa un pacchetto (ad es. tabelle, viste, trigger, altri pacchetti) contrassegnerà automaticamente il pacchetto come non valido. Come indicato in precedenza su tuinstoel, Oracle è abbastanza intelligente da ricompilare il pacchetto al primo utilizzo.

Se sei preoccupato per questo, ogni volta che apporti modifiche allo schema (ad es. tabelle, viste, trigger, procedure), esegui un DBMS_UTILITY.compile_schema (o fai farlo dal tuo DBA). Questo forzerà la compilazione di tutti i pacchetti e ti farà sapere dove, o se, ci sono errori prima di trovarli nel modo più difficile.

Altri suggerimenti

Oppure puoi eseguire una query nella tabella seguente per vedere quali dipendenze hai

   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

Questo mostrerà tutte le dipendenze. Per i tuoi oggetti, interroga user_dependencies.

A proposito, se mi sbaglio completamente sulla situazione ... mi scuso in anticipo

Catturato di sorpresa?

Non sono sicuro di quali siano le implicazioni ...

Qualcosa si è rotto nella produzione?

Che cosa è successo ESATTAMENTE?

Il motivo per cui lo chiedo è perché capire le possibili ramificazioni di ogni cambiamento è molto più difficile che affrontare il risultato. Perché l'invalidazione diventa un problema? Suppongo che tu abbia ottenuto " Lo stato esistente del pacchetto è stato scartato " errore nella tua applicazione. È questo il REALE problema?

Ancora una volta ho il sospetto che lo sia e, in tal caso, trattiamolo invece dell'elenco delle modifiche che, come ho inserito in un commento, è specifico della versione. (11g tiene traccia della dipendenza fino alla colonna di una tabella anziché alla tabella nel suo insieme, ad esempio).

Questo potrebbe non sembrare un errore importante per te se non stai utilizzando lo stato del pacchetto. Se tu fossi questo sarebbe un errore importante e non saresti stato sorpreso, quindi suppongo che non lo sia.

Dato che non lo sei, questo errore può essere ignorato. Poiché puoi tranquillamente ignorarlo, puoi codificare l'app client per ignorare questo errore e riprovare a chiamare, perché, come altri hanno sottolineato Oracle, ricompilerà il pacchetto per te. Questo è un esercizio utile. Perché invece di conoscere ogni possibile cosa di cui devi preoccuparti quando apporti una modifica, e poi nella correzione di emergenza ne dimentichi una, la tua app la gestirà e andrà avanti, senza preoccupazioni.

Sono d'accordo con Thomas Jones-Low, tuttavia ci sono un paio di problemi in più con sessioni lunghe e ricompilazione.

Se fai riferimento a un pacchetto in una sessione e quel pacchetto (o un pacchetto dipendente) viene ricompilato durante la stessa sessione, otterrai un errore Oracle " ORA-06508: PL / SQL: impossibile trovare l'unità di programma chiamata " ;

Dopo aver fatto riferimento al pacchetto in una sessione, generalmente non è possibile modificarlo senza invalidarlo per quella sessione. Questo è un problema particolare per gli ambienti di sviluppo in cui i pacchetti cambiano frequentemente ma anche per gli ambienti di produzione in cui si desidera eseguire una piccola patch senza ridurre l'intero ambiente. Si noti che questo errore si verificherà anche quando non ci sono errori nei pacchetti modificati.

Oltre alla risposta di Thomas Jones-Low, se si modifica solo il pacchetto BODY, un oggetto dipendente potrebbe non essere contrassegnato come non valido.

Tuttavia, non appena si modificano le specifiche del pacchetto, ciò accadrà.

Se si tenta di eseguire un pacchetto Oracle non valido, Oracle tenterà di compilarlo. Solo quando rimane invalido dopo la compilazione Oracle genererà un'eccezione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top