如何获取有关给定包中声明的所有类型数据的信息
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 获得它@.以上是关于如何获取有关给定包中声明的所有类型数据的信息的主要内容,如果未能解决你的问题,请参考以下文章