Есть ли способ определить, имеет ли пакет состояние в Oracle?
есть ли способ в Oracle определить, имеет ли пакет состояние или является апатридом? Я не знаю ни одного представления в словаре данных, которое содержит эту информацию.
ошибка "ORA-04068: существующее состояние строки пакетов было отброшено" довольно раздражает. Его можно устранить, удалив переменные пакета из пакета. 11g представила функцию, что пакет с переменными, которые являются константами времени компиляции, будет рассматриваться как не имеющий гражданства.
Я мог бы иметь два сеанса и скомпилировать пакет в одном и вызвать его в другом и посмотреть, вызывает ли он исключение, но это требует вызова процедуры в пакете, что может быть нежелательно.
1 ответов
похоже, что вы хотите, чтобы иметь возможность перечислять все пакеты, которые потенциально могут иметь состояние.
то, что вы ищете-это просто пакеты, которые имеют какие-либо глобальные переменные или константы. Для одиночного пакета, это довольно просто осмотром. Однако, чтобы просмотреть все пакеты в схеме, вы можете использовать PL / Scope:
во-первых, войдите в систему как владелец схемы, включите PL / Scope в своем сеансе:
alter session set plscope_settings='IDENTIFIERS:ALL';
затем перекомпилируйте весь пакет тела.
затем выполните этот запрос, чтобы найти все переменные и константы, объявленные на уровне пакета:
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'
);
Я бы предложил, чтобы результирующий список пакетов был вашей целью.
Если вы находитесь на 11gR2, константы больше не вызывают эту проблему, поэтому вы бы использовали этот запрос вместо:
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'
);