oracle - 如何确定Oracle包中子程序的类型

标签 oracle plsql oracle11g

最好用一个例子来解释这一点。给定以下数据库对象:

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列中报告它们的类型:

但是,如果我们查询包中的子程序,我们只能得到PACKAGEOBJECT_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/

相关文章:

database - 当用户在事务完成之前关闭浏览器选项卡/窗口时,数据库 session 会发生什么情况?

SQL:将查询输出更改为具有两个单独的列,而不是具有 2 个值的行

oracle - 我们能否找到哪个表导致ORA-00942表或 View 不存在。 :

java - Oracle 数据库列数据显示额外的十进制值

php - 将数据库从oracle导出到mysql

database - 具有不同 SID 的 Oracle 导出数据库

java - Criteria查询月份和年份过滤器

oracle - 在 PL/SQL 中将逗号分隔的字符串转换为数组

java - 如何从 Java 调用的管道函数捕获 PL/SQL 错误

JAVA/Oracle SQL 因阻塞而挂起