Как получить информацию обо всех типах данных, объявленных в данном пакете - PullRequest
0 голосов
/ 24 сентября 2019

Используя информацию из представлений словаря данных, получите информацию обо всех типах данных, объявленных в данном пакете.

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;

не работаетНе может быть никакого результата, только тип пакета, но не типы, объявленные в этом пакете

1 Ответ

0 голосов
/ 24 сентября 2019

Вы можете видеть типы PL / SQL в all_plsql_types представлении

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 , вы можете извлечь эту информацию из представления all_identifiers :

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