在C#中映射包含关联数组的Oracle UDT

时间:2019-06-17 14:41:14

标签: c# oracle data-mapping

我正在从事一个小型培训项目,该项目指导我创建一个包含关联数组的Oracle UDT。

数组定义如下:

create or replace TYPE TRNG_AUTHORS_TAB AS
    TABLE OF VARCHAR2(50) ;

然后,UDT如下使用它:

create or replace TYPE TRNG_BOOK_OBJ AUTHID DEFINER
    AS OBJECT
    (
        <SNIP normal variable mappings>
        AUTHORS TRNG_AUTHORS_TAB

    ) NOT FINAL;

现在,我将其映射到C#类。将TRNG_BOOK_OBJ映射为具有适当工厂的UDT。

但是,我无法弄清楚如何将关联数组映射为类的一部分。我曾尝试使用List或string [],但这些方法不起作用。

我的下一个想法是为TRNG_AUTHORS_TAB创建一个C#UDT类,然后可以将其映射到装饰有OracleArracyMapping属性的类,但是鉴于字符串,我不知道如何创建关联数组的UDT。其中包含的列没有要映射的名称。

任何人都可以通过给出如何将关联数组映射到List或C#数组,或如何将关联数组类型映射到C#UDT类的示例来帮助我解决此问题吗?

1 个答案:

答案 0 :(得分:0)

  

[关联]数组的定义如下:

create or replace TYPE TRNG_AUTHORS_TAB AS
   TABLE OF VARCHAR2(50) ;

这不是关联数组数据类型(也称为“按表索引”);它是一个集合数据类型,并且在SQL范围内定义。

关联数组仅在PL / SQL范围内可用,并且可以这样定义:

CREATE PACKAGE package_name AS
  TYPE STRING_MAP IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
END;
/

C#支持使用类似以下方式将关联数组传递给存储过程:

OracleParameter parameter = new OracleParameter();
parameter.ParameterName  = "YourParameterName";
parameter.OracleDbType   = OracleDbType.Varchar2;
parameter.Direction      = ParameterDirection.Input;
parameter.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
parameter.Value          = new String[5]{"a","b","c","d","e"};

C#不支持传递非关联数组。

如果要将集合(非关联数组)定义为用户定义类型(UDT)的成员,则必须使用中间步骤,即传递关联数组,然后使用PL / SQL在将其分配给UDT之前将其转换为一个集合。您可以将所有这些包装在PL / SQL包中的存储过程中。