如何在 Oracle 11g 中使用列名查找存储过程的名称
Posted
技术标签:
【中文标题】如何在 Oracle 11g 中使用列名查找存储过程的名称【英文标题】:How to find name of the stored procedure using Column name in Oracle 11g 【发布时间】:2011-03-25 13:17:57 【问题描述】:我有数百个存储过程,我想找出在查询中使用特定列名的过程的名称
【问题讨论】:
存储过程没有列 他的意思是在存储过程中类似于:select COLUMN from... 所以你应该拿走你的-1。 【参考方案1】:这样可以,但可能会为通用列名产生误报
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 行得到了以下错误错误 ORA-00942:表或视图不存在。我正在使用 Oracle 11g 我猜您无权访问 dba_source。请改用 all_source。【参考方案2】:没有保证的方法,但您可以使用 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 ...
来获取要调查的对象列表。
【讨论】:
以上是关于如何在 Oracle 11g 中使用列名查找存储过程的名称的主要内容,如果未能解决你的问题,请参考以下文章