【问题标题】:How to read UDT object into result query?如何将 UDT 对象读入结果查询?
【发布时间】:2020-08-11 01:38:13
【问题描述】:

我有一个具有许多属性的用户定义类型,如下所示:

create or replace type MyObject is object
(
    attribute 1,
    attribute 2,
    attribute 3
    ...
)

我有一个返回该对象的函数:

create or replace function GetMyObject
(...params...)
return MyObject
is
...

现在我尝试使用 Oracle.ManagedDataAccess.Client 从 C# 应用程序调用该函数。因为MyObject 不是C# 的已知类型,所以我尝试调用OracleCommand.ExecuteReader() 并从结果查询中一一读取属性值:

select GetMyObject(...) from dual;

我在 Oracle 中得到的是这张表:

    |    GetMyObject(...)   |
--------------------------------
 1  |  [UserName.MyObject]  |

相反,我希望得到这个:

    | attribute 1 | attribute 2 | attribute 3 | ...
------------------------------------------------------
 1  |   value 1   |   value 2   |   value 3   | ...

select 语句应该是什么样子的?

【问题讨论】:

    标签: c# oracle plsql user-defined-types oracle-manageddataaccess


    【解决方案1】:

    “对象”的全部意义在于它们是复合数据,被视为单个单元。这就是为什么你看到你所看到的。

    如果您想查看单个组件,您将需要SELECT 三列(或多列),而不是一列。要访问单个属性(每列一个),您必须使用“点”表示法。

    select GetMyObject(...).attribute1 as attribute1
         , GetMyObject(...).attribute2 as attribute2
    --   (etc.)
    from dual;
    

    显然,我假设您实际上在属性名称中没有空格。

    【讨论】:

    • 难道没有一些解包功能可以帮到我吗?我的应用程序中有很多这样的调用,并且遍历所有这些调用几乎是一个巨大的重写。我希望在 select 语句级别进行一些抽象。
    • @sanitizedUser - 我不明白你的问题。如果您有一个存储已创建对象的表,则语法要简单得多(实际上是最简单的)。我想您会使用该函数来创建对象,以便您可以将它们存储为已创建的对象,在这种情况下您不会在select 中调用该函数。另一方面,如果你真的需要在 SQL 中调用函数,为什么你有返回一个对象的函数,而不是返回其属性的单独函数?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多