Как прочитать объект UDT в результате запроса? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть определенный пользователем тип со многими атрибутами, например:

create or replace type MyObject is object
(
    attribute 1,
    attribute 2,
    attribute 3
    ...
)

У меня есть функция, которая возвращает этот объект:

create or replace function GetMyObject
(...params...)
return MyObject
is
...

Теперь я пытаюсь вызвать эту функцию из C# приложение, использующее Oracle.ManagedDataAccess.Client. Поскольку MyObject не известен тип C#, я пытаюсь вызвать OracleCommand.ExecuteReader() и прочитать значения атрибутов из запроса результата один за другим:

select GetMyObject(...) from dual;

Что я получаю в Oracle эта таблица:

    |    GetMyObject(...)   |
--------------------------------
 1  |  [UserName.MyObject]  |

Вместо этого я ожидаю получить это:

    | attribute 1 | attribute 2 | attribute 3 | ...
------------------------------------------------------
 1  |   value 1   |   value 2   |   value 3   | ...

Как должен выглядеть оператор выбора?

1 Ответ

1 голос
/ 27 апреля 2020

Смысл «объектов» в том, что они представляют собой составные данные, которые обрабатываются как отдельные единицы. Вот почему вы видите то, что видите.

Если вы хотите увидеть отдельные компоненты, вам потребуется SELECT три столбца (или сколько угодно), а не один. И для доступа к отдельным атрибутам, по одному на столбец, вы должны использовать «точечную» запись.

select GetMyObject(...).attribute1 as attribute1
     , GetMyObject(...).attribute2 as attribute2
--   (etc.)
from dual;

Очевидно, я предполагаю, что у вас фактически не было пробелов в именах атрибутов.

...