Как вы программно идентифицируете зависимости хранимой процедуры? - PullRequest
4 голосов
/ 18 ноября 2008

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

Ответы [ 4 ]

8 голосов
/ 18 ноября 2008

На этой странице вы найдете следующий запрос, который использует 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 голосов
/ 13 апреля 2011

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

select * from all_dependencies where owner = '&OWNER' and NAME='&OBJECT_NAME' 
2 голосов
/ 29 декабря 2008

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

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

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

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

2 голосов
/ 18 ноября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...