oracle自定义type类型的使用,C#编程之Oracle自定义类型在C#中调用示例

fee, Dictionaryrecharge)

{

var f = GetRechargeTypeArray(fee);

var r = GetRechargeTypeArray(recharge);

using (OracleConnection conn = this.CreateConnection())

using (OracleCommand cmd = conn.CreateCommand())

{

conn.Open();

cmd.CommandText = "Proc_HotStandbyQuotaChange";

cmd.CommandType = CommandType.StoredProcedure;

var op = new OracleParameter { ParameterName = "result", OracleDbType = OracleDbType.Int32, Direction = ParameterDirection.Output,Value=null };

cmd.Parameters.AddRange(new OracleParameter[] {

new OracleParameter {ParameterName= "FeeDeduction", OracleDbType=OracleDbType.Array,Direction=ParameterDirection.Input,UdtTypeName= "HOTSTANDBY_RECHARGE_ARRAY", Value=f.ToArray() },

new OracleParameter {ParameterName= "Recharge", OracleDbType = OracleDbType.Array, Direction = ParameterDirection.Input, UdtTypeName = "HOTSTANDBY_RECHARGE_ARRAY", Value = r.ToArray() },

op });//HotStandby_Recharge_Array

cmd.ExecuteNonQuery();

int num = Convert.ToInt32(op.Value.ToString());

return num == 0;

}

}

2.定义与数据库对应类型:

public class HotStandby_RechargeType : IOracleCustomType

{

public void FromCustomObject(OracleConnection con, IntPtr pUdt)

{

OracleUdt.SetValue(con, pUdt, "USERNAME", this.UserName);

OracleUdt.SetValue(con, pUdt, "MSGTYPE", this.MsgType);

OracleUdt.SetValue(con, pUdt, "VAL", this.Val);

}

public void ToCustomObject(OracleConnection con, IntPtr pUdt)

{

this.UserName = (string)OracleUdt.GetValue(con, pUdt, "USERNAME");

this.MsgType = (int)OracleUdt.GetValue(con, pUdt, "MSGTYPE");

this.Val = (int)OracleUdt.GetValue(con, pUdt, "VAL");

}

[OracleObjectMapping("USERNAME")]

public string UserName { get; set; }

[OracleObjectMapping("MSGTYPE")]

public int MsgType { get; set; }

[OracleObjectMapping("VAL")]

public int Val { get; set; }

}

[OracleCustomTypeMappingAttribute("HOTSTANDBY_RECHARGE")]

public class HotStandby_RechargeFactory : IOracleCustomTypeFactory

{

public IOracleCustomType CreateObject()

{

return new HotStandby_RechargeType();

}

}

[OracleCustomTypeMapping("HOTSTANDBY_RECHARGE_ARRAY")]

public class HotStandby_RechargeArrayFactory : IOracleArrayTypeFactory

{

public Array CreateArray(int numElems)

{

return new HotStandby_RechargeFactory[numElems];

}

public Array CreateStatusArray(int numElems)

{

return null;

}

}

3.数据库类型定义及表类型定义

--创建表

CREATE OR REPLACE TYPE HOTSTANDBY_RECHARGE_ARRAY as table of HotStandby_Recharge

--创建类型

CREATE OR REPLACE TYPE HotStandby_Recharge

is object(

UserName varchar2(50),

MsgType integer,

Val     integer

)

4.C#调用的存储过程

create or replace procedure Proc_HotStandbyQuotaChange

(

FeeDeduction in HotStandby_Recharge_Array,

Recharge in HotStandby_Recharge_Array,

result  out integer

)as

cursor f_cursor is select * from table(FeeDeduction) ;

cursor r_cursor is select * from table(Recharge);

v_userid integer:=0;

f_row f_cursor%rowtype;

r_row r_cursor%rowtype;

begin

open f_cursor;--打开游标

--  fetch f_cursor into f_row ;

loop

fetch f_cursor into f_row ;

--让游标指针往下移动

exit when f_cursor%notfound;

update user_amountinfo t set t.amount=t.amount-(f_row.Val) where t.userid=(select c.userid from base_userinfo c where c.username=f_row.UserName) and t.msgtype=f_row.MsgType;

--        fetch f_cursor into f_row ;

end loop;

close f_cursor;

open r_cursor;

loop

fetch r_cursor into r_row;

exit when r_cursor%notfound;

select t.userid into v_userid from user_amountinfo t where t.userid = (select u.userid from base_userinfo u where u.username =r_row.UserName) and t.msgtype = r_row.MsgType;

if (v_userid>0)

then

update user_amountinfo t set t.amount=t.amount-(r_row.Val),t.addtime=SYSDATE(),t.rechargeamount=t.rechargeamount-(r_row.Val) where t.userid=v_userid and t.msgtype=r_row.MsgType;

elsif (v_userid<=0)

then

insert into user_amountinfo(userid,amount,msgtype,addtime,rechargeamount)  values(v_userid,r_row.Val,r_row.MsgType,Sysdate(),r_row.Val);

end if;

end loop;

close r_cursor;

commit;

result:=sqlcode;

end Proc_HotStandbyQuotaChange;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值