我相信我偶然发现了 PL/Scope 结合关联数组的错误,但也许我忽略了一些东西。
我有以下包裹
create or replace package tq84_pkg_c as
procedure proc_1;
end tq84_pkg_c;
/
用它的身体
create or replace package body tq84_pkg_c as
type num_t is table of number index by varchar2(10);
procedure proc_2 is begin
null;
end proc_2;
procedure proc_1 is
v_num num_t;
begin
if v_num.exists(1) then
proc_2;
end if;
end proc_1;
end tq84_pkg_c;
/
我用 PL/Scope 编译包:
ALTER SESSION SET PLSCOPE_SETTINGS='IDENTIFIERS:ALL';
ALTER PACKAGE TQ84_PKG_C COMPILE;
然后,我查询all_identifiers
:
select
name identifier,
usage,
type,
usage_id,
usage_context_id,
line,
col
from
all_identifiers
where
object_name in ('TQ84_PKG_C')
order by
object_name,
object_type,
line,
col;
结果如下:
IDENTIFIER USAGE TYPE USAGE_ID USAGE_CONTEXT_ID LINE COL
------------------------------ ----------- ------------------ ---------- ---------------- ---------- ----------
TQ84_PKG_C DECLARATION PACKAGE 1 0 1 9
PROC_1 DECLARATION PROCEDURE 2 1 3 15
TQ84_PKG_C DEFINITION PACKAGE 1 0 1 14
NUM_T DECLARATION ASSOCIATIVE ARRAY 2 1 3 10
NUMBER REFERENCE NUMBER DATATYPE 3 2 3 28
VARCHAR2 REFERENCE CHARACTER DATATYPE 4 3 3 44
PROC_2 DEFINITION PROCEDURE 6 5 5 15
PROC_2 DECLARATION PROCEDURE 5 1 5 15
PROC_1 DEFINITION PROCEDURE 7 1 9 15
V_NUM DECLARATION VARIABLE 8 7 10 9
NUM_T REFERENCE ASSOCIATIVE ARRAY 9 8 10 15
V_NUM REFERENCE VARIABLE 11 10 12 12
PROC_2 CALL PROCEDURE 12 10 13 12
现在,问题出在最后两个记录上:他们usage_context_id
是10
,并且这个数字应该(我相信)引用usage_id
,但是,没有记录usage_id=10
。
那么,这是一个错误吗?或者有没有办法将丢失的记录包含到结果集中?
我相信问题是由线路引起的if v_num.exists(1) then
。如果我把这个if
(和相应的end if
)拿出来,问题就会消失,并且 usage_conext_id 用于PROC_2
引用现有的usage_id
.
这是一个错误,因为文档指出:
更新:一些故障排除......
all_identifiers.usage_id
来自sys.plscope_action$.action#
鉴于:
...我们正在寻找
sys.plscope_action$.action# = 10
这个对象的难以捉摸的:那是缺少的行。
ALL_IDENTIFIERS
视图在签名列上加入了sys.plscope_identifier$
-sys.plscope_action$
中没有匹配的行sys.plscope_identifier$
,我怀疑这是导致问题的原因。看起来这是处理集合变量函数的错误。给定以下功能:
all_identifiers
我从11.2.0.1 和 11.2.0.3得到以下输出:缺少
USAGE_IDs
11、13、15、18 和 21。这些出现在USAGE_CONTEXT_ID
的实例中VAR.<fn>
。