使用 PL/SCOPE 在 identifiers_all 上缺少 CALL

Posted

技术标签:

【中文标题】使用 PL/SCOPE 在 identifiers_all 上缺少 CALL【英文标题】:Missing CALLs on identifiers_all using PL/SCOPE 【发布时间】:2019-10-16 14:02:09 【问题描述】:

我正在尝试使用 PL/SCOPE 中的 all_identifiers 视图来找出对过程和函数的调用,但它没有显示所有调用,有些调用丢失了。

我在第 4216 行的包 (PKG_1) 中有以下代码:

tmpParameterId:=  PKG_2.function1(var1, var2, var3);

当我运行查询时:

select * from ALL_IDENTIFIERS where  upper(object_name) = 'PKG_1' and line = '4216';

我得到以下结果(owner|name|type|object_name|object_type|usage|line):

SYSADM  var3 FORMAL IN  PKG_1 PACKAGE BODY  REFERENCE   4216    
SYSADM  var2 FORMAL IN  PKG_1 PACKAGE BODY  REFERENCE   4216    
SYSADM  var1 FORMAL IN  PKG_1 PACKAGE BODY  REFERENCE   4216    
SYSADM  TMPPARAMETERID  VARIABLE    PKG_1 PACKAGE BODY  ASSIGNMENT  4216    

而且我没有得到 function1 的 CALL 用法。 我在包的其他部分有类似的代码,它显示了这些调用。 真的迷路了,因为我不知道为什么有些 CALL 被存储在 all_identifiers 中而有些没有。

【问题讨论】:

对象名称的小写字符在 Oracle 中不是一个好主意,如果没有用引号括起来,oracle 无论如何都会使用大写。在 where 语句中尝试 ... upper(object_name) = 'PKG_1'..。 我使用大写和大写的 pkg 名称,我在简化代码时错误地给它一个小写名称,编辑帖子以反映这一点 【参考方案1】:

您是否使用 PLSCOPE_SETTINGS='IDENTIFIERS:ALL' 重新编译了名为 PKG_2 的包?

PL/Scope 仅报告对其确实知道的对象的调用。

如果function1是在PKG_2编译后创建的,PL/scope不会报告它在PKG_1中的使用情况。

这可能是一个解释,否则这也可能是一个错误。如果是这种情况,您将不得不在 Oracle 支持中搜索描述您问题的关键字。

【讨论】:

以上是关于使用 PL/SCOPE 在 identifiers_all 上缺少 CALL的主要内容,如果未能解决你的问题,请参考以下文章

使用 D3 和 Shiny 在 R 中实现 `identify()`

什么是“Zone.Identifier”文件? [关闭]

linkerd实战HTTP1.1 Identifiers详解

如何在 Xcode 中更改 $(PRODUCT_BUNDLE_IDENTIFIER)?

Hibernate Envers - 在 ValidityAuditStrategy 中使用 allow_identifier_reuse=true 支持 JDBC 批处理

ForEach 在符合 Identifiable 协议后无法在 SwiftUI 中工作