//
OracleParameter op = new OracleParameter();
op.ParameterName = "p_obj";
op.Direction = ParameterDirection.Input;
op.OracleDbType = OracleDbType.Object;
op.UdtTypeName = "HR.T_OBJECT";
//
Ora_Object mo = new Ora_Object();
mo.EmployeeId = 100;
mo.LastName = "abcd";
op.Value = mo;
//
cmd.Parameters.Add(op);
cmd.ExecuteNonQuery();
作为输出参数的情况很简单,这里就不重复了。
6.对象集合(Object collection)
来到终极篇,所谓对象集合,这里指的是本身是个集合类型,并且集合元素是Oracle的Object,例如我们在最开始定义的T_Nested_Tab_Obj。
由于它是Nested table,则我们可以按照第3节中的作法将其转化成C#中的Array,于是,我们需要一个Factory类并实现IOracleArrayTypeFactory接口:
[OracleCustomTypeMappingAttribute("HR.T_NESTED_TAB_OBJ")]
public class Nested_Tab_Obj_Mapping_To_Array_Factory : IOracleArrayTypeFactory
{
public Array CreateArray(int i)
{
return new Ora_Object[i];
}
//
public Array CreateStatusArray(int i)
{
return new OracleUdtStatus[i];
}
}
又由于集合的元素是Oracle的Object类型,仿照第5节中的做法,我们分别需要一个自定义类型以及一个Factory类,由于集合元素也是使用的T_Object,所以这两个类与第5节中相同,这里不再重复写了。下面我们看看具体的调用代码:
cmd.CommandText = "pkg_odp_dotnet.proc_nested_tab_obj_in";
cmd.CommandType = CommandType.StoredProcedure;
//
OracleParameter op = new OracleParameter();
op.ParameterName = "p_nested_tab_obj";
op.Direction = ParameterDirection.Input;
op.OracleDbType = OracleDbType.Array;
op.UdtTypeName = "HR.T_NESTED_TAB_OBJ";
//
Ora_Object mo = new Ora_Object();
mo.EmployeeId = 100;
mo.LastName = "00000";
Ora_Object mo2 = new Ora_Object();
mo2.EmployeeId = 102;
mo2.LastName = "00000";
op.Size = 2;
op.Value = new Ora_Object[] { mo, mo2 };
//
cmd.Parameters.Add(op);
cmd.ExecuteNonQuery();
作为输出参数的情况也很容易写,这里就不举例子了,VARRAY的情况与Nested table基本一样,也不举例了。到这里,关于在C#中如何处理几类主要的复杂参数类型,已经基本介绍完了,对于一些更为复杂的,比如Object中包含Object等等情况,不太常见,就不介绍了。
PS,虽然Associative array中的元素也可以是Object,但在与C#类型做映射时似乎不能成功,可能根Associative array是PL/SQL类型(即不能通过CREATE TYPE创建独立的类型)有关,还没有找到相关的文档。
作者 Snowtoday MSN:MyYe110w@hotmail.com