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实战了 一.多级指针 指针的概念我们在前面 ...
随机推荐
- 【Codeforces Round #460 (Div. 2) B】 Perfect Number
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 直接暴力求出第k个perfect数字就好. 纯模拟. [代码] #include <bits/stdc++.h> #de ...
- 【Henu ACM Round#14 C】Duff and Weight Lifting
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 2^y可以由两个2^(y-1)相加得到. 则有一个贪心的策略. 就是2^x尽量都变成2^(x+1) (即能够凑就尽量凑) 如果x还有 ...
- Android设计模式(七)--原型模式
1.定义: 用原型实例指定创建对象种类,并通过拷贝这些原型创建新的对象. 2.目的: 从一个对象创建另外一个可定制的对象,而不须要知道不论什么创建细节. 3.作用: 3.1.简化对象的创建. 3.2 ...
- 对string的一些扩展函数
对string作了一些扩展,包含string转化为int.string转化为double.string转化为bool.打印系统当前时间.但没有解决数据溢出的问题,请大神帮忙解决! //头文件 /*pa ...
- hdu 1875 畅通project再续(kruskal算法计算最小生成树)
畅通project再续 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- js---15深拷贝浅拷贝 原型链
//&&得到的结果不是布尔类型,如果前面都是 true就执行最后一个,并返回最后一个表达式的值,前面有一个为false,后面不执行,返回前面表达式的值 var a = 3; var b ...
- VS NuGet使用
通过这个可以自动联网下载内容! 很方便! 工具->NuGet包管理工具->程序包管理器控制台
- Socket编程中的强制关闭与优雅关闭及相关socket选项
以下描述主要是针对windows平台下的TCP socket而言. 首先需要区分一下关闭socket和关闭TCP连接的区别,关闭TCP连接是指TCP协议层的东西,就是两个TCP端之间交换了一些协议包( ...
- css3--简单的加载动画
.load-container { width: 30%; height: auto; position: relative; margin: 1rem auto; } .load { width: ...
- wget 指令学习之递归抓取文档技巧
在线上阅读文档的时候,有没有想将它抓取到本地,以备没有网的时候阅读只需? 先上指令: $ wget --user-agent="Mozilla/5.0 (X11; Linux x86_64) ...