【问题标题】:C# Call Oracle Stored Procedure with nested UDTC# 使用嵌套 UDT 调用 Oracle 存储过程
【发布时间】:2017-05-25 23:40:24
【问题描述】:

是否可以调用以嵌套对象为参数的存储过程?

例如,我有一个 Person 类,它有一个 Address 实例。

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);

【问题讨论】:

  • 是的。使用自定义类向导,它是 Oracle Developer Tools for Visual Studio 的一部分。演练示例在这里:oracle.com/webfolder/technetwork/tutorials/obe/db/12c/r1/appdev/…
  • 请注意,如果性能至关重要(例如,正在传递大量数据),则不建议依赖 UDT。在这种情况下,您应该展平对象并使用关联数组...或使用临时表。
  • 我同意你的观点,经过几天的搜索,我发现使用 VS2013 的 oracle 页面会自动生成 UDT 类,但是当我使用 VS2012 时:( 我已经放弃了。但是发现了你提到这不是对大对象进行插入的最有效方法。所以我会打勾:一种类型的插入过程。

标签: c# oracle stored-procedures data-access-layer odp.net


【解决方案1】:

是的。使用自定义类向导,它是 Oracle Developer Tools for Visual Studio 的一部分。这里有一个演练示例:

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

请注意,如果性能至关重要(例如,正在传递大量数据),则不建议依赖 UDT。在这种情况下,您应该展平对象并使用关联数组......或使用临时表。

【讨论】:

    猜你喜欢
    • 2017-08-26
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多