我想在整个dba中找到所有插入,更新和合并行
我尝试了什么:SELECT owner, name, type,line,text
FROM dba_source where regexp_like(text,'into my_table')
union all
SELECT owner, name, type,line,text
FROM dba_source where regexp_like(text,'update my_table')
但是我的select函数没有返回任何内容。
编辑:返回必须包含特定的表。返回不应包含" my_table_2"等表格。或" my_table_temp"
答案 0 :(得分:3)
您没有使用非常好的搜索方法。如果源以下面的方式保存,您将不会得到任何结果 -
insert
into
any_table
因为有多个新行,所以来自dba_source / all_source的查询将失败。
找到它的更好方法是 -
select * from dba_dependencies
where referenced_name = 'TABLE_NAME|SYNONYM_NAME'
and referenced_type = 'TABLE|SYNONYM'
示例,
假设您有PROCEDURE XYZ
,其中包含以下构造
create or replace procedure xyz
begin
insert
into
any_table ....
end;
然后,如果您运行以下查询
select * from dba_dependencies
where referenced_name = 'any_table'
and referenced_type = 'TABLE';
上述查询的结果将为您提供'XYZ'作为记录。
答案 1 :(得分:2)
正如我在评论中提到的,案文可能是一个问题。另一个可能是角色之间的空白字符数。
SELECT owner,
name,
type,
line,
text
FROM dba_source
WHERE REGEXP_LIKE(
text,
'(into|update)\s+table_name(\s|$)',
-- Match both conditions and any amount of white-space
'i' -- Case insensitive
)
然后你需要处理其他情况:
INTO
或UPDATE
关键字的下一行; SCHEMA_NAME.TABLE_NAME
;或"TABLE_NAME"
或"SCHEMA_NAME"."TABLE_NAME"
; 这会给你一个表达式:
SELECT owner,
name,
type,
line,
text
FROM dba_source
WHERE REGEXP_LIKE(
text,
'(into|update)\s+(("?)schema_name\3\.)?("?)table_name\4(\s|$)',
-- Match both conditions, schema, quotes and any amount of white-space
'i' -- Case insensitive
)
您还可以使用LAG
或LEAD
查找跨行传播的语句。
答案 2 :(得分:1)
有几件事需要考虑:
以下是对此的查询:
SELECT owner, name, type, line, text
FROM dba_source
WHERE regexp_like(text, '(update|into)[[:space:]]+my_table($|\s|\W)', 'i')
OR regexp_like(text, '(update|into)[[:space:]]+[[:alpha:]]+\.my_table($|\s|\W)', 'i');
但是,这仍然不包括你在一行中有INSERT而在下一行中有表名的情况。
答案 3 :(得分:0)
试试这个: -
SELECT owner, name, type,line,text
FROM dba_source where regexp_like(UPPER(text),'INTO YOUR_TABLE_NAME')
union all
SELECT owner, name, type,line,text
FROM dba_source where regexp_like(UPPER(text),'UPDATE YOUR_TABLE_NAME');