我有数百个存储过程,我想找出在查询中使用特定列名的过程的名称
答案 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 ...
来获取要调查的对象列表。