2

我正在使用 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 中解析它。

4

3 回答 3

3

事实证明,有一个视图 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>'
于 2010-02-26T18:21:18.687 回答
0
SQL> select distinct object_type from user_procedures;

OBJECT_TYPE
-------------------
PROCEDURE
PACKAGE
TRIGGER
FUNCTION
于 2010-02-26T17:13:37.593 回答
0

我怀疑一个人将别无选择。至少它的格式很好——所有类型都以 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). 仅按名称匹配可能还不够。

于 2010-02-26T18:19:20.007 回答