1

我正在使用 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 参考

4

1 回答 1

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
于 2016-04-14T17:27:00.427 回答