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

Oma*_*mar 7 c# oracle ado.net

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

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

EXECUTE MY_STORED_PROCEDURE(MYTYPE_T(99, 231), 'mystring')
Run Code Online (Sandbox Code Playgroud)

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

更新:

MYTYPE_TTABLE OF NUMBER通过创建

CREATE OR REPLACE TYPE mytype_t AS TABLE OF NUMBER ; 
Run Code Online (Sandbox Code Playgroud)

Har*_*son 4

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

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

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

  1. 视觉工作室 ODP 指数
  2. 这向您展示了如何利用 ODT 创建自定义类包装器并调用它们(请注意,这是中间部分,他们在示例中逐步使用该工具在其上方创建自定义类型 - 这个演练非常彻底并且应该直接带你去你需要去的地方)
  3. 下载:现在这个人还安装了示例文件,这是您需要做的另一个很棒的示例:安装后转到 [您安装的目录路径]..\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);
Run Code Online (Sandbox Code Playgroud)

另请注意,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
Run Code Online (Sandbox Code Playgroud)

上面是一个完整的自定义类型,但您需要的是关联数组 ODP 绑定:

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

你会想要使用

param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
Run Code Online (Sandbox Code Playgroud)

一切都应该就位