Возможно ли написать запрос PL/SQL для определения полного списка зависимостей хранимых процедур? Меня интересует только идентификация других хранимых процедур, и я бы предпочел не ограничивать глубину вложенности, которую она тоже получает. Например, если A вызывает B, который вызывает C, который вызывает D, я бы хотел, чтобы B, C и D сообщались как зависимости для A.Как вы программно идентифицируете зависимости хранимой процедуры?
ответ
В поле this page вы найдете следующий запрос, который использует таблицу словаря PUBLIC_DEPENDENCY :
SELECT lvl
, u.object_id
, u.object_type
, LPAD (' ', lvl) || object_name obj
FROM (SELECT LEVEL lvl, object_id
FROM SYS.public_dependency s
START WITH s.object_id =
(SELECT object_id
FROM user_objects
WHERE object_name = UPPER ('&OBJECT_NAME')
AND object_type = UPPER ('&OBJECT_TYPE'))
CONNECT BY s.object_id = PRIOR referenced_object_id
GROUP BY LEVEL, object_id) tree
, user_objects u
WHERE tree.object_id = u.object_id
ORDER BY lvl
/
Я согласен с EddieAwad.
Полезно отметить, что Oracle отслеживает зависимости только до уровня объекта. Если у вас есть хранимые процедуры в пакете, вы можете отслеживать только зависимости, если пакет, а не отдельные функции/процедуры внутри пакета.
Если вы хотите отслеживать зависимости внутри пакета, вам понадобится парсер PLSQL.
Что-то еще стоит указать на то, что есть определенные случаи, когда зависимость может быть только во время выполнения, что, к сожалению, не будет отображаться в метаданных.
Например, если вы строите SQL заявление во время выполнения, вы можете иметь код, подобный:
...
mysql := 'select count(*) from '||table_name_in;
execute immediate mysql;
...
Я сожжен это несколько раз, но нет, к сожалению, нет возможности найти эти типы зависимостей заранее, так как это потенциально зависит от ввода пользователя.
Чтобы получить все детали:
select * from all_dependencies where owner = '&OWNER' and NAME='&OBJECT_NAME'