class SimpleTable : IOracleCustomType { [OracleArrayMapping()] //Dto是自己的DTO public Dto[] Value; public virtual void FromCustomObject(OracleConnection con, System.IntPtr pUdt) { OracleUdt.SetValue(con, pUdt, 0, this.Value); } public virtual void ToCustomObject(OracleConnection con, System.IntPtr pUdt) { Value = (Dto[])OracleUdt.GetValue(con, pUdt, 0); //this.Value = ((Dto[])(OracleUdt.GetValue(con, pUdt, 0))); } [OracleCustomTypeMapping("TESTTABLE")] public class SimpleTableFactory : IOracleCustomTypeFactory, IOracleArrayTypeFactory { public virtual IOracleCustomType CreateObject() { return new SimpleTable(); } public virtual Array CreateArray(int length) { return new Dto[length]; } public virtual Array CreateStatusArray(int length) { return null; } } }
C#----main
private static void TEST() { SimpleTable TestList = new SimpleTable(); String ConnectionString = ConfigurationManager.ConnectionStrings["ABC"].ConnectionString; using (OracleConnection conn = new OracleConnection(ConnectionString)) { conn.Open(); using (OracleCommand cmd = conn.CreateCommand()) { try { //procedure寫法 cmd.CommandText = "TEST"; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("V_Start",1); cmd.Parameters.Add("V_Num", 10); cmd.Parameters.Add(new OracleParameter() { ParameterName = "DtoList", Direction = ParameterDirection.Output, OracleDbType=OracleDbType.Array, UdtTypeName = "TESTTABLE" }); /*function寫法 cmd.CommandText = "TEST"; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new OracleParameter() { ParameterName = "DtoList", Direction = ParameterDirection.ReturnValue, OracleDbType=OracleDbType.Array, UdtTypeName = "TESTTABLE" }); cmd.Parameters.Add("V_Start",1); cmd.Parameters.Add("V_Num", 10); */ cmd.ExecuteNonQuery(); TestList = (SimpleTable)cmd.Parameters["DtoList"].Value; foreach (OrderDto i in TestList.Value) Console.WriteLine(i.pname ); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadLine(); } } }ORACLE TYPE---
DTO--
CREATE OR REPLACE TYPE Dto AS OBJECT ( pname varchar2(30), address varchar2(60), age number(3) )NOT FINALCollection--
CREATE OR REPLACE TYPE TESTTABLE AS TABLE OF DtoProcedure--
PROCEDURE TEST(V_Start IN INTEGER ,V_Num IN INTEGER, DtoList OUT TESTTABLE) AS Temp_CUR CUR; Temp_Dto Dto:=Dto('1','1','1'); --初始化 BEGIN DtoList :=TESTTABLE(); --初始化 DtoList.EXTEND(V_Num);--給予大小 OPEN Temp_CUR FOR SELECT * FROM pp ; FOR K IN 1 .. V_Num LOOP FETCH Temp_CUR INTO Temp_Dto.pname ,Temp_Dto .address ,Temp_Dto,age ; --一定要fetch所有欄位 EXIT WHEN Temp_CUR%NOTFOUND; DtoList(K):=Temp_Dto; END LOOP; END;
function --
FUNCTION TEST(V_Start IN INTEGER ,V_Num IN INTEGER) RETURN TESTTABLE AS Temp_CUR CUR; Temp_Dto Dto:=Dto('1','1','1'); --初始化 DtoList TESTTABLE:=TESTTABLE();--初始化 BEGIN DtoList.EXTEND(V_Num);--給予大小 OPEN Temp_CUR FOR SELECT * FROM pp ; FOR K IN 1 .. V_Num LOOP FETCH Temp_CUR INTO Temp_Dto.pname ,Temp_Dto .address ,Temp_Dto,age ; --一定要fetch所有欄位 EXIT WHEN Temp_CUR%NOTFOUND; DtoList(K):=Temp_Dto; END LOOP; RETURN DtoList ; END;
沒有留言:
張貼留言