检查Oracle数据库视图/系统表,如果一个包的给定部分是过程或函数

StackOverflow https://stackoverflow.com/questions/2343401

  •  23-09-2019
  •  | 
  •  

我使用的是甲骨文系统表,以获取有关的一些元数据包在我们的数据库。

下面是我的查询中的一个:

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解析它

有帮助吗?

解决方案

事实证明,有一种观点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>'

其他提示

SQL> select distinct object_type from user_procedures;

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

我怀疑一个不会有任何选择。至少它的良好的格式化 - 所有类型开始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 datePROCEDURE foo(varchar)。只是名称匹配可能是不够的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top