如何获取有关给定包中声明的所有类型数据的信息

Posted

技术标签:

【中文标题】如何获取有关给定包中声明的所有类型数据的信息【英文标题】:How to get information about all types of data declared in a given package 【发布时间】:2019-09-24 09:40:58 【问题描述】:

使用来自数据字典表示的信息,获取有关给定包中声明的所有数据类型的信息。

NAME            |   TYPE                |   PACKAGE
----------------------------------------------------
T_ASSOCIATIVE   |   ASSOCIATIVE ARRAY   |   MY_TYPES
T_TABLE_TYPE    |   NESTED TABLE        |   MY_TYPES
T_CURSOR_TYPE   |   EREFCURSOR          |
...

程序应该以匿名块的形式发出。

1)desc package_name;

没有获取某些行的变体,只需解析:此类任务的错误做法

2)

select * from user_types;
select * from user_type_attrs;
select * from user_type_methods;
select * from user_procedures;
select * from user_source;

没有得到任何结果,只有包类型,但没有在这个包中声明的类型

【问题讨论】:

为什么要匿名块? 嗨,亚历克斯!这是我大学的任务,我花了 2 周时间才找到正确的查询,但还没有结果。 【参考方案1】:

你可以在the all_plsql_types view看到PL/SQL类型

SQL>  > desc all_plsql_types
 Name                                                              Null?    Type
 ----------------------------------------------------------------- -------- --------------------------------------------
 OWNER                                                             NOT NULL VARCHAR2(128)
 TYPE_NAME                                                                  VARCHAR2(136)
 PACKAGE_NAME                                                      NOT NULL VARCHAR2(128)
 TYPE_OID                                                          NOT NULL RAW(16)
 TYPECODE                                                                   VARCHAR2(58)
 ATTRIBUTES                                                                 NUMBER
 CONTAINS_PLSQL                                                             VARCHAR2(3)

...或者dba_user_ 版本,如果您愿意的话。


该视图仅适用于 12c。在 11gR2 中,如果您启用了 PL/Scope,您可以从 the all_identifiers view 中提取该信息:

SQL> desc all_identifiers;

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 OWNER                                     NOT NULL VARCHAR2(30)
 NAME                                               VARCHAR2(30)
 SIGNATURE                                          VARCHAR2(32)
 TYPE                                               VARCHAR2(18)
 OBJECT_NAME                               NOT NULL VARCHAR2(30)
 OBJECT_TYPE                                        VARCHAR2(13)
 USAGE                                              VARCHAR2(11)
 USAGE_ID                                           NUMBER
 LINE                                               NUMBER
 COL                                                NUMBER
 USAGE_CONTEXT_ID                                   NUMBER

...如果您愿意,也可以选择 dba_ 或 user_ 版本。

快速演示:

alter session set PLSCOPE_SETTINGS='IDENTIFIERS:ALL';

create package my_types as
  type T_ASSOCIATIVE is table of number index by pls_integer;
  type T_TABLE_TYPE is table of number;
  type T_CURSOR_TYPE is ref cursor;
end my_types;
/

select name, type
from user_identifiers
where object_name = 'MY_TYPES'
and usage = 'DECLARATION'
and type != 'PACKAGE'
order by name;

NAME                           TYPE              
------------------------------ ------------------
T_ASSOCIATIVE                  INDEX TABLE       
T_CURSOR_TYPE                  REFCURSOR         
T_TABLE_TYPE                   NESTED TABLE      

您可能需要重新编译现有对象;通过重新创建它们或使用alter package 减少干扰:

alter session set PLSCOPE_SETTINGS='IDENTIFIERS:ALL';

alter package my_types compile;

【讨论】:

ORA-04043: 对象 user_plsql_types 不存在。 dba_, all_ 的此类错误 嗯,那您使用的是什么版本的 Oracle?我猜低于 12c? Oracle 数据库 11g 企业版版本 11.2.0.3.0 - 64 位生产。它在我的大学服务器上。 您是否启用了PL/Scope?你能在all_identifiers看到你需要的信息吗? 是的,我可以从all identifiers 获得所需的信息,但我忘了提,我还需要从我创建的包中获得信息,而我无法从@987654337 获得它@.

以上是关于如何获取有关给定包中声明的所有类型数据的信息的主要内容,如果未能解决你的问题,请参考以下文章

如何获取有关pyomo功能,方法等的信息/帮助

获取数据包中的所有层

如何在 Oracle 中获取有关索引和表所有者的信息?

java如何通过反射获取包中所有的类?

如何引用由 NPM 包中 tsc 的“声明”选项生成的 TypeScript .d.ts 文件中声明的类型?

如何在 pokeAPI 中获取有关 pokemon 的详细信息