如何在 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 中使用列名查找存储过程的名称的主要内容,如果未能解决你的问题,请参考以下文章

oracle11g中的sql语句区分大小写吗

如何在 Oracle 11g 中查找给定父级的所有子 ID

oracle如何查找变量的列名和值? [关闭]

在 Oracle 11g 中转换动态查询以使用绑定变量

Oracle 11g:取消透视多个列并包含列名

如何以加密形式将密码字段存储在 oracle 11g 数据库中?