Oracle存储过程和自定义数据类型

时间:2010-11-04 16:36:08

标签: c# oracle ado.net

我有一个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 ; 

2 个答案:

答案 0 :(得分:4)

使用deprecated System.Data.OracleClient,您将无法轻松完成此操作 但您可以使用oracle's ODP使用UDT。如果这不是一个选项,我不确定如何通过C#with 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:现在这家伙也是 安装示例文件,这是 完全是另一个了不起的例子 你需要做什么:一旦安装 转到[目录路径你 安装] .. \产品\ 11.2.0 \的Client_1 \ odp.net \样品\ 4 \ UDT \ object1.cs
  4. 允许Visual Studio的ODT工具为您创建UDT类(例如IOracleCustomType等)真的很值得。然后你可以进入它们并根据你的需要进行修改。一旦说完所有(来自object1.cs的片段):

        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;
    

    一切都应该落实到位

答案 1 :(得分:0)

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