首页 文章

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

提问于
浏览
9

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

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

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

2 回答

  • 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>';
    

    分享和享受 .

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

相关问题