以Oracle软件包的形式获取存储过程

问题描述

我们调用以下命令在oracle中获取所有存储过程:

select object_name from user_procedures

对于每个存储过程,我们调用以下命令获取所有参数:

select object_name,argument_name,data_type,default_value,in_out,data_length,data_precision,data_scale,char_length from user_arguments order by POSITION

如果存储过程不在软件包中,那将非常有用。但是,如果它们在软件包中,则第一个选择将为每个存储过程返回软件包名称,而不是存储过程名称

对于存储过程在软件包中的情况,我们可以调用哪种方法获取所有存储过程?最好是返回一个内部包和独立包的所有名称调用

解决方法

但是,它们 恰好是您一直在寻找的位置... user_procedures。只是对象名称不是过程,而是程序包名称。

SQL> create package pkg_test as
  2    procedure p_test;
  3    function f_test return number;
  4  end;
  5  /

Package created.

SQL> select procedure_name
  2  from user_procedures
  3  where object_name = 'PKG_TEST';

PROCEDURE_NAME
------------------------------
F_TEST
P_TEST


SQL>

如果程序是公开的,那就很好,也就是说,它们是在程序包 specification 中命名的。如果它们是该包的私有文件,那么-恐怕-找到该信息并不容易。也许通过解析USER_SOURCE,搜索procedure字符串...

P.S。正如@Sayan所评论的那样,我在私有过程方面是错的-在这种情况下,PL/Scope会有所帮助。