0

我正在从事一个小型培训项目,该项目指导我创建一个包含关联数组的 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 类?

4

1 回答 1

0

[associative] 数组定义如下:

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 包中的存储过程中。

于 2019-06-18T08:51:22.837 回答