存储过程 例子

USE [rtcard]
GO
/****** Object:  StoredProcedure [dbo].[prcd_cw_balance_query]    Script Date: 10/12/2009 09:46:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO

-- =============================================
-- Author:  wuxiaoyong
-- Create date: 20081231
-- Description: 余额查询
-- =============================================
ALTER PROCEDURE [dbo].[prcd_cw_balance_query]
 @date varchar(20),
 @employeeId varchar(10),
 @clientId varchar(10),
 @cardType varchar(3),
 @cardNo varchar(25),
 @supplyBatchNo varchar(10),
 @sysAreaId varchar(6),
 @count bigint output,
 @balance_all bigint output
AS
declare @sql_str nvarchar(1000)
 declare @balance bigint
 declare @employee_name varchar(100)
 declare @title varchar(25)
 declare @account_net_type varchar(3)
 declare @account_id varchar(10)
 declare @pay_account_id varchar(10)
 declare @pay_money bigint
 declare @pay_account_balance bigint
 declare @rcv_account_id varchar(10)
 declare @rcv_money bigint
 declare @rcv_account_balance bigint 
 DECLARE @var_card varchar(25)
BEGIN
 SET NOCOUNT ON
 set @sql_str=""

 if(@supplyBatchNo is not null and @supplyBatchNo!="")--按充值批次ID查询模式
  set @sql_str=" select distinct card_no from card_supply cs,supply_card_log scl where cs.supply_card_id=scl.supply_card_id and scl.supply_batch_no="+@supplyBatchNo+" and scl.sys_area_id='"+@sysAreaId+"'"
 else
  begin
   set @sql_str=" select card_no from card_info ci,account_info ai
         where ci.account_id=ai.account_id and ci.sys_area_id='"+@sysAreaId+"'"
   if(@employeeId is not null and @employeeId!="")
    set @sql_str=@sql_str+" and sales_id="+@employeeId
   if(@clientId is not null and @clientId!="")
    set @sql_str=@sql_str+" and buy_card_user_id="+@clientId
   if(@cardType="0")
    set @sql_str=@sql_str+" and (account_net_type='2' or account_net_type='0')"
   if(@cardType="1")
    set @sql_str=@sql_str+" and account_net_type='1'"
   if(@cardNo is not null and @cardNo!="")
    set @sql_str=@sql_str+" and card_no='"+@cardNo+"'"
  end
 --查询符合条件卡号存入临时表
 create table #card_table(card_no varchar(25))
 exec("insert into #card_table "+@sql_str)
 --定义临时表 功能:保存请求所须记录
 --create table #temp_table(supply_card_id varchar(10),employee_name varchar(100),title varchar(100),account_net_type varchar(3),card_no varchar(25),balance bigint)

 delete temp_table
 --查询符合条件卡号
 set @var_card=""
 DECLARE card_cursor CURSOR LOCAL FOR
    select card_no from #card_table
 open card_cursor
 fetch next from card_cursor into @var_card
 while(@@fetch_status=0)
 BEGIN
  --查询余额
  exec prcd_cw_getBalance @date,@var_card,@balance output
  --查询业务员,客房名称,卡类
  select @employee_name=employee_name,@title=title,@account_net_type=account_net_type from account_info ai,card_info ci
   left join employee_info ei on ci.sales_id=ei.employee_id
            left join buy_card_user bcu on ci.buy_card_user_id=bcu.buy_card_user_id
   where ci.account_id=ai.account_id   and ci.card_no=@var_card
  --将查询结果存入临时表#temp_table
  --insert into #temp_table(supply_card_id,employee_name,title,account_net_type,card_no,balance)
  -- values(@supplyBatchNo,@employee_name,@title,@account_net_type,@var_card,@balance)
  --test
  insert into temp_table(supply_card_id,employee_name,title,account_net_type,card_no,balance)
   values(@supplyBatchNo,@employee_name,@title,@account_net_type,@var_card,@balance)

  fetch next from card_cursor into @var_card
 END
 close card_cursor

 --select * from temp_table order by card_no
 
--test
 --select card_no,balance from #temp_table order by card_no

 select @balance_all=sum(balance) from temp_table

 set @sql_str=" from temp_table"
 set @sql_str = 'set @temp = (select  count(*)'+@sql_str+')'
 exec sp_executesql @sql_str,N'@temp bigint out',@count out

 if(@balance_all is null)set @balance_all=0;
END

 

 

USE [rtcard]
GO
/****** Object:  StoredProcedure [dbo].[prcd_cw_getBalance]    Script Date: 10/12/2009 09:48:17 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

/**
 wuxiaoyong
**/
--计算每张卡的余额
ALTER PROCEDURE [dbo].[prcd_cw_getBalance]
@date varchar(20),
@card_no varchar(22),
@balance bigint output
AS
declare @account_id varchar(10)
declare @pay_account_id varchar(10)
declare @pay_money bigint
declare @pay_account_balance bigint
declare @rcv_account_id varchar(10)
declare @rcv_money bigint
declare @rcv_account_balance bigint 
declare @card_balance bigint
declare @account_balance bigint
BEGIN
 SET NOCOUNT ON;
 --计算卡的帐户ID
 select @account_id=ci.account_id,@account_balance=account_balance from card_info ci,account_info ai where ci.account_id=ai.account_id and card_no=@card_no

 --计算卡余额--
 set @card_balance=0
 --按时间查询期限内的最后一笔交易记录
 select top 1
  @pay_account_id=to1.pay_account_id,  
  @pay_money=pay_money,
  @pay_account_balance=pay_account_balance,
  @rcv_account_id=to1.rcv_account_id,
  @rcv_money=rcv_money,
  @rcv_account_balance=rcv_account_balance
 from trade_log tl,trade_order to1 where (to1.pay_account_id=@account_id or to1.rcv_account_id=@account_id)
     and to1.order_id=tl.order_id and to1.order_status=1 and (pay_status=3 or pay_status=4) and to1.pay_date<@date order by to1.pay_date desc  
  --根据帐户在交易中所处的帐户角色类型计算在期限末期的卡帐户余额
 if(@account_id=@pay_account_id and @account_id!=@rcv_account_id) --是支付帐户
  set @card_balance=@pay_account_balance-@pay_money
 else if(@account_id!=@pay_account_id and @account_id=@rcv_account_id) --是接收帐户
  set @card_balance=@rcv_account_balance+@rcv_money
 else --既是支付帐户又是接收帐户
  set @card_balance=@pay_account_balance-@pay_money+@rcv_money
  
  --如果在该期限内,该卡账户没有交易记录,则要重新取交易记录,取无期限限制的第一笔交易记录来计算之前的帐户余额
  if(@card_balance is null)
  begin
   --按时间查询期限内的最后一笔交易记录
   select top 1
    @pay_account_id=to1.pay_account_id,  
    @pay_money=pay_money,
    @pay_account_balance=pay_account_balance,
    @rcv_account_id=to1.rcv_account_id,
    @rcv_money=rcv_money,
    @rcv_account_balance=rcv_account_balance
   from trade_log tl,trade_order to1 where (to1.pay_account_id=@account_id or to1.rcv_account_id=@account_id)
       and to1.order_id=tl.order_id and to1.order_status=1 and (pay_status=3 or pay_status=4) order by to1.pay_date asc
    --根据帐户在交易中所处的帐户角色类型计算在期限末期的卡帐户余额
   if(@account_id=@pay_account_id) --是支付帐户
    set @card_balance=@pay_account_balance
   else
    set @card_balance=@rcv_account_balance
  end

 if(@card_balance is null) set @card_balance=@account_balance
 set @balance = @card_balance
END

 

 

 

java 调用

   conn = (Connection) pool.requestObject();
   cstmt = conn.prepareCall("{call prcd_cw_balance_query(?,?,?,?,?,?,?,?,?)}");
   cstmt.setString(1, date);
   cstmt.setString(2, employee);
   cstmt.setString(3, client);
   cstmt.setString(4, cardType);
   cstmt.setString(5, cardNo);
   cstmt.setString(6, supplyCardId);
   cstmt.setString(7, sysAreaID);
   cstmt.registerOutParameter(8, java.sql.Types.BIGINT);
   cstmt.registerOutParameter(9, java.sql.Types.BIGINT);
   // 取总记录数
   cstmt.execute(); //获取结果集
   cstmt.getMoreResults(Statement.KEEP_CURRENT_RESULT);//第二个结果--记录数
   //金额合计
   pageContext.setAttribute("balance_all", cstmt.getObject(9));

   long recordCount = cstmt.getLong(8);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值