Отображение Oracle UDT, содержащего ассоциативный массив в C#

Я работаю над небольшим учебным проектом, который поручил мне создать UDT Oracle, содержащий ассоциативный массив.

Массив определяется следующим образом:

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;

Теперь я сопоставляю это с классом С#. TRNG_BOOK_OBJ отображается как UDT с соответствующей фабрикой.

Однако я не могу понять, как отобразить ассоциативный массив как часть класса. Я пытался использовать список или строку [], но это не сработало.

Моя следующая мысль — создать класс C# UDT для TRNG_AUTHORS_TAB, который я затем могу сопоставить с классом, украшенным атрибутом OracleArracyMapping, но я не могу понять, как создать UDT ассоциативного массива, учитывая, что строковый столбец, содержащийся внутри у него нет имени для сопоставления.

Может ли кто-нибудь помочь мне решить эту проблему, либо предоставив примеры того, как сопоставить ассоциативный массив с массивом списка или С#, либо как сопоставить тип ассоциативного массива с классом UDT С#?


person Jeff    schedule 17.06.2019    source источник
comment
Возможный дубликат stackoverflow.com/questions/50485294/   -  person MT0    schedule 17.06.2019
comment
@MT0 Да, не совсем. Это не имеет ничего общего с сопоставлением ассоциативного массива с UDT, это просто передача ассоциативного массива в качестве параметра.   -  person Jeff    schedule 17.06.2019
comment
Это не ассоциативный массив; TABLE OF <type> — это коллекция. TABLE OF <type> INDEX BY <type> — это ассоциативный массив, который поддерживается только в рамках PL/SQL. Если что-то не изменилось совсем недавно в С#, вы не можете передать массив в коллекцию, поскольку он не поддерживается; вам нужно фактически использовать ассоциативный массив PL/SQL.   -  person MT0    schedule 17.06.2019
comment
AUTHID DEFINER используется по умолчанию, поэтому вы можете его пропустить.   -  person Wernfried Domscheit    schedule 17.06.2019


Ответы (1)


[ассоциативный] массив определяется следующим образом:

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.

person MT0    schedule 18.06.2019