2008-11-18 6 views
4

Возможно ли написать запрос PL/SQL для определения полного списка зависимостей хранимых процедур? Меня интересует только идентификация других хранимых процедур, и я бы предпочел не ограничивать глубину вложенности, которую она тоже получает. Например, если A вызывает B, который вызывает C, который вызывает D, я бы хотел, чтобы B, C и D сообщались как зависимости для A.Как вы программно идентифицируете зависимости хранимой процедуры?

ответ

8

В поле 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 
/
2

Я согласен с EddieAwad.

Полезно отметить, что Oracle отслеживает зависимости только до уровня объекта. Если у вас есть хранимые процедуры в пакете, вы можете отслеживать только зависимости, если пакет, а не отдельные функции/процедуры внутри пакета.

Если вы хотите отслеживать зависимости внутри пакета, вам понадобится парсер PLSQL.

2

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

Например, если вы строите SQL заявление во время выполнения, вы можете иметь код, подобный:

... 
mysql := 'select count(*) from '||table_name_in; 
execute immediate mysql; 
... 

Я сожжен это несколько раз, но нет, к сожалению, нет возможности найти эти типы зависимостей заранее, так как это потенциально зависит от ввода пользователя.

2

Чтобы получить все детали:

select * from all_dependencies where owner = '&OWNER' and NAME='&OBJECT_NAME' 

 Смежные вопросы

  • Нет связанных вопросов^_^