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

Posted

技术标签:

【中文标题】使用 ADO.NET 获取 Oracle 包中过程的存储过程元数据【英文标题】:Obtain stored procedure metadata for a procedure within an Oracle package using ADO.NET 【发布时间】:2011-02-20 21:55:48 【问题描述】:

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

我看到包列在“包”和“包体”元数据集合中。过程参数出现在“Arguments”和“ProcedureParameters”集合中。我看不到通过包元数据获取过程信息的方法。即使该过程没有任何参数,该过程的“ProcedureParameters”集合中也有一行。

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

【问题讨论】:

【参考方案1】:

我不确定您如何使用 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>';

分享和享受。

【讨论】:

谢谢。我稍微修改了查询以获取 sps 列表。 SYS.DBA_PROCEDURES 中没有“OBJECT_TYPE”列。我正在使用 ORACLE 10.2.0.1.0【参考方案2】:

在 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 表。您用于执行查询的用户凭据可能没有对该表的“选择”权限。

【讨论】:

以上是关于使用 ADO.NET 获取 Oracle 包中过程的存储过程元数据的主要内容,如果未能解决你的问题,请参考以下文章

ADO.NET操作Oracle问题

ADO.NET 实体框架 - 带有实体框架 6 的 Oracle

ado.NET 通过字段和表名从数据读取器获取字段

要安装啥 Oracle ADO.NET 连接器?

从 PHP 调用 Oracle 包中存在的函数/过程

ado.net如何连接 oracle?