让 .NET 了解返回的 REF_CURSOR 中的 Oracle 对象

Posted

技术标签:

【中文标题】让 .NET 了解返回的 REF_CURSOR 中的 Oracle 对象【英文标题】:Getting .NET to understand Oracle Objects in a returned REF_CURSOR 【发布时间】:2013-04-29 19:29:47 【问题描述】:

我遇到了一个问题,我试图将“嵌套对象”返回到 cSharp 程序,但 .net 难以理解返回的数据。

这是我在 Oracle 中的内容:

CREATE OR REPLACE TYPE TEST.OBJ_BASE_EVENT FORCE AS OBJECT
(
   prop1          number(10),
   prop2          number(5),
   prop3          varchar2(100)
)

CREATE OR REPLACE TYPE TEST.OBJ_EXTENDED_EVENT FORCE AS OBJECT
(
   base_event           TEST.OBJ_BASE_EVENT
   extended_prop1       number(15),
   extended_prop2       number(15)
)

CREATE OR REPLACE TYPE COM_API.TAB_EXTENDED_EVENT is table of TEST."OBJ_EXTENDED_EVENT"

这是来自 Oracle Proc 的一些代码:

 PROCEDURE Get_vents(xTbl OUT SYS_REFCURSOR) AS  

 cursor events is
select test.OBJ_EXTENDED_EVENT(test.OBJ_BASE_EVENT(prop1,prop2,prop3),
    extended_prop1, extended_prop2)
from test.test_table;


  event_tab     test.extended_event;

  BEGIN

  OPEN events;
  FETCH events BULK COLLECT
     INTO event_tab;
  CLOSE events;

  OPEN xTBL FOR
     SELECT *
       FROM TABLE(team_event_tab);

  END;

我可以从 pl/sql 运行它并查看结果。我会得到 ref_cursor 并且结果是正确的。 列确实返回为:

 obj_base_event.prop1
 obj_base_event.prop2
 obj_base_event.prop3
 extended_prop1     
 extended_prop2  

当我运行我的 cSharp 代码时。我收到以下错误。

“OCI-22303:未找到类型 TEST.OBJ_BASE_EVENT”。

它似乎看到了数据,但不知道如何处理作为 ref_cursor 一部分的对象。有什么方法可以让 .net 理解这个返回值,或者在 oracle 上将其展平,使其看起来没有基础对象?

谢谢。

【问题讨论】:

您的 Oracle PROCEDURE 声明是什么样的?在 C#/Oracle 中,当 proc 的签名类似于 PROCEDURE my_proc(retValue OUT SYS_REFCURSOR) 时,无论输出类型如何,我都非常幸运地返回了数据集。 您的 PL/SQL 代码有这样的结构吗?将一堆数据从表中提取到 PL/SQL 集合中只是为了将该集合传递回 SQL 引擎以创建游标通常没有什么意义。您是否有理由不只返回一个游标,该游标代表对 test_table 的查询,而没有任何对象或集合?如果您在填充集合和返回游标之间对集合进行大量操作,是否可以改用流水线表函数? 您运行的是什么版本的 ODP.NET? Oracle 发布了一个库来为您处理所有这些问题。你还在用那个库吗? 我使用的是 ODP.NET 2.112.1.0。我使用偶数对象的原因是为了在各种不同的过程中保持命名一致性,这些过程都返回相似但略有不同。我当然可以放弃这些对象,直接将选择返回给 .NET,但我想看看我在这里是否缺少一些简单的东西。 【参考方案1】:

看来我有办法了。

不要嵌套对象,而是使用 UNDER 关键字声明子对象。

 CREATE OR REPLACE TYPE TEST.OBJ_EXTENDED_EVENT UNDER TEST.OBJ_BASE_EVENT
 (
      extended_prop1       number(15),
      extended_prop2       number(15)
 )

现在在 select 语句中,您不必将自定义类型放入自定义类型中,您只需使用包含所有父属性的子自定义类型。

【讨论】:

以上是关于让 .NET 了解返回的 REF_CURSOR 中的 Oracle 对象的主要内容,如果未能解决你的问题,请参考以下文章

从另一个 PLSQL 函数调用 ref_cursor

在存储过程中使用“out”ref_cursor 调用 Oracle 存储过程

未知方言支持 REF_CURSOR 参数

在 Oracle PL/SQL 中对 ref_cursor 的 DISTINCT 计数

值得 .NET 开发者了解的15个特性

TOAD 显示存储过程返回的游标记录集