Получение определения объекта программирования ORACLE - PullRequest
4 голосов
/ 05 мая 2010

Допустим, у меня есть схема ORACLE с пакетом. Этот пакет определяет типы, функции, процедуры и т. Д .:

CREATE PACKAGE...
  DECLARE 
  FUNCTION ...
  PROCEDURE ...
END;

Могу ли я выполнить запрос, чтобы получить определения этих отдельных объектов без упаковочного пакета?

Ответы [ 2 ]

4 голосов
/ 05 мая 2010

Если вам нужны процедуры / функции пакета, вы можете использовать user_procedures:

Create Package package_test As
  Procedure dummy( x In Number );
  Function dummy2 Return Number;
End package_test;

Выберите имя_объекта, имя_процесса Из user_procedures Где имя_объекта = 'PACKAGE_TEST';

возвращает

PACKAGE_TEST    DUMMY
PACKAGE_TEST    DUMMY2
PACKAGE_TEST    

Чтобы получить параметры, выберите из user_arguments.


Если вам нужен код для ваших пакетов / процедур / функций, используйте user_source для объектов вашего пользователя, all_source для объектов, для которых у пользователя есть права, и dba_source для всех объектов :

Select *
From user_source
Where name = 'YOUR_TEST'
And type = 'PROCEDURE';

Если вы создали процедуру your_test до:

Create Procedure your_test As
Begin
  dbms_output.put_line('test');
End your_test;

возвращается

YOUR_TEST  PROCEDURE  1  Procedure your_test As
YOUR_TEST  PROCEDURE  2  Begin
YOUR_TEST  PROCEDURE  3    dbms_output.put_line('test');
YOUR_TEST  PROCEDURE  4  End your_test; 
0 голосов
/ 05 мая 2010

Из словаря данных можно извлечь сигнатуры отдельных методов. Соответствующее представление - USER / ALL / DBA_ARGUMENTS.

Есть пара препятствий, на которые стоит обратить внимание. Если аргумент имеет позицию 0, это возвращаемое значение функции, а не параметр. Если параметр является сложным типом (например, вложенная таблица или запись PL / SQL), он будет отображаться несколько раз, причем каждый слой будет увеличивать значение data_level.

Следующий запрос объединяет аргументы с их собственными процедурами. Я исключаю записи в USER_PROCEDURES на уровне пакета (то есть subprogram_id=0) и записи в USER_ARGUMENTS для более низких уровней complex_type (то есть data_level > 0). Запрос также обрабатывает процедуры без каких-либо параметров.

SQL> select o.object_type
  2          , case
  3                when o.object_type in ( 'PACKAGE', 'TYPE') then p.object_name
  4                else null
  5            end as object_name
  6          , case
  7                when o.object_type in ( 'PACKAGE', 'TYPE') then p.procedure_name
  8                else p.object_name
  9            end as procedure_name
 10          , case
 11               when a.position != 0 then a.argument_name
 12               when a.position = 0 then '** return value **'
 13               else null
 14            end as argument_name
 15          , a.data_type
 16  from user_arguments a
 17       , user_procedures p
 18       , user_objects o
 19  where o.object_type in ( 'PACKAGE', 'TYPE', 'FUNCTION', 'PROCEDURE')
 20  and   p.object_name = o.object_name
 21  and   p.subprogram_id != 0
 22  and   a.object_id (+) = p.object_id
 23  and   a.subprogram_id (+) = p.subprogram_id
 24  and   a.data_level(+) = 0
 25  order by o.object_type, o.object_name, p.subprogram_id, a.position
 26  /

OBJECT_TYPE         OBJECT_NAME                    PROCEDURE_NAME                 ARGUMENT_NAME          DATA_TYPE
------------------- ------------------------------ ------------------------------ ------------------------------ -------
FUNCTION                                           COMPARE_OBJECTS                ** return value **     PL/SQL BOOLEAN
FUNCTION                                           COMPARE_OBJECTS                OBJ1                   UNDEFINED
FUNCTION                                           COMPARE_OBJECTS                OBJ2                   UNDEFINED
FUNCTION                                           GET_EMPS                       ** return value **     REF CURSOR
FUNCTION                                           GET_EMPS                       P_ARGS                 UNDEFINED
FUNCTION                                           STR_TO_NUMBER_TOKENS           ** return value **     TABLE
FUNCTION                                           STR_TO_NUMBER_TOKENS           P_STRING               VARCHAR2
FUNCTION                                           STR_TO_NUMBER_TOKENS           P_SEPARATOR            VARCHAR2
PACKAGE             P23                            POP_ARRAY                      ** return value **     TABLE
PACKAGE             P23                            POP_ARRAY                      P_NO                   NUMBER
PACKAGE             P23                            INS_TABLE                      P_ARRAY                TABLE
PROCEDURE                                          CHANGE_EMP_SAL                 P_ENO                  NUMBER
PROCEDURE                                          CHANGE_EMP_SAL                 P_NEW_SAL              NUMBER
PROCEDURE                                          PRINTE
TYPE                NEW_EMP                        EQUALS                         ** return value **     RAW
TYPE                NEW_EMP                        EQUALS                         SELF                   OBJECT

22 rows selected.

SQL>

Я мог бы выбрать другую полезную информацию из USER_ARGUMENTS, например, IN_OUT или параметр DEFAULTED, но я подумал, что он уже достаточно прокручен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...