AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 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

Existe um bug com PL/Scope em combinação com matrizes associativas?

  • 772

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é 10e 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_2referenciar um arquivo usage_id.

oracle oracle-11g-r2
  • 2 2 respostas
  • 588 Views

2 respostas

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

    É um bug, porque a documentação afirma:

    USAGE_CONTEXT_ID é uma chave estrangeira reflexiva para USAGE_ID

    ATUALIZAÇÃO : Um pouco de solução de problemas...

    all_identifiers.usage_idvem desys.plscope_action$.action#

    Dado:

    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>
    

    ... estamos procurando o indescritível sys.plscope_action$.action# = 10para este objeto:

    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>
    

    Essa é a linha que falta.

    A ALL_IDENTIFIERSexibição se une sys.plscope_identifier$à sys.plscope_action$coluna de assinatura - não há linha correspondente em sys.plscope_identifier$, o que suspeito estar causando o problema.

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

    Parece que este é um bug com a manipulação de funções em variáveis ​​de coleção. Dada a seguinte função:

    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;
    /
    

    Obtenho a seguinte saída all_identifiersem 11.2.0.1 e 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
    

    Que está faltando USAGE_IDs11, 13, 15, 18 e 21. Estes aparecem no USAGE_CONTEXT_IDpara as instâncias de VAR.<fn>.

    • 3

relate perguntas

  • Backups de banco de dados no Oracle - Exportar o banco de dados ou usar outras ferramentas?

  • ORDER BY usando prioridades personalizadas para colunas de texto

  • Interface sqlplus confortável? [fechado]

  • Como encontrar as instruções SQL mais recentes no banco de dados?

  • Como posso consultar nomes usando expressões regulares?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve