Oracle db view/system table 检查包的给定部分是过程还是函数
Posted
技术标签:
【中文标题】Oracle db view/system table 检查包的给定部分是过程还是函数【英文标题】:Oracle db view/system table to check if given part of a package is a Procedure or a Function 【发布时间】:2010-02-26 17:11:18 【问题描述】:我正在使用 Oracle system tables 来获取有关我们数据库中包的一些元数据。
这是我的一个疑问:
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 中解析它。
【问题讨论】:
【参考方案1】:原来有一个视图 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>'
【讨论】:
除了一个空参数名,函数的返回值的位置为0。【参考方案2】:SQL> select distinct object_type from user_procedures;
OBJECT_TYPE
-------------------
PROCEDURE
PACKAGE
TRIGGER
FUNCTION
【讨论】:
【参考方案3】:我怀疑人们别无选择。至少它的格式很好——所有类型都以 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)
。仅按名称匹配可能还不够。
【讨论】:
以上是关于Oracle db view/system table 检查包的给定部分是过程还是函数的主要内容,如果未能解决你的问题,请参考以下文章
一个Oracle添加索引造成其他用户对此表的查询权限丢失的案例
一个Oracle添加索引造成其他用户对此表的查询权限丢失的案例
oracle中user_tab_cols和user_tab_columns区别