Отображение Oracle UDT, содержащего ассоциативный массив в C # - PullRequest
0 голосов
/ 17 июня 2019

Я работаю над небольшим учебным проектом, который направил меня на создание 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 [], но они не сработали.

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

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

1 Ответ

0 голосов
/ 18 июня 2019

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

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 # делает NOT поддерживает передачу неассоциативных массивов.

Если вы хотите иметь коллекцию (aнеассоциативный массив), определенный как член пользовательского типа (UDT), тогда вам нужно будет использовать промежуточный шаг передачи ассоциативного массива и затем использовать PL / SQL для преобразования его в коллекцию, прежде чем присваивать его UDT,Вы можете поместить все это в хранимую процедуру в пакет PL / SQL.

...