代码之家  ›  专栏  ›  技术社区  ›  Omar

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

  •  7
  • Omar  · 技术社区  · 14 年前

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

    调用Oracle中的存储过程,我将执行以下操作:

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

    更新:

    MYTYPE_T TABLE OF NUMBER

    CREATE OR REPLACE TYPE mytype_t AS TABLE OF NUMBER ; 
    
    2 回复  |  直到 14 年前
        1
  •  4
  •   Harrison    14 年前

    你不可能轻易地 deprecated System.Data.OracleClient 但你可以利用 oracle's ODP 使用UDTs。如果这不是一个选项,我不确定如何通过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 安装示例文件,这是 另一个很好的例子 你需要做的:一旦安装 安装]…\product\11.2.0\client\u 1\odp.net\samples\4\UDT\object1.cs

    允许面向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类必须实现 (可按照#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
    

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

    你会想用

    param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
    

    一切都应该到位

        2
  •  0
  •   andr    14 年前

    只有在定义了此数据类型的数据库时,才能将自定义数据类型从C#传递到Oracle过程。看一看 at this article