我正在从事一个小型培训项目,该项目指导我创建一个包含关联数组的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类的示例来帮助我解决此问题吗?
答案 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包中的存储过程中。