Как узнать, где используется хранимая процедура (в других хранимых процедурах)

10

У меня есть хранимая процедура, которую я хочу реорганизовать, в базе данных, которая имеет тысячи SP. Есть ли быстрый способ найти ссылки на эту хранимую процедуру в других SP, так что я могу быть уверен, что я не нарушу никакой другой код при рефакторинге.

В коде приложения я могу достаточно легко искать вызовы для SP и выполнять текстовый поиск по всем различным файлам sql, которые определяют SP, но возможно, что в базе данных есть некоторые SP, которые могут быть пропущены таким образом. ,

РЕДАКТИРОВАТЬ: хранимые процедуры, которые я пытаюсь найти, являются частью пакета.

РЕДАКТИРОВАТЬ: я бегу на Oracle 11g

Питер Баньялл
источник

Ответы:

11

DBA_DEPENDENCIES У представления есть все ответы на такие вопросы.

select * from DBA_DEPENDENCIES
  where referenced_owner='HR' and referenced_name='STORED_PROCEDURE_41';
Миндаугас Риауба
источник
2
Однако этот подход не будет работать, если вы используете динамический SQL. т.е. если вы выполняете процедуру как часть динамического SQL. В противном случае dba_ или all_dependencies будут отлично работать.
Радж
1
Это полезно, и я могу найти функции и процедуры, которые определены пользователем, но я не могу найти FN или SP, которые определены в пакете. Какие-нибудь мысли?
Питер Баньялл
В этом случае нужно искать пакет. DBA_DEPENDENCIESПокажите нам больше как то, что будет признано недействительным, если конкретный объект будет удален. Так, например, вы можете найти то, что просмотров ссылки таблицы
Миндаугас Риауба
0

У меня была похожая ситуация, только мне нужно было получить список пакетов, которые используют определенный пакет; поэтому я сделал этот запрос, может быть, это поможет:

with dep2 as (
    select dep.*
    from all_dependencies dep
    where dep.owner not in ('SYS', 'SYSTEM', 'PUBLIC', 'XDB')
    and dep.referenced_owner not in ('SYS', 'SYSTEM', 'PUBLIC', 'XDB')
    and dep.referenced_type = 'PACKAGE'
    and dep.dependency_type != 'NON-EXISTENT'
    and (dep.referenced_owner || '.' || dep.referenced_name) != (dep.owner || '.' || dep.name)
),
dep3 as (
    select owner || '.' || name as child,
    referenced_owner || '.' || referenced_name as parent
    from dep2
)
select connect_by_root parent, lpad(' ',2*(level-1)) || to_char(child) 
from dep3
start with parent = 'SCHEMA.PACKAGE_NAME'
connect by nocycle prior child = parent 
and exists (select 1 from all_source where (owner || '.' || name) = dep3.child and upper(text) like upper('%optional, some string you may want to search%')) 
;
Богдан
источник