0

我遇到了一个问题,我试图将“嵌套对象”返回给 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 上将其展平,使其看起来没有基础对象?

谢谢。

4

1 回答 1

0

看起来我有一个解决方案。

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

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

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

于 2013-04-30T19:19:50.033 回答