让.NET在返回的REF_CURSOR中理解Oracle Objects

时间:2013-04-29 19:29:48

标签: c# .net oracle plsql

我遇到的问题是我试图将“嵌套对象”返回给cSharp程序但是.net很难理解返回的gettting数据。

以下是我在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的方法中将其展平,以便它似乎没有基础对象?

感谢。

1 个答案:

答案 0 :(得分:0)

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

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

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

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