在oracle中查找表和包引用

时间:2016-06-06 10:59:11

标签: sql oracle oracle11g

我有一个表列表和一个包列表。我需要提出以下两个列表

  • 使用给定表格集的包是什么
  • 每个给定包
  • 引用的表的列表

这些包使用动态sql,因此我可能无法仅依赖于dba_reference表。 我能想到的另一种方法是对dba_source表使用LIKE子句。但是,我将不得不为我需要的每个表写一个OR条件(或者当然是一个可以遍历每个表的函数或过程)

有没有更好的方法呢? 非常感谢任何帮助。

编辑:重新提出问题 -

我有一个选择/插入/更新几个表的包。这有动态sql。下面提供了一个例子。

我想识别此包中引用的所有表。实现这一目标的最佳方法是什么?

在下面的示例中,我想捕获table1和table2。

if flag = 'Y'
then final_sql := 'insert into table1 (...)';
else final_sql := 'insert into table2 (...)';
end if;
execute immediate final_sql;

1 个答案:

答案 0 :(得分:0)

对于使用大量动态SQL的系统,我建议采用两种方法。

首先要应用严格的编码标准,以便您知道要查找的内容,然后可以从其余代码中可靠地解析出表名。我的意思是,始终将表格相同的字符串写入已知变量名称,并搜索该变量。

这并不总是很容易做到,特别是如果您的代码不符合标准。它只需要几个人不遵守标准,它就会崩溃。然而,它可以工作,但可能永远不会100%可靠。

另一种方法是编写测试脚本来运行整个代码库和逻辑路径。以他们记录过程名称的方式编写它们。启用S​​QL跟踪并从测试中捕获跟踪文件。通过巧妙的脚本,您应该能够将跟踪绑定到过程。这将为您提供“原始”SQL,然后您可以grep匹配与您的表列表匹配。您可以通过收获V $ SQL绑定到V $ SESSION来获得相同的信息。

这是一种古老的学校方式,但我已经习惯并且有效。

在我工作的一个最大的系统上,我编写了一个CRUD解析器,它对代码进行了标记,并通过源文件和表访问生成了一个CRUD矩阵。对于动态SQL,我们处理了SQL Trace / tkprof文件。

如果代码具有大量调试,这些调试会转储这些表名,您可以再次运行测试脚本并收集调试日志。