Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 让.NET理解返回的引用游标中的Oracle对象_C#_.net_Oracle_Plsql - Fatal编程技术网

C# 让.NET理解返回的引用游标中的Oracle对象

C# 让.NET理解返回的引用游标中的Oracle对象,c#,.net,oracle,plsql,C#,.net,Oracle,Plsql,我遇到了一个问题,我试图将嵌套对象返回到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_E

我遇到了一个问题,我试图将嵌套对象返回到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_光标,结果是正确的。 这些列的返回形式如下:

 obj_base_event.prop1
 obj_base_event.prop2
 obj_base_event.prop3
 extended_prop1     
 extended_prop2  
当我运行cSharp代码时。我得到以下错误

OCI-22303:未找到类型测试.OBJ_基本事件

它似乎看到了数据,但不知道如何处理作为ref_光标一部分的对象。有没有办法使.net低于此返回值,或者在oracle上有没有办法使其平坦化,使其看起来没有基本对象


谢谢。

看来我有办法了

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

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

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

Oracle过程声明是什么样子的?在C/Oracle中,当进程的签名类似于过程my_procretValue OUT SYS_REFCURSOR时,无论输出类型如何,我都很幸运地返回了数据集。PL/SQL代码的结构是这样的,有什么原因吗?通常,将一组数据从表中拉入PL/SQL集合,只是为了将该集合传递回SQL引擎以创建游标,这没有什么意义。您是否有理由不只是返回一个表示对test_表的查询的游标,而不返回任何对象或集合?如果在填充集合和返回游标之间对集合进行大量操作,是否可以改用流水线表函数?您正在运行哪个版本的ODP.NET?Oracle发布了一个库来为您处理所有这些。你在用那个库吗?我在用ODP.NET2.112.1.0。我之所以使用偶数对象,是为了在各种不同的进程之间保持命名一致性,这些进程都返回相似但略有差异的结果。我当然可以抛弃这些对象,直接选择返回到.NET,但我想看看这里是否缺少一些简单的东西。