Oracle自定义类型在C#中调用示例
1.C#代码:
1)
using Oracle.DataAccess.Types;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Oracle.DataAccess.Client; namespace YY.SmsPlatform.OracleDataSource
{
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;
}
}
}
2)
//调用存储过程
public bool UserAmountChange(Dictionary<string, long> fee, Dictionary<string, long> recharge)
{
List<HotStandby_RechargeType> f = GetRechargeTypeArray(fee);
List<HotStandby_RechargeType> 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.存储过程:
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 nvl(max(t.userid),0) 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
select t.userid into v_userid from base_userinfo t where t.username=r_row.UserName;
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;
3.自定义类型:
--创建自定义类型
CREATE OR REPLACE TYPE HotStandby_Recharge
is object(
UserName varchar2(50),
MsgType number,
Val number
);
--创建自定义表类型
CREATE OR REPLACE TYPE HOTSTANDBY_RECHARGE_ARRAY as table of HotStandby_Recharge
Oracle自定义类型在C#中调用示例的更多相关文章
- oracle自定义类型 示例
) ); ---自定义类型传参给存储过程,示例如下: create or replace procedure dropWf is cursor c_tenant is and t.id not in ...
- 转载:oracle 自定义类型 type / create type
标签:type create oracle object record 一:Oracle中的类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nvarc ...
- oracle 自定义类型 type / create type
一:Oracle中的类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nvarchar2. 2.数值类型.如:int.number(p,s).integ ...
- sql自定义函数及C#中调用
1.在C#中调用sql自定义函数 1.1 标量值函数 sql语句调用 select dbo.GetClassIDWithName(1) string strSql = string.Format(& ...
- java自定义类型 作为HashMap中的Key值 (Pair<V,K>为例)
由于是自定义类型,所以HashMap中的equals()方法和hashCode()方法都需要自定义覆盖. 不然内容相同的对象对应的hashCode会不同,无法发挥算法的正常功能,覆盖equals方法, ...
- 自定义ASP.NET WebApplication中调用SharePoint2010的对象
如果你是做SharePoint开发的话,一定不会对如下这段代码陌生: using(SPSite oSiteCollection = new SPSite("http://Server_Nam ...
- 在自定义的dwt文件中调用page_header.lbi和page_footer.lbi
昨天下午接到需求说要增加一个新的页面,作为优惠活动规则的介绍之用,之前对ecshop各种修改,但是这次自己做页面还是第一次,文件太多,函数也太多,一个一个的读过来时间很头疼的事情,于是就参照goods ...
- Oracle自定义数据类型 1
原文 oracle 自定义类型 type / create type 一 Oracle中的类型 类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nva ...
- Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型
Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...
随机推荐
- fgrep---指定的输入文件中的匹配模式的行
fgrep命令是用来搜索 file 参数指定的输入文件(缺省为标准输入)中的匹配模式的行.fgrep 命令特别搜索 Pattern 参数,它们是固定的字符串.如果在 File 参数中指定一个以上的文件 ...
- SPI总线工作模式
一.SPI总线工作模式 SPI总线有四种工作模式,是由时钟极性选择(CPOL)和时钟相位选择(CPHA)决定的. CPOL = 0 ,SPI总线空闲为低电平,CPOL = 1, SPI总线空闲为高电平 ...
- Nagle和Cork
我觉得这篇讲的不错. http://blog.csdn.net/c_cyoxi/article/details/8673645 Nagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段. 关闭 ...
- android Manifest.xml选项
结构 继承关系 public final class Manifest extends Object java.lang.Object android.Manifest 内部类 class Mani ...
- POJ 2533 Longest Ordered Subsequence(dp LIS)
Language: Default Longest Ordered Subsequence Time Limit: 2000MS Memory Limit: 65536K Total Submis ...
- OpenLayers3基础教程——OL3之Popup
概述: 本节重点讲述OpenLayers3中Popup的调用时实现,OL3改用Overlay取代OL2的Popup功能. 接口简单介绍: overlay跟ol.control.Control一样,是一 ...
- spring webSocket The HTTP response from the server [200] did not permit the HTTP upgrade to WebSocket
在springboot 1.5.9版本 WebSocketConfig配置 registry.addEndpoint("/webSocket").withSockJS();在加了. ...
- 请求头header里的contentType为application/json和capplition/x-www-form-urlencoded
application/x-www-form-urlencoded 最常见的 POST 提交数据的方式了.浏览器的原生 <form> 表单,如果不设置 enctype 属性,那么最终就会以 ...
- POJ 3252 Round Numbers(组合数学)
Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10223 Accepted: 3726 De ...
- CSS布局篇——固宽、变宽、固宽+变宽
学了前端挺久了.近期写一个项目測试系统,布局时发现自己对变宽+固宽的布局还没有全然掌握,所以在这里总结一下,以后须要的时候回头看看. 1.最简单的当然是一列或多列固宽 比如两列固宽: <1> ...