使用 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 包中过程的存储过程元数据的主要内容,如果未能解决你的问题,请参考以下文章