Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在oracle中查找表和包引用_Sql_Oracle_Oracle11g - Fatal编程技术网

Sql 在oracle中查找表和包引用

Sql 在oracle中查找表和包引用,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有一个表格列表和一个包裹列表。我需要列出以下两个清单 使用给定表集的包是什么 每个给定包引用的表的列表 这些包使用动态sql,因此我可能无法仅依赖dba_参考表。 我可以想到的另一种方法是对dba_源表使用LIKE子句。但是,我必须为我需要的每个表编写一个OR条件(或者当然是一个可以在每个表中循环的函数或过程) 有没有更好的办法? 非常感谢您的帮助 编辑:重新表述问题- 我有一个选择/插入/更新多个表的包。这具有动态sql。下面提供了一个例子 我想确定此包中引用的所有表。实现这一目标的最佳

我有一个表格列表和一个包裹列表。我需要列出以下两个清单

  • 使用给定表集的包是什么
  • 每个给定包引用的表的列表
这些包使用动态sql,因此我可能无法仅依赖dba_参考表。 我可以想到的另一种方法是对dba_源表使用LIKE子句。但是,我必须为我需要的每个表编写一个OR条件(或者当然是一个可以在每个表中循环的函数或过程)

有没有更好的办法? 非常感谢您的帮助

编辑:重新表述问题-

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

我想确定此包中引用的所有表。实现这一目标的最佳方式是什么

在下面的示例中,我希望捕获表1和表2

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

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

第一个是应用严格的编码标准,这样您就知道要查找什么,然后就可以从代码的其余部分可靠地解析出表名。我的意思是,总是将相同的字符串写入一个已知变量名,然后搜索该变量

这并不总是容易做到的,尤其是当您有大量不符合标准的代码时。只要几个人不遵守标准,一切都会失败。然而,它可以工作,但可能永远不会100%可靠

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

这是一种老派的做法,但我已经用过,而且行之有效

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


如果代码有大量的调试,从而转储了这些表名,那么您可以再次运行测试脚本并获取调试日志。

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

第一个是应用严格的编码标准,这样您就知道要查找什么,然后就可以从代码的其余部分可靠地解析出表名。我的意思是,总是将相同的字符串写入一个已知变量名,然后搜索该变量

这并不总是容易做到的,尤其是当您有大量不符合标准的代码时。只要几个人不遵守标准,一切都会失败。然而,它可以工作,但可能永远不会100%可靠

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

这是一种老派的做法,但我已经用过,而且行之有效

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


如果代码进行了大量调试,从而转储了这些表名,则可以再次运行测试脚本并获取调试日志。

是否要查找正在更改的引用表名?包中的存储过程具有许多动态形成SQL的If条件。有些表可能不会在某些业务场景中使用。我想捕获所有使用的表。不确定这种引用是否在dba_引用表中维护。我想它会检查它是否运行
select*from User_Dependencies,其中type='table'和name in('TAB1','TAB2')
,并告诉我结果是什么这一切正常。然而,在我的案例中还有一种情况。在少数地方,我们将SQL形成一个字符串,然后将其传递给其他包执行。我可以从dba_源表中获得这些细节,但不能从dba_dependencies中获得。为什么不在这两个表之间使用联接呢?我不确定您的场景是什么,但有一个简单的例子:
select*from User\u Dependencies where name exists(select trim(TEXT))从用户\u来源,如“%TAB1%”
“您想查找正在更改的引用表名称吗?包中的存储过程有很多IF条件,这些条件动态形成SQL。某些业务场景中可能不使用某些表。我想捕获所有使用的表。不确定此类引用是否为mainta在dba_引用表中定义。我想它会检查它是否从用户_依赖项中运行
select*,其中type='table'和name位于('TAB1','TAB2'))
并告诉我结果是什么这是您所期望的。然而,在我的例子中还有一种情况。在少数地方,我们将SQL形成字符串,然后将其传递给其他包以执行。我可以从dba_源表中获得此类详细信息,但不能从dba_dependencies中获得。为什么不在这两个表之间使用联接呢我不确定您的场景是什么,但有一个简单的例子:
select*from User\u Dependencies where name existed(select trim(TEXT))from User