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实战了 一.多级指针 指针的概念我们在前面 ...
随机推荐
- 【Henu ACM Round#18 D】Looksery Party
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 假设现在每个人收到的信息条数存在cnt里面 那个人猜的条数为target 则如果cnt[i]==target[i] 则我们就让第i个 ...
- CodeForcesGym 100502K Train Passengers
Train Passengers Time Limit: 1000ms Memory Limit: 524288KB This problem will be judged on CodeForces ...
- 整合struts2+spring+hibernate
一.准备struts2+spring+hibernate所须要的jar包: 新建web项目并将jar包引入到project项目中. 二.搭建struts2环境 a.在 ...
- Xposed框架之函数Hook学习
作者:Fly2015 Xposed是Android下Java层的开源Hook框架类似的有cydiasubstrate框架而且据说cydiasubstrate框架能实现Android的Java层和Nat ...
- 第一个WPF
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- matlab 时频分析(短时傅里叶变换、STFT)
短时傅里叶变换,short-time fourier transformation,有时也叫加窗傅里叶变换,时间窗口使得信号只在某一小区间内有效,这就避免了传统的傅里叶变换在时频局部表达能力上的不足, ...
- Linux系统下到哪儿寻找硬件错误
Linux系统下到哪儿寻找硬件错误 当linux系统出现故障的时候,作为管理员首先要定位错误,现在linux有许多工具都能帮助用户寻找错误,要学会利用他们确定问题.这些工具包括dmesg. ...
- 跨域使用onmessage实现方式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ES6第二节:新的声明方式
通过上一节的环境搭建完成,接下来我们就可以愉快的探索ES6的新世界了!下面我们从新的声明方式开始: 在ES6里新加了两种声明方式:let 和 const,以前我们都是用var去作声明,接下来我们一一比 ...
- last---显示用户最近登录信息
last命令用于显示用户最近登录信息.单独执行last命令,它会读取/var/log/wtmp的文件,并把该给文件的内容记录的登入系统的用户名单全部显示出来. 语法 last(选项)(参数) 选项 - ...