Oracle - 如何查找表中的列+依赖于它们的存储过程?

时间:2009-10-01 03:00:59

标签: sql oracle plsql

情境:

我需要列出table1中的所有列以及依赖于此table1的那些列的所有存储过程。我需要将列名和存储过程填充到新表中。

我创建了new_table(col1, sProc)并尝试在此new_table上填充列名和相应的存储过程。我写的代码如下:

Declare

Begin

for i in (select column_name from user_tab_columns where lower(table_name) like 'table1') loop

insert into new_table
  select i.column_name, 
        name 
   from user_source 
  where lower(text) like '%' || i.column_name || '%';

commit;

end loop;

end;

结果: 脚本成功运行,但此new_table上没有填充数据。

应力 我试图解决它整整一天,无法弄明白。对此的任何帮助都将受到高度赞赏。再一次谢谢你。

3 个答案:

答案 0 :(得分:1)

一个明显的问题是您将过程文本转换为小写,而不是您要查找的列名。

但是,此代码还有其他问题。如果列名恰好与不是列引用的文本的某些部分匹配会发生什么?

答案 1 :(得分:0)

您可以做的最好的事情是列出包名称(因为这是USER_SOURCE.NAME字段中的值)以及列。正如rexem在他的评论中指出的那样,你不需要求助于for循环:

 INSERT INTO new_table (col1, sproc) 
    SELECT i.column_name, u.name 
    FROM user_tab_columns i, 
         user_source u 
    WHERE lower(i.table_name) like 'table1' 
      AND lower(u.text) like '%' || lower(i.column_name) || '%';

答案 2 :(得分:0)

您可以通过在查询中加入USER_DEPENDENCIES来减少误报。您可能希望限制搜索的类型(或者在TYPE中包含NEW_TABLE。)

insert into new_table (col1, sproc)
    select distinct tc.column_name, sp.name     
    from user_tab_columns tc
            , user_source sp
            , user_dependencies d
    where d.referenced_name = 'TABLE1'
    and   d.referenced_type = 'TABLE'
    and   d.type IN ('PACKAGE', 'PACKAGE BODY', 'FUNCTION'
             , 'PROCEDURE',  'TYPE', 'TRIGGER')
    and   tc.table_name = 'TABLE1'
    and   sp.name = d.name
    and   instr(lower(sp.text), lower(tc.column_name)) > 0
/