C# 使用嵌套的 UDT 调用 Oracle 存储过程
C# Call Oracle Stored Procedure with nested UDT
是否可以使用嵌套对象作为参数调用存储过程?
例如,我有一个 Person class,它有一个 Address 实例。
Person p1 = new Person();
p1.Name = "John";
p1.Address = new Adress{Street = “Whosebug”, 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
);
我在 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);
是的。使用自定义 class 向导,它是 Oracle Developer Tools for Visual Studio 的一部分。演练示例在这里:
请注意,如果性能至关重要(例如,正在传递大量数据),则不建议依赖 UDT。在那种情况下,您应该展平对象并使用关联数组……或使用临时表。
是否可以使用嵌套对象作为参数调用存储过程?
例如,我有一个 Person class,它有一个 Address 实例。
Person p1 = new Person();
p1.Name = "John";
p1.Address = new Adress{Street = “Whosebug”, 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
);
我在 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);
是的。使用自定义 class 向导,它是 Oracle Developer Tools for Visual Studio 的一部分。演练示例在这里:
请注意,如果性能至关重要(例如,正在传递大量数据),则不建议依赖 UDT。在那种情况下,您应该展平对象并使用关联数组……或使用临时表。