2

我有一个存储过程,它具有嵌套表的几个参数。可以从ODP.NET调用具有嵌套表参数的Oracle存储过程吗?

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中不可访问的另一种类型的集合)。

回答

1

我做了它的工作是这样的:

  • 创建像数据库中的类型 “创建或替换TYPE NT_LNG为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"; 

好运

1

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

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

这里的演练,以帮助您开始使用的UDT一般:

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

相关问题