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
.
这是一个错误,因为文档指出:
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$
,我怀疑是造成问题。
归档时间: |
|
查看次数: |
564 次 |
最近记录: |