2

我有一个存储过程,其中包含几个嵌套表参数。

CREATE TYPE FOO_ARRAY AS TABLE OF NUMBER;
CREATE TYPE BAR_ARRAY AS TABLE OF INTEGER;

CREATE PROCEDURE Blah(
  iFoos IN FOO_ARRAY,
  iBars IN BAR_ARRAY,
  oResults OUT SOMECURSORTYPE
) AS
BEGIN
  OPEN oResults FOR
    SELECT *
    FROM SomeTable T
    JOIN TABLE(iFoos) foos ON foos.column_value = T.foo
    JOIN TABLE(iBars) bars ON bars.column_value = T.bar;    
END

使用 ODP.NET (Oracle.DataAccess.dll),有没有办法调用这个存储过程并将数组传递给这些参数?我发现传递数组的唯一方法是参数类型是关联数组(SQL 中无法访问的不同类型的集合)。

4

2 回答 2

1

Oracle 还提供了一个免费工具来生成映射到嵌套表类型的自定义 .NET 类:

下载“Oracle Developer Tools for Visual Studio”(免费),打开服务器资源管理器,打开“用户定义类型”节点,找到您的用户定义类型,右键单击并选择“生成自定义类”。

下面是一个让您开始使用 UDT 的演练:

http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/hol08/dotnet/udt/udt_otn.htm

于 2011-04-06T14:07:33.533 回答
1

我让它这样工作:

  • 在数据库中创建一个类型,如“create or replace TYPE NT_LNG IS TABLE OF varchar(2);”
  • 创建一个实现 IOracleCustomType 和 INullable 的类 (SimpleStringArray)
  • 创建一个实现 IOracleCustomTypeFactory (SimpleStringArrayFactory) 的类。使用此属性“[OracleCustomTypeMappingAttribute("KNL.NT_LNG")]”标记它

然后你像这样传递参数:

 SimpleStringArray sa1 = new SimpleStringArray();
 sa1.Array = new String[]{"aaa","bbb"};
 OracleParameter param = new OracleParameter("p_lngsrc", OracleDbType.Array, sa1, ParameterDirection.Input);
 param.UdtTypeName = "KNL.NT_LNG";

祝你好运

于 2011-04-06T07:43:39.313 回答