查找插入表并使用dba_source

时间:2017-10-30 11:22:53

标签: sql oracle

我想在整个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"

4 个答案:

答案 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
       )

然后你需要处理其他情况:

  • 表格标识符位于INTOUPDATE关键字的下一行;
  • 表标识符具有模式前缀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
       )

您还可以使用LAGLEAD查找跨行传播的语句。

答案 2 :(得分:1)

有几件事需要考虑:

  1. 关键字INSERT和表名称之间可能有空格
  2. 表名称前面可能有一个模式名称(my_schema.my_table)
  3. 表名可以是大写或小写或混合使用
  4. 排除my_table_xxx以搜索my_table,正如您已经提到的那样
  5. 以下是对此的查询:

    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');