存储过程

我们的故事会伴随一生。 --zhu
存储过程
存储过程(Procedure):是SQL语句和流程控制语句的预编译集合。
(1)没有输入参数,没有输出参数的存储过程。
定义存储过程实现查询出账户余额最低的银行卡账号信息,显示银行卡卡号,姓名,账户余额

--方案一:
create proc proc_MinMoneyCard
as
  select top 1 CardNo 银行卡号,realName 姓名,CardMoney 余额
  from  BankCard inner join  AccountInfo on BankCard.AccountId = AccountInfo.AccountId 
go

--方案二:(余额最低,有多个人则显示结果是多个)
create proc proc_MinMoneyCard
as
  select CardNo 银行卡号,realName 姓名,CardMoney 余额
  from  BankCard inner join  AccountInfo on BankCard.AccountId = AccountInfo.AccountId 
  where CardMoney = (select MIN(CardMoney)  from BankCard)
go

(2)有输入参数,没有输出参数的存储过程
模拟银行卡存钱操作,传入银行卡卡号,存钱金额,实现存钱操作

create proc proc_Save
@CardNo varchar(30),
@money money
as
  update BankCard set CardMoney = CardMoney +@money
  where CardNo=@CardNo
  insert into CardExchange(CardNo,MoneyInBank ,MoneyoutBank,ExchangeTime)
  values(@CardNo,@money,0,getdate())
go

--调用
exec proc_Save '622372130312089',1000

(3)有输入参数,没有输出参数,但是有返回值的存储过程(返回值必须整数)。
模拟银行卡取钱操作,传入银行卡号,取钱金额,实现存钱操作
取钱成功返回1,失败返回-1

create proc proc_Withdraw
@CardNo varchar(30),
@money money
as
  update BankCard set CardMoney = CardMoney - @money
  where CardNo=@CardNo
  if @@ERROR  <> 0
    return -1
  insert into CardExchange(CardNo,MoneyInBank ,MoneyoutBank,ExchangeTime)
  values(@CardNo,0,@money,getdate())
    return 1 
go

declare @returnValue int
exec  @returnValue= proc_Withdraw '622372130312089',2000
select @returnValue 

(4)有输入参数,有输出参数的存储过程
查询出某时间的银行卡存取款信息以及存储过程总金额,取款总金额,
传入开始时间,结束时间,显示存取款交易信息的同时,返回存款总金额,取款总金额。

create proc proc_selectExchange
  @start varchar(20), --开始时间
  @end varchar(20), --结束时间
  @sumIn varchar(20), --存款总金额
  @sumOut varchar(20), --取款总金额
as
   select @sumIn =(select sum(MoneyInBank) from CardExchage where Exchange  Time between start + '00:00:00' and end +'23:59::59')
  select @sumOut =(select sum(MoneyOutBank) from CardExchage where Exchange  Time between start + '00:00:00' and end +'23:59:59')
  select * from CardExchange  where ExchangeTime between start + '00:00:00' and end +'23:59:59'

--调用
declare @sumIn money
declare @sumOut money
exec proc_selectExchange '2020-1-1','2020-12-11',@sumIn output,@sumOut output
select @sumIn 
select @sumOut

(5)具有同时输入输出参数的存储过程
密码升级,传入用户名和密码,如果用户名密码正确,并且密码长度<8,自动升级为8位密码

create proc proc_PwdUpgrade
  @CardNo nvarchar(20),--卡号
  @pwd nvarchar(20) output --卡号
as
  if not exists(select * from BankCard where CardNo=@CardNo and CardPwd = @pwd)
    set @pwd=""
  else
  begin
    if len(@pwd)<8
    begin
      declare @len int = 8-len(@pwd)
      declare @i int=1
      while @i <= @len 
        begin
        set @pwd  =@pwd +cast(floor(rand()*10) as varchar(1))
        set @i=@i+1
        end 
        update BankCard set Card Pwd =@pwd where CardNo =@CardNo 
    end
   end
go

--调用
declare @pwd nvarchar(20) =  '123456'
exec  procPwdUpgrade '622372130312089',@pwd output
select @pwd
posted @ 2024-07-03 23:46  小脑虎爱学习  阅读(44)  评论(0)    收藏  举报