检查Oracle数据库视图/系统表,如果一个包的给定部分是过程或函数
-
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 date
和PROCEDURE foo(varchar)
。只是名称匹配可能是不够的。
不隶属于 StackOverflow