2017-01-11 50 views
0

Можно ли вызвать хранимую процедуру с вложенным объектом в качестве параметра?C# Call Oracle Сохраненная процедура с вложенным UDT

Например, у меня есть класс Person, у которого есть экземпляр адреса.

Person p1 = new Person(); 
p1.Name  = "John"; 
p1.Address = new Adress{Street = “StackOverflow”, App = 3} 
p1.Age = 20; 

В базе данных я создал определенные пользователем типы и хранимой процедуры, которая принимает в качестве параметра person_type, который содержит address_type.

create or replace 
TYPE Person_TYPE AS OBJECT (
    Name  VARCHAR2(100), 
    Age  NUMBER, 
    OBJ_Address Adress_TYPE 
); 

В СП у меня есть:

function FC_Insert_Person (DATAINS Person_TYPE) 
    BEGIN 

     INSERT INTO Person (Name, Age) VALUES (DATAINS.Name, DATAINS.Age) 

    --insert into the nested object 
    FC_INSERT_Addrres (DATAINS.OBJ_Address); 
    /* in the adress sp I get the id of the person using an SEQ_PERSON_ID.CURRVAL; */ 

return ... 
end FC_Insert_Person; 

Все примеры кода, которые я нахожу только для простых объектов, или набор таблиц, так это заставляет меня спросить себя, если это будет возможно.

OracleParameter[] param = new OracleParameter[1]; 
       param[0] = new OracleParameter(my_type, OracleDbType.Object, ParameterDirection.Input); 
       param[0].UdtTypeName = "Person_TYPE"; 
       param[0].Value = p1; 
       dObj.ExecuteCommand("FC_Insert_Person", param); 
+1

Да. Используйте мастер настраиваемых классов, который является частью инструментов разработчика Oracle для Visual Studio. Пример Walkthough приведен здесь: http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/12c/r1/appdev/dotnet/userdefinedtypes/index.html –

+1

Обратите внимание, что не рекомендуется полагаться на UDT, если производительность важна (например, много данных передается). В этом случае вы должны сгладить объекты и использовать ассоциативные массивы ... или использовать временные таблицы. –

+0

Я согласен с вами, после нескольких дней поиска я обнаружил страницу оракула с помощью VS2013, которая автоматически генерирует классы UDT, но поскольку я использую VS2012 :(Я отказался. Но узнал, как вы упомянули, что это не будет самый эффективный способ делать вставки для больших объектов. Поэтому я буду указывать на основы: одну процедуру вставки одного типа. – GeorgesC

ответ

1

Да. Используйте мастер настраиваемых классов, который является частью инструментов разработчика Oracle для Visual Studio. Walkthough пример здесь:

http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/12c/r1/appdev/dotnet/userdefinedtypes/index.html

Обратите внимание, что не рекомендуется полагаться на пользовательских типов, если производительность имеет решающее значение (например, много данных передается). В этом случае вы должны сгладить объекты и использовать ассоциативные массивы ... или использовать временные таблицы.

 Смежные вопросы

  • Нет связанных вопросов^_^