如何使用Oracle 11g中的列名查找存储过程的名称

时间:2011-03-25 13:17:58

标签: oracle11g

我有数百个存储过程,我想找出在查询中使用特定列名的过程的名称

2 个答案:

答案 0 :(得分:6)

这样做会,但可能会产生通用列名的误报

SELECT DISTINCT type, name
FROM dba_source
WHERE owner = 'OWNER'
AND text LIKE '%COLUMN_NAME%';

其中OWNER是拥有您要搜索的存储过程的架构,COLUMN_NAME是您要查找的列名。如果不使用大小写混合列名称,则可以用

替换最后一行
AND UPPER(text) LIKE '%COLUMN_NAME%';

并以大写字母输入列名称以获得不区分大小写的搜索。

答案 1 :(得分:1)

没有保证的方法,但您可以使用regexp_like搜索user / all / dba_source来检查整个单词,并使用user / all / dba_dependencies交叉引用它以缩小要检查的包列表

select s.name, s.type, s.line, s.text
from   user_source s
where  ltrim(s.text,chr(9)||' ') not like '--%'
and    regexp_like(lower(s.text),'\Wyour_column_name_here\W')
and    (s.name, s.type) in
       ( select d.name, d.type
         from   user_dependencies d
         where  d.referenced_owner = user
         and    d.referenced_name = 'YOUR_TABLE_NAME_HERE' );

或者如果可以从其他模式引用它,

select s.owner, s.name, s.type, s.line, s.text
from   all_source s
where  ltrim(s.text,chr(9)||' ') not like '--%'
and    regexp_like(lower(s.text),'\Wyour_column_name_here\W')
and    (s.owner, s.name, s.type) in
       ( select d.owner, d.name, d.type
         from   all_dependencies d
         where  d.referenced_owner = user
         and    d.referenced_name = 'YOUR_TABLE_NAME_HERE' );

您可以使用select distinct s.owner, s.name, s.type ...来获取要调查的对象列表。