Як дізнатися, де використовується збережена процедура (в інших збережених процедурах)


10

У мене зберігається процедура, яку я хочу переробити, в базі даних, що містить тисячі SP. Чи є швидкий спосіб пошуку посилань на цю збережену процедуру в інших SP, тож я можу бути впевнений, що я не порушую жодного іншого коду під час рефактора.

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

EDIT: Збережені процедури, які я намагаюся знайти, є частиною пакету.

EDIT: Я працюю на Oracle 11g

Відповіді:


11

DBA_DEPENDENCIES Перегляд має всі відповіді на такі запитання.

select * from DBA_DEPENDENCIES
  where referenced_owner='HR' and referenced_name='STORED_PROCEDURE_41';

2
Однак цей підхід не буде працювати, якщо ви використовуєте динамічний sql. тобто якщо ви виконуєте процедуру як частину динамічного sql. Інакше dba_ або all_dependitions буде чудово працювати.
Радж

1
Це корисно, і я можу знайти функції та процедури, визначені користувачем, але я, здається, не зможу знайти FN або SP, які визначені в пакеті. Будь-які думки?
Пітер Баньялл

У цьому випадку потрібно шукати пакет. DBA_DEPENDENCIESпокажіть нам більше, як те, що буде визнано недійсним, якщо конкретний об’єкт буде скасовано. Так, наприклад, ви можете знайти таблицю посилань на перегляди.
Міндаугас Riauba


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%')) 
;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.