Il semble que ce que vous voulez, c'est pouvoir répertorier tous les packages susceptibles d'avoir un état.
Ce que vous recherchez, ce sont uniquement des packages contenant des variables globales ou des constantes. Pour un seul emballage, c'est assez simple par inspection. Cependant, pour parcourir tous les packages d'un schéma, vous pouvez utiliser PL/Scope :
Tout d'abord, connectez-vous en tant que propriétaire du schéma, activez PL/Scope dans votre session :
alter session set plscope_settings='IDENTIFIERS:ALL';
Ensuite, recompilez tous les corps de vos packages.
Ensuite, exécutez cette requête pour trouver toutes les variables et constantes déclarées au niveau du package :
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'
);
Je suggérerais que la liste de packages résultante sera votre cible.
Si vous êtes sur 11gR2, les constantes ne causent plus ce problème, vous utiliserez donc cette requête à la place :
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'
);