2012-06-14 19 views
9

Esiste un modo in Oracle per determinare se un pacchetto ha stato o è stateless? Non sono a conoscenza di alcuna vista nel dizionario dati che contiene tali informazioni.C'è un modo per determinare se un pacchetto ha uno stato in Oracle?

"ORA-04068: lo stato esistente della stringa di pacchetti è stato scartato" l'errore è piuttosto fastidioso. Può essere eliminato rimuovendo le variabili del pacchetto dal pacchetto. 11g ha introdotto la funzionalità che un pacchetto con variabili che sono tutte costanti in fase di compilazione verrà considerato come apolidi.

Potrei avere due sessioni e compilare il pacchetto in uno e chiamarlo nell'altro e vedere se genera un'eccezione, ma ciò richiede la chiamata di una procedura nel pacchetto, che potrebbe non essere desiderabile.

+1

Prima di rispondere, è possibile spiegare perché vuoi sapere? Non cercare di essere un dolore, solo cercando di capire cosa esattamente vuoi fare. Perché è importante per te sapere se il pacchetto ha lo stato? Inoltre, sei solo interessato a sapere se un pacchetto ha uno stato, e quindi potrebbe, a un certo punto, incontrare ORA-4068? Oppure, per un pacchetto stateful, sei interessato a sapere se lo stato attuale del pacchetto è valido, non valido o non inizializzato? –

+3

I pacchetti di stato possono essere fastidiosi perché se viene effettuata una modifica mentre è aperta una sessione, è possibile che gli utenti ricevano errori. Ho questo problema con un pacchetto, che stavo refactoring per rendere apolidi e avere qualche problema (che sarà l'argomento di una futura domanda SO), quindi sarebbe bello avere un modo semplice per dire se il pacchetto è senza stato o non. Inoltre, quali altri pacchetti nel database sono stateful e potrebbero potenzialmente causare questo problema. – eaolson

risposta

11

Sembra che ciò che si desidera sia in grado di elencare tutti i pacchetti che potenzialmente potrebbero avere lo stato.

Quello che stai cercando sono solo pacchetti che hanno variabili o costanti globali. Per un singolo pacchetto, questo è abbastanza semplice con l'ispezione. Per cercare in tutti i pacchetti in uno schema, tuttavia, è possibile utilizzare PL/Ambito:

In primo luogo, accedere come proprietario dello schema, accendere PL/Scope nella sessione:

alter session set plscope_settings='IDENTIFIERS:ALL'; 

Poi, ricompilare tutti i corpi del tuo pacchetto.

Poi, eseguire la query per trovare tutte le variabili e le costanti dichiarate a livello di pacchetto:

select object_name AS package, 
     type, 
     name AS variable_name 
from user_identifiers 
where object_type IN ('PACKAGE','PACKAGE BODY') 
and usage = 'DECLARATION' 
and type in ('VARIABLE','CONSTANT') 
and usage_context_id in (
    select usage_id 
    from user_identifiers 
    where type = 'PACKAGE' 
); 

Io suggerirei la lista risultante di pacchetti sarà il tuo obiettivo.

Se siete su 11gR2, costanti causa non è più questo problema, in modo che ci si utilizzare questa query invece:

select object_name AS package, 
     type, 
     name AS variable_name 
from user_identifiers 
where object_type IN ('PACKAGE','PACKAGE BODY') 
and usage = 'DECLARATION' 
and type = 'VARIABLE' 
and usage_context_id in (
    select usage_id 
    from user_identifiers 
    where type = 'PACKAGE' 
); 
+0

Non è proprio quello che sto cercando. In 11g, i pacchetti con tutte le variabili del pacchetto 'CONSTANT' sono considerati senza stato, ma la tua query li restituirà. – eaolson

+0

eaolson, non è del tutto corretto. In 11gR1, le costanti * do * fanno sì che il pacchetto abbia lo stato; questo è stato risolto in 11gR2. Ho modificato la domanda per notare questo. –

+0

Sì, funziona! – eaolson

Problemi correlati