AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 31683
Accepted
René Nyffenegger
René Nyffenegger
Asked: 2013-01-11 04:38:01 +0800 CST2013-01-11 04:38:01 +0800 CST 2013-01-11 04:38:01 +0800 CST

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

  • 772

我相信我偶然发现了 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.

oracle oracle-11g-r2
  • 2 2 个回答
  • 588 Views

2 个回答

  • Voted
  1. Best Answer
    Philᵀᴹ
    2013-01-11T05:53:02+08:002013-01-11T05:53:02+08:00

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

    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>
    

    ...我们正在寻找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>
    

    那是缺少的行。

    ALL_IDENTIFIERS视图在签名列上加入了sys.plscope_identifier$-sys.plscope_action$中没有匹配的行sys.plscope_identifier$,我怀疑这是导致问题的原因。

    • 5
  2. Chris Saxon
    2013-01-11T09:17:28+08:002013-01-11T09:17:28+08:00

    看起来这是处理集合变量函数的错误。给定以下功能:

    create or replace procedure collection_functions as
      type nested_tab is table of number;
      var  nested_tab;
      num  pls_integer;
      boo  boolean;
    begin
      var.extend(1);
      var.trim(1);
      var.delete;
      boo := var.exists(1);
      num := var.count;
    end;
    /
    

    all_identifiers我从11.2.0.1 和 11.2.0.3得到以下输出:

    IDENTIFIER                     USAGE       TYPE                 USAGE_ID USAGE_CONTEXT_ID       LINE        COL
    ------------------------------ ----------- ------------------ ---------- ---------------- ---------- ----------
    COLLECTION_FUNCTIONS           DEFINITION  PROCEDURE                   2                1          1         11 
    COLLECTION_FUNCTIONS           DECLARATION PROCEDURE                   1                0          1         11 
    NESTED_TAB                     DECLARATION NESTED TABLE                3                2          2          8 
    NUMBER                         REFERENCE   NUMBER DATATYPE             4                3          2         31 
    VAR                            DECLARATION VARIABLE                    5                2          3          3 
    NESTED_TAB                     REFERENCE   NESTED TABLE                6                5          3          8 
    NUM                            DECLARATION VARIABLE                    7                2          4          3 
    PLS_INTEGER                    REFERENCE   SUBTYPE                     8                7          4          8 
    BOO                            DECLARATION VARIABLE                    9                2          5          3 
    BOOLEAN                        REFERENCE   BOOLEAN DATATYPE           10                9          5          8 
    VAR                            REFERENCE   VARIABLE                   12               11          7          3 
    VAR                            REFERENCE   VARIABLE                   14               13          8          3 
    VAR                            REFERENCE   VARIABLE                   16               15          9          3 
    BOO                            ASSIGNMENT  VARIABLE                   17                2         10          3 
    VAR                            REFERENCE   VARIABLE                   19               18         10         10 
    NUM                            ASSIGNMENT  VARIABLE                   20                2         11          3 
    VAR                            REFERENCE   VARIABLE                   22               21         11         10
    

    缺少USAGE_IDs11、13、15、18 和 21。这些出现在USAGE_CONTEXT_ID的实例中VAR.<fn>。

    • 3

相关问题

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • ORDER BY 使用文本列的自定义优先级

  • 舒服的sqlplus界面?[关闭]

  • 如何在数据库中找到最新的 SQL 语句?

  • 如何使用正则表达式查询名称?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve