使用ADO.NET获取Oracle包中的过程的存储过程元数据

时间:2010-05-18 13:39:10

标签: oracle stored-procedures ado.net metadata packages

我正在尝试使用标准ADO.NET API - DbConnection.GetSchema调用获取Oracle包中声明的过程的存储过程元数据(过程名称,参数类型,参数名称等)。我正在使用ODP驱动程序。

我看到Package列在'Packages'和'PackageBodies'元数据集合中。过程参数显示在“参数”和“过程参数”集合中。我没有看到通过包元数据获取过程信息的方法。即使该过程没有任何参数,此过程的'ProcedureParameters'集合中也有一行。

我的问题:要获取过程元数据,我是否必须查询'ProcedureParameters'集合并搜索具有所需包名称的条目?然后,我可以根据参数信息构建过程元数据。是否有更短或更快的方式来获取相同的信息?

2 个答案:

答案 0 :(得分:15)

我不确定如何使用ADO.NET获得此功能,但您可以直接查询数据库以获取此信息,如下所示:

SELECT *
  FROM SYS.DBA_PROCEDURES
  WHERE OBJECT_TYPE = 'PACKAGE' AND
        OBJECT_NAME = '<your package name here>' AND
        PROCEDURE_NAME IS NOT NULL;

运行上述查询后,您将拥有一个结果集,其中包含PROCEDURE_NAME。根据包名称和PROCEDURE_NAME,您可以使用以下查询找到参数信息:

SELECT *
  FROM SYS.ALL_ARGUMENTS
  WHERE PACKAGE_NAME = '<your package name here>' AND
        OBJECT_NAME = '<PROCEDURE_NAME from query above>';

分享并享受。

答案 1 :(得分:8)

在Bob的帮助下,我使用了以下查询来获取包中定义的存储过程列表。

SELECT a.OBJECT_NAME,p.PROCEDURE_NAME FROM SYS.ALL_OBJECTS a, SYS.ALL_PROCEDURES p WHERE a.OBJECT_NAME = p.OBJECT_NAME AND a.OBJECT_TYPE = 'PACKAGE' AND a.OWNER = '" + ownerName + "' AND p.PROCEDURE_NAME IS NOT NULL"

这将返回特定用户的所有存储过程。然后我可以使用'ProcedureParameters'集合来获取它们的参数信息。

注意:不要查询SYS.DBA_PROCEDURES表。用于执行查询的用户凭据可能没有该表的“选择”权限。