让.net在返回的REF_CURSOR中理解Oracle对象

本文关键字:Oracle 对象 CURSOR net 返回 REF | 更新日期: 2023-09-27 18:11:18

我遇到了一个问题,我试图返回一个"嵌套对象"到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程序的代码:

 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上有一种方法可以使它变平,所以它似乎没有基本对象?

谢谢。

让.net在返回的REF_CURSOR中理解Oracle对象

看来我有办法了。

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

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

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