2017-01-11 5 views
0

Ist es möglich, eine gespeicherte Prozedur mit einem verschachtelten Objekt als Parameter aufzurufen?C# Oracle gespeicherte Prozedur mit verschachtelten UDT aufrufen

Zum Beispiel habe ich eine Person-Klasse, die eine Address-Instanz hat.

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

In der Datenbank habe ich die benutzerdefinierte Typen erstellt haben, und die gespeicherte Prozedur, die einen person_type als Parameter annimmt, die eine address_type enthält.

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

Im SP ich habe:

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; 

Alle Code-Beispiele, die ich für einfache Objekte nur finden, oder eine Sammlung von Tabellen so das macht mich frage mich, ob dies möglich sein wird.

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

Ja. Verwenden Sie den benutzerdefinierten Klassenassistenten, der Teil der Oracle Developer Tools für Visual Studio ist. Walkthough Beispiel ist hier: http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/12c/r1/appdev/dotnet/userdefinedtypes/index.html –

+1

Beachten Sie, dass es nicht ratsam ist, auf UDTs zu vertrauen, wenn Leistung ist kritisch (z. B. viele Daten werden übergeben). In diesem Fall sollten Sie die Objekte reduzieren und assoziative Arrays verwenden ... oder temporäre Tabellen verwenden. –

+0

Ich stimme dir zu, nach einigen Tagen der Suche fand ich die Orakel-Seite mit VS2013, die automatisch generiert die UDT-Klassen, aber wie ich VS2012 :(Ich habe aufgegeben. Aber herausgefunden, wie Sie erwähnt, dass dies nicht die sein wird Dies ist die effizienteste Methode, um Einfügungen für große Objekte durchzuführen, also gehe ich zu den Grundlagen über: Eine Einfüge-Prozedur vom Typ Eins. – GeorgesC

Antwort

1

Ja. Verwenden Sie den benutzerdefinierten Klassenassistenten, der Teil der Oracle Developer Tools für Visual Studio ist. Ein walkthough Beispiel ist hier:

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

Beachten Sie, dass es nicht ratsam ist, auf UDTs zu verlassen, wenn die Leistung kritisch ist (zB viele Daten übergeben wird). In diesem Fall sollten Sie die Objekte reduzieren und assoziative Arrays verwenden ... oder temporäre Tabellen verwenden.

Verwandte Themen