Acredito ter encontrado um bug com PL/Scope em combinação com matrizes associativas, mas talvez eu tenha esquecido algo.
tenho o seguinte pacote
create or replace package tq84_pkg_c as
procedure proc_1;
end tq84_pkg_c;
/
com seu corpo
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;
/
Eu compilo o pacote "com" PL/Scope:
ALTER SESSION SET PLSCOPE_SETTINGS='IDENTIFIERS:ALL';
ALTER PACKAGE TQ84_PKG_C COMPILE;
Então, eu questiono 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;
Com o seguinte resultado:
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
Agora, o problema é com os dois últimos registros: o deles usage_context_id
é 10
e esse número deve (como eu acredito) fazer referência a usage_id
, mas não há nenhum registro com usage_id=10
.
Então, isso é um bug? Ou existe uma maneira de incluir o registro ausente no conjunto de resultados?
Acredito que o problema seja causado pela linha if v_num.exists(1) then
. Se eu retirar isso if
(e o end if
) correspondente, o problema desaparece e use_conext_id para PROC_2
referenciar um arquivo usage_id
.
É um bug, porque a documentação afirma:
ATUALIZAÇÃO : Um pouco de solução de problemas...
all_identifiers.usage_id
vem desys.plscope_action$.action#
Dado:
... estamos procurando o indescritível
sys.plscope_action$.action# = 10
para este objeto:Essa é a linha que falta.
A
ALL_IDENTIFIERS
exibição se unesys.plscope_identifier$
àsys.plscope_action$
coluna de assinatura - não há linha correspondente emsys.plscope_identifier$
, o que suspeito estar causando o problema.Parece que este é um bug com a manipulação de funções em variáveis de coleção. Dada a seguinte função:
Obtenho a seguinte saída
all_identifiers
em 11.2.0.1 e 11.2.0.3:Que está faltando
USAGE_IDs
11, 13, 15, 18 e 21. Estes aparecem noUSAGE_CONTEXT_ID
para as instâncias deVAR.<fn>
.