您如何找到使用存储过程的位置(在其他存储过程中)


10

我在具有数千个SP的数据库中有一个要重构的存储过程。有没有一种快速的方法可以在其他SP中找到对该存储过程的引用,因此我可以确定重构时不会破坏任何其他代码。

在应用程序代码中,我可以很容易地找到对SP的调用,并且可以对定义SP的所有各种sql文件进行文本搜索,但是数据库中可能有一些SP可能会被这种方式错过。

编辑:我要查找的存储的过程是包的一部分。

编辑:我在Oracle 11g上运行

Answers:


11

DBA_DEPENDENCIES 视图具有此类问题的所有答案。

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

2
但是,如果使用动态sql,则此方法将不起作用。即,如果您将过程作为动态sql的一部分执行。否则,dba_或all_dependencies将非常有用。
2015年

1
这很有用,我可以找到用户定义的功能和过程,但似乎找不到包中定义的FN或SP。有什么想法吗?
Peter Bagnall 2015年

在这种情况下,必须搜索一个包。DBA_DEPENDENCIES向我们展示更多类似如果丢弃特定对象将使之无效的内容。因此,例如,您可以找到引用表的视图。
Mindaugas Riauba,2015年


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%')) 
;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.