【问题标题】:Oracle Stored Procedure and custom data typeOracle 存储过程和自定义数据类型
【发布时间】:2011-05-05 04:17:02
【问题描述】:

我有一个 Oracle 存储过程,它接受两个参数:一个自定义数据类型和一个字符串。

在Oracle中调用存储过程,我会做以下事情:

EXECUTE MY_STORED_PROCEDURE(MYTYPE_T(99, 231), 'mystring')

如何使用 C# 执行此操作?我知道我需要将命令设置为存储过程,但是如何将第一个参数指定为自定义数据类型?

更新:

MYTYPE_T 是 TABLE OF NUMBER 通过创建的

CREATE OR REPLACE TYPE mytype_t AS TABLE OF NUMBER ; 

【问题讨论】:

    标签: c# oracle ado.net


    【解决方案1】:

    您将无法使用deprecated System.Data.OracleClient 轻松做到这一点 但是您可以使用 oracle's ODP 来使用 UDT。如果这不是一个选项,我不确定您如何通过 C# 中的参数和 System.Data 来做到这一点。

    ODP 确实附带了很多示例,上面的链接中有示例。

    我将添加更多链接,希望对您有所帮助:

    1. visual studio ODP index
    2. this shows you exactly how to utilize the ODT to create you custom class wrappers and call them(做 请注意,这是中途, 他们使用该工具走过 在它上面创建自定义类型 例子——这个演练是 相当彻底,应该让你 直接在您需要的地方)
    3. Download:现在这家伙也 安装示例文件,这是 另一个很好的例子 您需要做的:安装后 goto [你的目录路径 安装]..\product\11.2.0\client_1\odp.net\samples\4\UDT\object1.cs

    允许 Visual Studio 的 ODT 工具为您的 UDT 创建类(例如 IOracleCustomType 等)确实值得。然后,您可以进入它们并修改它们以满足您的需要。然后一切都说完了(来自object1.cs的sn-p):

        Person p1   = new Person();
    p1.Name     = "John";
    p1.Address  = "Address1";
    p1.Age = 20;
    
    // Establish a connection to Oracle
    OracleConnection con = new OracleConnection(constr);
    con.Open();
    
    // Update Person object and insert it into a database table
    OracleCommand cmd = new OracleCommand(sql1, con);
    cmd.CommandType = CommandType.StoredProcedure;
    OracleParameter param1 = new OracleParameter();
    
    param1.OracleDbType   = OracleDbType.Object;
    param1.Direction      = ParameterDirection.InputOutput;
    
    // Note: The UdtTypeName is case-senstive
    param1.UdtTypeName     = "SCOTT.ODP_OBJ1_SAMPLE_PERSON_TYPE";   
    param1.Value           = p1;
    
    cmd.Parameters.Add(param1);
    

    还要注意,Person 类必须实现 IOracleCustomType(可以通过 #2 中的链接创建)

    /* Person Class
       An instance of a Person class represents an ODP_OBJ1_SAMPLE_PERSON_TYPE object
       A custom type must implement INullable and IOracleCustomType interfaces
    */
    public class Person : INullable, IOracleCustomType
    

    上面是一个完整的自定义类型,但你是在关联数组 ODP 绑定之后:

    http://weblogs.asp.net/ricardoperes/archive/2009/05/14/odp-net-associative-arrays.aspx

    你会想要使用

    param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
    

    一切都应该到位

    【讨论】:

    • 更新了我的问题。 ODP的样本会很棒。我似乎在 ODP 示例文件中找不到我需要的特定场景。
    • sql1 应该有什么值?我只是存储过程的名称吗?我已经用我需要传递给存储过程的确切类型更新了我的问题。
    • @Baddie,我相信你会想要使用关联数组,我在上面放了一个不错的链接
    【解决方案2】:

    只有当此数据类型是 DB 定义时,您才能将自定义数据类型从 C# 传递到 Oracle 过程。看看at this article,这应该可以帮助您入门。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 2019-10-29
      • 1970-01-01
      • 2017-05-22
      • 2010-11-02
      相关资源
      最近更新 更多