PL/Scope 与关联数组结合使用是否存在错误?

Ren*_*ger 4 oracle oracle-11g-r2 plsql

我相信我偶然发现了 PL/Scope 与关联数组相结合的错误,但也许我忽略了一些东西。

我有以下包裹

create or replace package tq84_pkg_c as

    procedure proc_1;

end tq84_pkg_c;
/
Run Code Online (Sandbox Code Playgroud)

用它的身体

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;
/
Run Code Online (Sandbox Code Playgroud)

我用“PL/Scope”编译包:

ALTER SESSION SET PLSCOPE_SETTINGS='IDENTIFIERS:ALL';

ALTER PACKAGE TQ84_PKG_C COMPILE;
Run Code Online (Sandbox Code Playgroud)

然后,我查询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;
Run Code Online (Sandbox Code Playgroud)

结果如下:

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
Run Code Online (Sandbox Code Playgroud)

现在,问题出在最后两条记录上:它们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.

Phi*_*lᵀᴹ 5

这是一个错误,因为文档指出:

USAGE_CONTEXT_ID 是 USAGE_ID 的自反外键

更新:一些故障排除...

all_identifiers.usage_id 来自 sys.plscope_action$.action#

鉴于:

SQL> /

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    2  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       DECLARATION PROCEDURE                   5                1    5  15
PROC_2       DEFINITION  PROCEDURE                   6                5    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

13 rows selected.

SQL>
Run Code Online (Sandbox Code Playgroud)

...我们正在寻找sys.plscope_action$.action# = 10这个对象难以捉摸的东西:

SQL> select a.obj#, a.action#, a.signature, a.action, a.line, a.col, a.context#, o.name, o.type#
from sys.plscope_action$ a, sys.obj$ o
where a.obj# = o.obj#
and name = 'TQ84_PKG_C'
and action# = 10;

      OBJ#    ACTION# SIGNATURE                            ACTION LINE COL   CONTEXT# NAME                                TYPE#
---------- ---------- -------------------------------- ---------- ---- --- ---------- ------------------------------ ----------
     83504         10 0C679E5FFBC26144A7F875495F68C2E1          3   12  18          7 TQ84_PKG_C                             11

SQL>
Run Code Online (Sandbox Code Playgroud)

那是缺少的行。

ALL_IDENTIFIERS视图加入sys.plscope_identifier$sys.plscope_action$在签名栏-没有匹配的行sys.plscope_identifier$,我怀疑是造成问题。