ORACLE HANDBOOK系列之四:ODP.NET与复杂的PL/SQL数据类型(六)

2014-11-24 14:40:45 · 作者: · 浏览: 5
stomObject(OracleConnection conn, IntPtr pUdt)
{
object outStatusArray;
container = (string[])OracleUdt.GetValue(conn, pUdt, 0, out outStatusArray);
statusArray = (OracleUdtStatus[])outStatusArray;
}
public void FromCustomObject(OracleConnection conn, IntPtr pUdt)
{
OracleUdt.SetValue(conn, pUdt, 0, container, statusArray);
}
}

(作为输入参数)

cmd.CommandText = "pkg_odp_dotnet.proc_nested_tab_str_in";
cmd.CommandType = CommandType.StoredProcedure;
//
OracleParameter op = new OracleParameter();
op.ParameterName = "p_nested_tab_str";
op.Direction = ParameterDirection.Input;
op.OracleDbType = OracleDbType.Object;
op.UdtTypeName = "HR.T_NESTED_TAB_STR";
Nested_Tab_Mapping_To_Object nt = new Nested_Tab_Mapping_To_Object();
nt.container = new string[] { "King", "Olsen" };
op.Value = nt;
//
cmd.Parameters.Add(op);
cmd.ExecuteNonQuery();

(作为输出参数)

cmd.CommandText = "pkg_odp_dotnet.proc_nested_tab_str_out";
cmd.CommandType = CommandType.StoredProcedure;
//
OracleParameter op = new OracleParameter();
op.ParameterName = "p_nested_tab_str";
op.Direction = ParameterDirection.Output;
op.OracleDbType = OracleDbType.Object;
op.UdtTypeName = "HR.T_NESTED_TAB_STR";
//
cmd.Parameters.Add(op);
cmd.ExecuteNonQuery();
//
if (op.Value != DBNull.Value)
{
Nested_Tab_Mapping_To_Object o = (Nested_Tab_Mapping_To_Object)op.Value;
foreach (string s in o.container)
{
Console.WriteLine(s);
}
}


4.动态数组(VARRAY)

与Nested table用法相同。


5.对象(Object)

Oracle中Object类型的定义可以参见文章开头的T_Object。遇到T_Object时,处理起来类似于第4节中将Nested table映射成自定义对象的情况,同样需要一个自定义类型以及一个Factory类。


[OracleCustomTypeMappingAttribute("HR.T_OBJECT")]
public class Ora_Object_Factory : IOracleCustomTypeFactory
{
public virtual IOracleCustomType CreateObject()
{
Ora_Object o = new Ora_Object();
return o;
}
}

public class Ora_Object : IOracleCustomType, INullable
{
private bool isNull;
private int employeeId;
private string lastName;
//
public bool IsNull
{
get
{
return this.isNull;
}
}
//
public static Ora_Object Null
{
get
{
Ora_Object mo = new Ora_Object();
mo.isNull = true;
return mo;
}
}
//
[OracleObjectMappingAttribute("EMPLOYEE_ID")]
public int EmployeeId
{
get
{
return employeeId;
}
set
{
employeeId = value;
}
}
//
[OracleObjectMappingAttribute("LAST_NAME")]
public string LastName
{
get
{
return lastName;
}
set
{
lastName = value;
}
}
//
public void FromCustomObject(Oracle.DataAccess.Client.OracleConnection conn, System.IntPtr pUdt)
{
OracleUdt.SetValue(conn, pUdt, "EMPLOYEE_ID", this.EmployeeId);
OracleUdt.SetValue(conn, pUdt, "LAST_NAME", this.LastName);
}
public void ToCustomObject(Oracle.DataAccess.Client.OracleConnection conn, System.IntPtr pUdt)
{
this.EmployeeId = ((int)(OracleUdt.GetValue(conn, pUdt, "EMPLOYEE_ID")));
this.LastName = ((string)(OracleUdt.GetValue(conn, pUdt, "LAST_NAME")));
}
}

(作为输入参数)

cmd.CommandText = "pkg_odp_dotnet.proc_obj_in";
cmd.CommandType = Comma