Oracle db view / системная таблица, чтобы проверить, является ли данная часть пакета процедурой или функцией - PullRequest
2 голосов
/ 26 февраля 2010

Я использую системные таблицы Oracle , чтобы получить некоторые метаданные о пакетах в нашей базе данных.

Вот один из моих запросов:

select AP.PROCEDURE_NAME
  from ALL_PROCEDURES ap
 where ap.object_name = :object_name
   and ap.owner=:owner
   and ap.procedure_name is not NULL
   and ap.procedure_name like :procedure_name

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

Обратите внимание: Я не хочу разбирать его из all_sources.

Ответы [ 3 ]

3 голосов
/ 26 февраля 2010

Оказывается, есть представление all_arguments, где вы можете получить все параметры для метода в пакете. Когда метод является функцией, существует аргумент с нулевым именем, представляющим возвращаемое значение. Поэтому, если вы присоединяетесь к all_arguments, вы можете определить, является ли данная запись all_procedures функцией или процедурой. Ниже приведен пример, показывающий такой выбор.

select CASE (Select count(*) from ALL_ARGUMENTS aa 
                       where aa.object_name=ap.procedure_name
                         and aa.object_id = ap.object_id 
                         and argument_name is null)
         WHEN 1 THEN 'FUNCTION'
         WHEN 0 THEN 'PROCEDURE'
         ELSE ''
       END as is_function, ap.*
  from all_procedures ap
 where ap.object_name like '<package name>'
0 голосов
/ 26 февраля 2010

Я подозреваю, что у кого-то не будет выбора. По крайней мере, он хорошо отформатирован - все типы начинаются с TYPE и т. Д.

Вы можете использовать SQL * Plus и команду DESC, которая работает с пакетами:

SQL> desc dbms_application_info;
PROCEDURE READ_CLIENT_INFO
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 CLIENT_INFO                    VARCHAR2                OUT
PROCEDURE READ_MODULE
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 MODULE_NAME                    VARCHAR2                OUT
 ACTION_NAME                    VARCHAR2                OUT
PROCEDURE SET_ACTION
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 ACTION_NAME                    VARCHAR2                IN
PROCEDURE SET_CLIENT_INFO
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 CLIENT_INFO                    VARCHAR2                IN
PROCEDURE SET_MODULE
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 MODULE_NAME                    VARCHAR2                IN
 ACTION_NAME                    VARCHAR2                IN
PROCEDURE SET_SESSION_LONGOPS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 RINDEX                         BINARY_INTEGER          IN/OUT
 SLNO                           BINARY_INTEGER          IN/OUT
 OP_NAME                        VARCHAR2                IN     DEFAULT
 TARGET                         BINARY_INTEGER          IN     DEFAULT
 CONTEXT                        BINARY_INTEGER          IN     DEFAULT
 SOFAR                          NUMBER                  IN     DEFAULT
 TOTALWORK                      NUMBER                  IN     DEFAULT
 TARGET_DESC                    VARCHAR2                IN     DEFAULT
 UNITS                          VARCHAR2                IN     DEFAULT

Итерируя по пакетам и анализируя результаты - разбирать структуру проще, чем DBA_SOURCE - вы можете получить то, что хотите. Предостережение, чтобы помнить; пакеты поддерживают перегрузку, поэтому вы можете иметь как FUNCTION foo(date) RETURN date, так и PROCEDURE foo(varchar). Совпадение только по имени может быть недостаточно.

0 голосов
/ 26 февраля 2010
SQL> select distinct object_type from user_procedures;

OBJECT_TYPE
-------------------
PROCEDURE
PACKAGE
TRIGGER
FUNCTION
...