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

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

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

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

【问题讨论】:

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


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 2023-04-11
      • 2013-08-01
      • 2012-03-15
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多