如何使用'regexp'从user_source中查找包含所需表名的所有源代码行

时间:2013-08-19 14:08:49

标签: regex database oracle

例如,我们有一个包含大量oracle包的大型数据库,现在我们想要查看特定表在源代码中的位置。源代码存储在user_source表中,我们所需的表称为“company”。

通常情况下,我想使用:

select * from user_source 
where upper(text) like '%COMPANY%'

这将返回包含“company”的所有单词,例如

121    company cmy
14     company_id, idx_name %% end of coding
453    ;companyname
1253   from db.company.company_id where 
989    using company, idx, db_name,

那么如何使用正则表达式来解析与有意义的表名匹配的所有源行(对编译器来说是table)更加智能?

通常情况下,我们允许匹配的字词包含. ; , '' ""等字符,但不包含_

任何人都能做到这一点吗?

3 个答案:

答案 0 :(得分:1)

使用正则表达式将公司视为“整个单词”:

SELECT * FROM user_source
WHERE REGEXP_LIKE(text, '(^|\s)company(\s|$)', 'i');

i的第三个参数使REGEXP_LIKE搜索不区分大小写。

至于忽略字符. ; , '' "",您可以使用REGEXP_REPLACE将它们从字符串中吸出来在做比较之前:

SELECT * FROM user_source
WHERE REGEXP_LIKE(REGEXP_REPLACE(text, '[.;,''"]'), '(^|\s)company(\s|$)', 'i');

附录:以下查询还有助于查找表引用。它不会给出源代码行,但它是一个开始:

SELECT *
FROM user_dependencies
WHERE referenced_name = 'COMPANY'
  AND referenced_type = 'TABLE';

答案 1 :(得分:0)

如果要识别引用表的对象,可以从数据字典中获取该信息:

select *
from all_dependencies
where referenced_owner = 'DB'
and referenced_name = 'COMPANY'
and referenced_type = 'TABLE';

您无法从中获取单独的行号,但您可以查看user_source或使用特定源代码的正则表达式,这至少可以减少误报。

答案 2 :(得分:0)

SELECT * FROM user_source
WHERE REGEXP_LIKE(text,'([^_a-z0-9])company([^_a-z0-9])','i')

感谢@Ed Gibbs,通过一个小技巧,这个修改过的答案可能会更加智能化。