Есть ли способ определить, имеет ли пакет состояние в 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'
  );