最好用一个例子来解释这一点。给定以下数据库对象:
CREATE OR REPLACE PROCEDURE TEST_PROCEDURE IS
BEGIN
NULL;
END;
/
CREATE OR REPLACE FUNCTION TEST_FUNCTION RETURN NUMBER IS
BEGIN
RETURN NULL;
END;
/
CREATE OR REPLACE PACKAGE TEST_PACKAGE IS
PROCEDURE TEST_PROCEDURE;
FUNCTION TEST_FUNCTION RETURN NUMBER;
END TEST_PACKAGE;
/
CREATE OR REPLACE PACKAGE BODY TEST_PACKAGE IS
PROCEDURE TEST_PROCEDURE IS
BEGIN
NULL;
END;
FUNCTION TEST_FUNCTION RETURN NUMBER IS
BEGIN
RETURN NULL;
END;
END TEST_PACKAGE;
/
如果我们查询USER_PROCEDURES以获取未打包的子程序,我们会在OBJECT_TYPE列中报告它们的类型:
但是,如果我们查询包中的子程序,我们只能得到PACKAGE的OBJECT_TYPE,这并不是特别有用:
是否可以通过查询来找出实际类型,而无需执行诸如挖掘USER_SOURCE之类的操作?我查看了数据字典,但没有发现任何有用的信息。
感谢您的帮助!
最佳答案
与@collapsar类似的想法,但使用参数位置来区分过程和函数。除了从位置一开始的任何形式参数之外,函数在位置零处还有一个(未命名)参数。过程没有位置零参数。
select up.object_name, up.procedure_name,
case ua.position when 0 then 'FUNCTION' else 'PROCEDURE' end as type
from user_procedures up
left join user_arguments ua
on ua.object_id = up.object_id
and ua.subprogram_id = up.subprogram_id
and position = 0
where up.object_type = 'PACKAGE'
and up.object_name = 'TEST_PACKAGE'
and up.procedure_name is not null;
OBJECT_NAME PROCEDURE_NAME TYPE
------------------------------ ------------------------------ ---------
TEST_PACKAGE TEST_FUNCTION FUNCTION
TEST_PACKAGE TEST_PROCEDURE PROCEDURE
关于oracle - 如何确定Oracle包中子程序的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38742464/