C# 让.NET理解返回的引用游标中的Oracle对象
我遇到了一个问题,我试图将嵌套对象返回到cSharp程序,但是.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
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,但我想看看这里是否缺少一些简单的东西。