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

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

使用已弃用的System.Data.OracleClient,您将无法轻松完成此操作,但您可以使用oracle的ODP并使用UDT。 如果这不是一个选项,我不确定如何通过C#with System.Data中的参数来完成它。

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

我将添加一些希望有用的链接:

  1. 视觉工作室ODP指数
  2. 这将向您展示如何利用ODT创建自定义类包装器并调用它们 (请注意,这是中途,它们使用该工具在示例中创建其上方的自定义类型 – 本演练非常详尽并应该直接到达你需要的地方)
  3. 下载 :现在这个人也安装了样本文件,这是你需要做的另一个很好的例子:一旦安装了goto [你安装的目录路径] .. \ product \ 11.2.0 \ client_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类必须实现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; 

一切都应该到位

仅当此数据类型是DB定义的时,才能将自定义数据类型从C#传递到Oracle过程。 看看这篇文章 ,这应该可以帮助你入门。