提取有关包,程序和函数的元数据的本机方法?

时间:2012-01-19 10:23:46

标签: oracle metadata

我希望能够向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 个答案:

答案 0 :(得分:3)

您可以查询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&amp; user_proceduresall_objects&amp; all_procedures分别用来获取包&amp;其他用户拥有的程序。


  

我还希望能够向Oracle查询给定过程或函数的参数列表,

为此,您可以查询user_argumentsall_arguments以获取当前用户所拥有的对象的参数&amp;所有用户分别

SELECT argument_name,
       data_type
FROM   user_arguments
WHERE  package_name = '<name-of-your-package-procedure-function>' 

答案 1 :(得分:1)

我自己的答案,来自Sathyas,供其他人参考。这是一个单独的查询,用于为给定包提取所有过程及其参数的非规范化结果:

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;