【问题标题】:Oracle GetSchema() not returning package proceduresOracle GetSchema() 不返回包过程
【发布时间】:2016-04-13 22:55:19
【问题描述】:

我正在使用 GetSchema 从我的 Oracle 环境中加载过程列表,但是我只看到根过程,没有包过程。不过,通过查看文档,我看不出它们还能如何被退回。有谁知道是否有过滤器/限制来获取包 procs,还是我应该调用不同的对象类型?

Dim ObjectType= "Procedures"
Dim Options As String()

Dim ObjectsTable = OracleConnection.GetSchema(ObjectType, Options)

“包”结果示例

?RefinedPackageSchemaData(10)
Count = 12
    (0): {[OWNER, #REDACTED SCHEMA NAME#]}
    (1): {[OBJECT_NAME, #REDACTED PACKAGE NAME#]}
    (2): {[SUBOBJECT_NAME, ]}
    (3): {[OBJECT_ID, 130652]}
    (4): {[DATA_OBJECT_ID, ]}
    (5): {[LAST_DDL_TIME, 4/27/2015 3:52:26 PM]}
    (6): {[TIMESTAMP, 2015-04-27:15:52:26]}
    (7): {[STATUS, VALID]}
    (8): {[TEMPORARY, N]}
    (9): {[GENERATED, N]}
    (10): {[SECONDARY, N]}
    (11): {[CREATED, 1/9/2015 9:47:50 AM]}

行数正好对应包的数量,而不是包+程序的组合

“PackageBody”结果示例

 ?RefinedPackageBodySchemaData(10)
    Count = 12
        (0): {[OWNER, #REDACTED SCHEMA NAME#]}
        (1): {[OBJECT_NAME, #REDACTED PACKAGE NAME#]}
        (2): {[SUBOBJECT_NAME, ]}
        (3): {[OBJECT_ID, 130653]}
        (4): {[DATA_OBJECT_ID, ]}
        (5): {[LAST_DDL_TIME, 4/27/2015 4:19:44 PM]}
        (6): {[TIMESTAMP, 2015-04-27:16:19:44]}
        (7): {[STATUS, VALID]}
        (8): {[TEMPORARY, N]}
        (9): {[GENERATED, N]}
        (10): {[SECONDARY, N]}
        (11): {[CREATED, 1/9/2015 9:48:02 AM]}

行数正好对应包的数量,而不是包+程序的组合

MSDN Oracle GetSchema Reference

【问题讨论】:

  • 您不希望 ObjectType 为“Packages”吗?公共方法应该是subobject_name 值。
  • @JustinCave 在你的建议下我确实尝试过,但是我只得到相应的包,而不是包程序组合的完整列表

标签: .net oracle ado.net odp.net getschema


【解决方案1】:

看起来这样做的唯一方法是查询 Arguments 或 ProcedureParameters 架构,并对结果进行分组,丢弃实际的 Argument/Parameter 信息。

我是这样做的:

Dim ArgumentsSchemaData =
    GetSchemaDictionary(Connection, "Arguments", New String() {"#REDACTED SCHEMA NAME#"})

Dim GroupedArguments = (
    From ASD In ArgumentsSchemaData
    Let FullObjectName =
        String.Format("{0}.{1}", ASD("PACKAGE_NAME"), ASD("OBJECT_NAME"))
    Group ASD By FullObjectName Into ON_Group = Group
    Order By FullObjectName
    Select FullObjectName
    ).ToList

使用单独的辅助函数从 DataTable 转换为字典列表:

 Private Shared Function GetSchemaDictionary(
        ByRef Connection As IDbConnection,
        ByVal ObjectType As String,
        ByRef Options As String()
        ) As List(Of Dictionary(Of String, Object))

        Dim SchemaObjectsList = GetSchemaObjectsList(Connection, ObjectType, Options)

        Dim Columns = (
            From C In SchemaObjectsList.Columns
            Let ColumnName = C.ToString
            Select ColumnName
            ).ToList

        Return (
            From OL In SchemaObjectsList
            Select Columns.ToDictionary(
                Function(C) C,
                Function(C) OL.Item(C)
            )).ToList
    End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 2021-06-14
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多