Родной способ вытащить метаданные о пакетах, процедурах и функциях? - PullRequest
1 голос
/ 19 января 2012

Я хотел бы иметь возможность запросить у Oracle список открытых процедур и функций, принадлежащих пакету, что-то вроде:

select procedure_name from all_package_procedures where package_name = :my_package_name;

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

select parameter_name, in_or_out, parameter_type from all_function_parameters where function_name = :my_function_name;

Возможно ли это изначально?Если нет, кто-нибудь знает существующий код для достижения этой цели?

Ответы [ 2 ]

3 голосов
/ 19 января 2012

Вы можете запросить USER_OBJECTS & USER_PROCEDURES, чтобы получить список всех процедур и функций, относящихся к конкретному пакету

SELECT procedure_name
FROM   user_procedures
WHERE  object_id = (SELECT object_id
                    FROM   user_objects
                    WHERE  object_name = '<YOUR-PACKAGE-NAME>'
                           AND object_type = 'PACKAGE') 

Заменить user_objects & user_procedures на all_objects & all_procedures соответственно для получения пакетов и процедур, принадлежащих другим пользователям.


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

Для этого вы можете запросить user_arguments или all_arguments, чтобы получить параметры объекта, принадлежащего текущему пользователю и всем пользователям соответственно

SELECT argument_name,
       data_type
FROM   user_arguments
WHERE  package_name = '<name-of-your-package-procedure-function>' 
1 голос
/ 19 января 2012

Мой собственный ответ, полученный от Сатья, для ссылки других. Вот один запрос для извлечения денормализованного результата всех процедур и их аргументов для данного пакета:

select     p.procedure_name
         , a.argument_name
         , a.data_type
         , a.defaulted
         , a.default_value
         , a.in_out
         , a.position
from       all_procedures p
inner join all_objects o
        on o.object_id = p.object_id
inner join all_arguments a
        on a.package_name = o.object_name
       and a.object_name = p.procedure_name
where      o.object_type = 'PACKAGE'
and        o.object_name = 'PACKAGE_NAME'
order by   p.procedure_name, a.position;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...