例如,我们有一个包含大量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
)更加智能?
通常情况下,我们允许匹配的字词包含.
;
,
''
""
等字符,但不包含_
任何人都能做到这一点吗?
答案 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,通过一个小技巧,这个修改过的答案可能会更加智能化。