【问题标题】:Can an Oracle stored procedure that has a nested table parameter be called from ODP.NET?可以从 ODP.NET 调用具有嵌套表参数的 Oracle 存储过程吗?
【发布时间】:2011-04-05 19:22:53
【问题描述】:

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

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 中无法访问的不同类型的集合)。

【问题讨论】:

    标签: stored-procedures parameter-passing odp.net nested-table


    【解决方案1】:

    我是这样设计的:

    • 在数据库中创建一个类型,例如“创建或替换 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";
    

    祝你好运

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-01-24
        • 2011-11-13
        • 2013-01-21
        • 1970-01-01
        • 1970-01-01
        • 2017-05-25
        • 2015-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多