【发布时间】:2013-01-21 23:38:15
【问题描述】:
给定下表:
create table egyen (
id number not null,
tajszam varchar2(9),
nev varchar2(10),
primary key(id)
);
还有以下包:
create or replace package pck_egyen is
type egyentab is table of egyen%rowtype;
procedure list(ret$ out egyentab);
end pck_egyen;
/
create or replace package body pck_egyen is
procedure list(ret$ out egyentab) is
begin
ret$ := egyentab();
for rec in (select * from egyen) loop
ret$.extend;
ret$(ret$.count) := rec;
end loop;
end;
end pck_egyen;
/
有人可以为我提供一个使用 ODP.NET 11g 的工作 .NET 代码,它可以调用此存储过程,而无需以任何方式更改表或类型或包?我不知道如何设置 OracleParameter 来支持 pck_egyen.egyentab 类型...
我之前没有使用过UDT,我试了一下,但它无法识别包中嵌入的类型。全局类型不支持 %rowtype。好像我被卡住了。最初我想返回 ref 游标,就像一个魅力,但不是通过 dblink。太多愚蠢的限制。
【问题讨论】:
-
为什么不以任何方式更改包/过程的限制? rowtype 是一个 pl/sql 构造,并且不使用全局对象类型,不确定您希望 .NET 如何理解如何映射到 egyentab。跨 dblinks 使用表函数有一些变通方法,但坚持在这里没有任何改变可能最终不会得到最好的结果。
-
我必须使用存储过程跨 dblink 传输表行。 Refcursor 不能跨 dblink 工作。有数百个表和过程,所以没有 %rowtype,声明表类型是太多额外的工作。如果Oracle真的不支持调用这个过程,那会很痛苦,这是肯定的。
-
我想我要问的是你在这里的最终目标是什么?如果您必须跨 dblink 传输行,为什么还需要 .NET? (似乎是这样的:.NET 创建空对象 -> 调用 proc@db_A 填充 -> .NET -> 插入 db_B )。这是正确的吗?
-
.NET 和 dblink 不相关。我需要一个可以从.NET 调用的SP,也可以通过dblink 从其他存储过程调用。看起来嵌套表是我可以在 Oracle 中管理 dblink 的唯一方法,所以剩下的任务是从 .NET 调用相同的东西,因此是我的问题。
标签: .net oracle stored-procedures