使用 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()`
linkerd实战HTTP1.1 Identifiers详解
如何在 Xcode 中更改 $(PRODUCT_BUNDLE_IDENTIFIER)?
Hibernate Envers - 在 ValidityAuditStrategy 中使用 allow_identifier_reuse=true 支持 JDBC 批处理