2017-01-11 53 views
0

是否可以使用嵌套對象作爲參數調用存儲過程?C#使用嵌套UDT調用Oracle存儲過程

例如我有一個人類有一個地址實例。

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

在我已創建的用戶自定義類型的數據庫,和存儲的過程,它接受作爲參數包含一個address_type一個person_type。

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

在SP我:

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

是的。使用屬於Visual Studio的Oracle Developer Tools一部分的自定義類嚮導。 Walkthrough示例位於以下位置:http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/12c/r1/appdev/dotnet/userdefinedtypes/index.html –

+1

請注意,如果依賴UDT,建議不要採用if性能至關重要(例如大量數據正在通過)。在這種情況下,你應該扁平化對象並使用關聯數組......或使用臨時表。 –

+0

我同意你,經過幾天的搜索後,我發現了使用VS2013的oracle頁面,它自動生成了UDT類,但是當我使用VS2012 :(我已經放棄了。但是當你提到這不會是最有效的方法來插入大對象,所以我會打勾的基本知識:一種類型的插入過程。 – GeorgesC

回答