1

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

通常,我想使用:

select * from user_source 
where upper(text) like '%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对编译器意味着 a),从而使这个结果更加智能?

所以通常我们允许匹配的单词包含类似. ; , '' ""但不包含的字符_

任何人都可以完成这项工作吗?

4

3 回答 3

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';
于 2013-08-19T14:18:23.193 回答
0

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

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

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

于 2013-08-19T14:46:35.053 回答
0
SELECT * FROM user_source
WHERE REGEXP_LIKE(text,'([^_a-z0-9])company([^_a-z0-9])','i')

谢谢@Ed Gibbs,这个修改后的答案可能会更聪明。

于 2013-08-26T15:42:49.233 回答