情境:
我需要列出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上没有填充数据。
应力 我试图解决它整整一天,无法弄明白。对此的任何帮助都将受到高度赞赏。再一次谢谢你。
答案 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
/