odp.net 使用用户定义参数的输出参数运行 oracle 存储过程

Posted

技术标签:

【中文标题】odp.net 使用用户定义参数的输出参数运行 oracle 存储过程【英文标题】:odp.net run oracle stored procedure with output parameter of user defined parameter 【发布时间】:2013-10-03 19:39:07 【问题描述】:

这个过程有address_table out pkg.address_tab_type

create or replace
procedure hr.p_get_address
  (
    in_pid in number,
    address_table out pkg.address_tab_type
  )
as
  address_row pkg.address_rec_type;
  cursor address_cursor is 
    select
      addr.pid, addr.street, addr.city
    from
      hr.address addr
    where
      pid = in_pid;
begin
  row_count := 0;
  open address_cursor;
  loop
    fetch address_cursor into address_row;
    exit when address_cursor%NOTFOUND;
    row_count := row_count + 1;
    address_table(row_count) := address_row;
  end loop;
  close address_cursor;
end p_get_address;

我的 pkg 声明了自定义的 address_rec_type 和 address_tab_type:

create or replace
package hr.pkg as
  type address_rec_type is
    record
    (
      pid address.pid%type,
      street address.street%type,
      city address.city%type
    );
  type address_tab_type is
    table of address_rec_type index by binary_integer;
end hr.pkg;

当我在 SQL Developer 中执行我的存储过程时,一切工作文件。所以,我的过程。作品。我需要调用此过程并在 C# (ASP.NET) 中获取 address_table。我正在使用 odp.net。我可以用 refCursor 调用程序,工作正常。如何使用用户定义类型的输出参数调用过程?

【问题讨论】:

Passing Array parameter from C# to Oracle collection type of table的可能重复 不完全...我知道如何传递数组,但是如何处理来自 C# 中的存储过程的用户定义类型的返回 OUT 参数。那个问题。谢谢。 【参考方案1】:

您将无法将包定义的记录数据类型用作 ODP.NET 的参数。您可以使用数据库定义的类型(即使用 CREATE TYPE 语句定义),但回答如何做到这一点超出了您的问题范围。

因此,您的选择是创建数据库定义的类型(并学习如何使用 ODP.NET 的抽象数据类型 API 或将您的过程参数列表更改为分解包定义的记录数据类型的原始数据类型。

【讨论】:

如何做到这一点正是我要问的。我知道如何使用包或数据库定义类型在数据库中执行此操作,但我不知道如何处理 UDT 存储过程中的 OUT 参数。这就是我希望从本网站的用户那里得到的。 但这不是你上面的问题。 @user1863635 Michael 在回答问题时有点固执,因为“变色龙问题”可能会令人恼火,您花时间回答只是为了看到原件被编辑成一个完全不同的问题,或者您回答了您的意思,而其他用户抱怨您从未回答过原始问题。我怀疑你是否关心 8 年,但正确的行为应该是正确地重新提出问题并在正确的情况下接受这个问题。

以上是关于odp.net 使用用户定义参数的输出参数运行 oracle 存储过程的主要内容,如果未能解决你的问题,请参考以下文章

Oracle存储过程在SSRS查询设计器中不起作用

ODP.NET 过程编译

ORA-01017: 使用 ODP.NET 托管驱动程序连接到 9i oracle 数据库时用户名/密码无效

如何使用 ODP.Net 传递字节数组?

将 ODP.Net 与 NHibernate 与 .net System.decimal 一起使用

.NET Core 使用ODP.NET Core连接操作Oracle数据库