USE BankDB
GO
--用例4:常规业务处理-----------------------------------------------------------------------------------------------------------
--统计银行资金流通余额和盈利结算---------------------------------
--资金流通率余额=总存入金额-总支取金额 假定 存款利率为千分之三,贷款利率为千分之八 盈利结算=总支取金额x0.008-总存入金额x0.003
DECLARE @inMoney decimal(10,2)
DECLARE @outMoney decimal(10,2)
SELECT @inMoney = SUM(TradeMoney) FROM TradeInfo WHERE TradeType = '存入'
SELECT @outMoney = SUM(TradeMoney) FROM TradeInfo WHERE TradeType = '支取'
PRINT '银行流通余额总计为:'+CONVERT(varchar(20),@inMoney-@outMoney)
PRINT '盈利结算为:'+CONVERT(varchar(20),@inMoney*0.008-@outMoney*0.003)
GO
--查询本周开户信息---------------------------------------------
SELECT CardNo AS 卡号,UserName AS 姓名,MoneyType AS 货币, DepositName AS 存款类型,
AccountDate AS 开户日期,AccountMoney AS 开户金额,SaveMoney AS 存款余额,
AccountState AS 账户状态
FROM CardInfo
INNER JOIN Deposit ON CardInfo.DepositId = Deposit.DepositId
WHERE DATEPART(yy,GETDATE())+DATEPART(wk,GETDATE()) = DATEPART(yy,AccountDate)+DATEPART(wk,AccountDate)
--DATEDIFF(dd,7,'2009-01-01') <= AccountDate AND AccountDate<='2009-12-30'
--DATEDIFF(dd,7,GETDATE()) <= AccountDate AND AccountDate<=GETDATE()
GO
--查询本月交易金额最高的卡号---------------------------------------------
SELECT CardNo,TradeMoney FROM TradeInfo WHERE TradeMoney =
(SELECT MAX(TradeMoney) FROM TradeInfo
WHERE DATEPART(yy,GETDATE())+DATEPART(wk,GETDATE()) = DATEPART(yy,TradeDate)+DATEPART(wk,TradeDate))
GO
--查询挂失客户------------------------------------------------------------
SELECT UserName AS 客户姓名, Telephone AS 联系电话
FROM CardInfo
WHERE AccountState = '已挂失'
GO
--催款提醒业务------------------------------------------------------------
SELECT UserName AS 客户姓名, Telephone AS 联系电话,SaveMoney AS 存款余额
FROM CardInfo
WHERE SaveMoney <= 200
GO
--用例5:创建、使用视图-----------------------------------------------------------------------------------------------------------
--输出银行客户记录vw_userInfo-----------------
IF EXISTS(SELECT * FROM sys.objects WHERE name = 'vw_userInfo' )
DROP VIEW vw_userInfo
GO
CREATE VIEW vw_userInfo
AS
SELECT [UserName] AS 姓名,[IdentityCard] AS 身份证号, [Telephone] AS 电话号码,[Address] AS 居住地址
FROM [UserInfo]
GO
SELECT * FROM vw_userInfo
--输出银行卡记录vw_cardInfo----------------------
IF EXISTS(SELECT * FROM sys.objects WHERE name = 'vw_cardInfo' )
DROP VIEW vw_cardInfo
GO
CREATE VIEW vw_cardInfo
AS
SELECT CardNo AS 卡号,UserName AS 客户,MoneyType AS 货币, DepositName AS 存款类型,
AccountDate AS 开户日期,SaveMoney AS 余额,[PassWord] AS 密码,
AccountState AS 账户状态
FROM CardInfo
INNER JOIN Deposit ON CardInfo.DepositId = Deposit.DepositId
GO
SELECT * FROM vw_cardInfo
--输出银行卡交易记录vw_tradeInfo-----------------
IF EXISTS(SELECT * FROM sys.objects WHERE name = 'vw_tradeInfo' )
DROP VIEW vw_tradeInfo
GO
CREATE VIEW vw_tradeInfo
AS
SELECT TradeDate AS 交易日期,TradeType AS 交易类型,CardNo AS 卡号,TradeMoney AS 交易金额, Remark AS 备注
FROM TradeInfo
GO
SELECT * FROM vw_tradeInfo
--用例6:使用存储过程-----------------------------------------------------------------------------------------------------------
--实现存取款业务--------------------------------------------------
IF EXISTS(SELECT * FROM sys.objects WHERE name = 'usp_takeMoney' )
DROP PROCEDURE usp_takeMoney
GO
CREATE PROCEDURE usp_takeMoney
@cardNo nvarchar(20),
@inMoney decimal(10,2),
@password nvarchar(20) =NULL --NULL就是存款 非NULL就是取款
AS
DECLARE @n int
SET @n = 0
DECLARE @spare decimal(10,2)
SELECT @spare=SaveMoney FROM CardInfo WHERE CardNo = @cardNo
DECLARE @pswd nvarchar(20)
SELECT @pswd = PassWord FROM CardInfo WHERE CardNo = @cardNo
IF(@password IS NOT NULL)
BEGIN
IF(@pswd <> @password)
BEGIN
RAISERROR('密码不符合',16,1)
RETURN
END
IF(@inMoney > @spare-1)
BEGIN
RAISERROR('交易失败,余额不足',16,1)
PRINT '卡号'+CAST(@cardNo AS nvarchar(20))+'余额'+CAST(@spare AS nvarchar(20))
RETURN
END
END
DECLARE @tempMoney decimal(10,2)
BEGIN TRANSACTION
PRINT '交易正进行,请稍后...'
IF(@password IS NULL)--NULL存款
BEGIN
SET @tempMoney = @inMoney + @spare
INSERT INTO TradeInfo(CardNo,TradeDate,TradeType,TradeMoney,SpareMoney)
VALUES(@cardNo,DEFAULT,'存入',@inMoney,@tempMoney)
SET @n = @n+@@ERROR
UPDATE CardInfo SET SaveMoney = @tempMoney WHERE CardNo = @cardNo
SET @n = @n+@@ERROR
END
ELSE --非NULL取款
BEGIN
SET @tempMoney = @spare - @inMoney
INSERT INTO TradeInfo(CardNo,TradeDate,TradeType,TradeMoney,SpareMoney)
VALUES(@cardNo,DEFAULT,'支取',@inMoney,@tempMoney)
SET @n = @n+@@ERROR
UPDATE CardInfo SET SaveMoney = @tempMoney WHERE CardNo = @cardNo
SET @n = @n+@@ERROR
END
IF (@n = 0)
BEGIN
PRINT '交易成功!交易金额:' + CAST(@inMoney AS nvarchar(20))
PRINT '卡号'+CAST(@cardNo AS nvarchar(20))+'余额'+CAST(@tempMoney AS nvarchar(20))
COMMIT TRANSACTION
END
ELSE
BEGIN
PRINT '交易失败'
PRINT '卡号'+CAST(@cardNo AS nvarchar(20))+'余额'+CAST(@tempMoney AS nvarchar(20))
ROLLBACK TRANSACTION
END
GO
EXEC usp_takeMoney '1010357612121130',1000,'888888'
--产生随机卡号------------------------------------------------
IF EXISTS(SELECT * FROM sys.objects WHERE name = 'usp_randCardID' )
DROP PROCEDURE usp_randCardID
GO
CREATE PROCEDURE usp_randCardID
@randNo nvarchar(20) OUTPUT
AS
DECLARE @r decimal(15,8)
DECLARE @right nvarchar(10)
SELECT @r = RAND(DATEPART(mm,GETDATE())*100000+DATEPART(ss,GETDATE())*1000+DATEPART(ms,GETDATE()))
SET @right = RIGHT(@r,8)
SET @randNo = '10103576'+@right
GO
DECLARE @myCardNo nvarchar(20)
EXEC usp_randCardID @myCardNo OUTPUT
PRINT @myCardNo
--完成开户业务------------------------------------------------
IF EXISTS(SELECT * FROM sys.objects WHERE name = 'usp_openAccount' )
DROP PROCEDURE usp_openAccount
GO
CREATE PROCEDURE usp_openAccount
@identityCard nvarchar(30),
@userName nvarchar(30),
@phone nvarchar(30),
@address nvarchar(50),
@accountStartMoney decimal(10,2),
@depositName nvarchar(20)
AS
DECLARE @depositId int
SELECT @depositId = DepositId FROM Deposit WHERE DepositName=@depositName
DECLARE @newCardNo nvarchar(20)
EXEC usp_randCardID @newCardNo OUTPUT
BEGIN TRANSACTION
DECLARE @n int
SET @n = 0
--如果开户用户已存在 直接插入CardInfo表 否则先将信息插入到UserInfo表
IF EXISTS(SELECT * FROM UserInfo WHERE IdentityCard=@identityCard)
BEGIN
INSERT INTO CardInfo(CardNo,UserName,IdentityCard,Telephone,[Address],DepositId,AccountMoney,SaveMoney)
VALUES(@newCardNo,@userName,@identityCard,@phone,@address,@depositId,@accountStartMoney,@accountStartMoney)
SET @n = @n + @@ERROR
END
ELSE
BEGIN
INSERT INTO UserInfo(IdentityCard,UserName,Telephone,[Address])
VALUES(@identityCard,@userName,@phone,@address)
SET @n = @n + @@ERROR
INSERT INTO CardInfo(CardNo,UserName,IdentityCard,Telephone,[Address],DepositId,AccountMoney,SaveMoney)
VALUES(@newCardNo,@userName,@identityCard,@phone,@address,@depositId,@accountStartMoney,@accountStartMoney)
SET @n = @n + @@ERROR
END
IF (@n = 0)
BEGIN
PRINT '开户成功:'+@newCardNo
PRINT '开户日期:'+CONVERT(varchar(30),GETDATE(),102)+' 开户金额:'+CONVERT(varchar(30),@accountStartMoney)
COMMIT TRANSACTION
END
ELSE
BEGIN
PRINT '开户失败'
ROLLBACK TRANSACTION
END
GO
EXEC usp_openAccount '567891321242345799','zz','0752-43345223','asdasd',1,'活期'
--分页显示查询交易数据---------------------------------------------------------
IF EXISTS(SELECT * FROM sys.objects WHERE name = 'usp_pagingDisplay' )
DROP PROCEDURE usp_pagingDisplay
GO
CREATE PROCEDURE usp_pagingDisplay
@page int =1, --指定的第几页
@eachPage int =2 --每页多少条
AS
SELECT TOP (@eachPage) TradeDate AS 交易日期,TradeType AS 交易类型,CardNo AS 卡号,TradeMoney AS 交易金额
FROM TradeInfo
WHERE TradeId NOT IN
(
SELECT TOP ((@page-1)*@eachPage) TradeId FROM TradeInfo ORDER BY TradeId ASC
)
ORDER BY TradeId ASC
GO
EXEC usp_pagingDisplay 1,4
--打印客户对账单------------------------------------------------------
IF EXISTS(SELECT * FROM sys.objects WHERE name = 'usp_CheckSheet' )
DROP PROCEDURE usp_CheckSheet
GO
CREATE PROCEDURE usp_CheckSheet
@cardNo nvarchar(20),
@searchStartDate datetime =NULL,
@searchEndDate datetime =NULL
AS
DECLARE @name nvarchar(20)
SELECT @name = UserName FROM CardInfo WHERE CardNo=@cardNo
DECLARE @depositName nvarchar(20)
SELECT @depositName = DepositName FROM Deposit WHERE DepositId =
(SELECT DepositId FROM CardInfo WHERE CardNo = @cardNo)
DECLARE @date datetime
SELECT @date = AccountDate FROM CardInfo WHERE CardNo = @cardNo
PRINT '卡号:'+@cardNo
PRINT '姓名:'+@name
PRINT '货币:RMB'
PRINT '储存类型:'+@depositName
PRINT '开户日期:'+CONVERT(varchar(20),@date,102)
IF(@searchStartDate IS NULL OR @searchEndDate IS NULL)
BEGIN
SELECT TradeDate AS 交易日期,TradeType AS 类型,
TradeMoney AS 交易金额,Remark AS 备注
FROM TradeInfo WHERE CardNo=@cardNo
END
ELSE
BEGIN
SELECT TradeDate AS 交易日期,TradeType AS 类型,
TradeMoney AS 交易金额,Remark AS 备注
FROM TradeInfo
WHERE CardNo=@cardNo AND TradeDate >= @searchStartDate
AND TradeDate <= @searchEndDate
END
GO
EXEC usp_CheckSheet '1010357612345678','2009-11-02','2009-11-04'
--统计未发生交易的账户----------------------------------------------
IF EXISTS(SELECT * FROM sys.objects WHERE name = 'usp_getWithoutTrade' )
DROP PROCEDURE usp_getWithoutTrade
GO
CREATE PROCEDURE usp_getWithoutTrade
@startDate datetime =NULL,
@endDate datetime =NULL
AS
IF(@startDate IS NULL)
BEGIN
SET @startDate = '2009-11-01'
END
IF(@endDate IS NULL)
BEGIN
SET @endDate = GETDATE()
END
SELECT UserName AS 客户姓名,CardNo AS 身份证号,Telephone AS 电话,[Address] AS 地址
FROM CardInfo
WHERE CardNo NOT IN (SELECT CardNo FROM TradeInfo WHERE TradeDate BETWEEN @startDate AND @endDate)
GO
EXEC usp_getWithoutTrade
--统计银行卡交易量和交易额---------------------------------------------
IF EXISTS(SELECT * FROM sys.objects WHERE name = 'usp_getTradeInfo' )
DROP PROCEDURE usp_getTradeInfo
GO
CREATE PROCEDURE usp_getTradeInfo
@district nvarchar(20) =NULL,
@startDate datetime =NULL,
@endDate datetime =NULL
AS
IF(@startDate IS NULL)
BEGIN
SET @startDate = '2009-01-01'
END
IF(@endDate IS NULL)
BEGIN
SET @endDate = GETDATE()
END
PRINT '统计银行卡交易量和交易额'
PRINT ''
PRINT '起始日期:'+CONVERT(varchar(20),@startDate,102)+' 截止日期:'+CONVERT(varchar(20),@endDate,102)
PRINT '-----------------------------------------------------------------------------------------'
DECLARE @inCount int
DECLARE @outCount int
--DECLARE @sumCount int
DECLARE @inMoney decimal(10,2)
DECLARE @outMoney decimal(10,2)
--DECLARE @spareMoney decimal(10,2)
IF(@district IS NULL)
BEGIN--没选地区 统计所有的
SELECT @inCount=COUNT(*) FROM TradeInfo
WHERE TradeType = '存入' AND TradeDate BETWEEN @startDate AND @endDate
SELECT @inMoney=SUM(TradeMoney) FROM TradeInfo
WHERE TradeType = '存入' AND TradeDate BETWEEN @startDate AND @endDate
SELECT @outCount=COUNT(*) FROM TradeInfo
WHERE TradeType = '支取' AND TradeDate BETWEEN @startDate AND @endDate
SELECT @outMoney=SUM(TradeMoney) FROM TradeInfo
WHERE TradeType = '支取' AND TradeDate BETWEEN @startDate AND @endDate
END
ELSE
BEGIN
SELECT @inCount=COUNT(*) FROM TradeInfo
WHERE TradeType = '存入' AND TradeDate BETWEEN @startDate AND @endDate
AND CardNo IN (SELECT CardNo FROM CardInfo WHERE [Address] LIKE '%'+@district+'%')
SELECT @inMoney=SUM(TradeMoney) FROM TradeInfo
WHERE TradeType = '存入' AND TradeDate BETWEEN @startDate AND @endDate
AND CardNo IN (SELECT CardNo FROM CardInfo WHERE [Address] LIKE '%'+@district+'%')
SELECT @outCount=COUNT(*) FROM TradeInfo
WHERE TradeType = '支取' AND TradeDate BETWEEN @startDate AND @endDate
AND CardNo IN (SELECT CardNo FROM CardInfo WHERE [Address] LIKE '%'+@district+'%')
SELECT @outMoney=SUM(TradeMoney) FROM TradeInfo
WHERE TradeType = '支取' AND TradeDate BETWEEN @startDate AND @endDate
AND CardNo IN (SELECT CardNo FROM CardInfo WHERE [Address] LIKE '%'+@district+'%')
END
PRINT '存入笔数:'+CONVERT(varchar(10),@inCount)+' 存入金额:'+CONVERT(varchar(10),@inMoney)
PRINT '支取笔数:'+CONVERT(varchar(10),@outCount)+' 支取金额:'+CONVERT(varchar(10),@outMoney)
PRINT '-----------------------------------------------------------------------------------------'
PRINT '发生笔数:'+CONVERT(varchar(10),@inCount+@outCount)+' 支取金额:'+CONVERT(varchar(10),@inMoney-@outMoney)
GO
EXEC usp_getTradeInfo
--用例7 利用事务实现较完整数据更新--------------------------------------------
IF EXISTS(SELECT * FROM sys.objects WHERE name = 'usp_tradefer' )
DROP PROCEDURE usp_tradefer
GO
CREATE PROCEDURE usp_tradefer
@outCardNo nvarchar(20),
@outCardPswd nvarchar(20),
@outCardMoney decimal(10,2),
@inCardNo nvarchar(20)
AS
DECLARE @n int
SET @n = 0
BEGIN TRANSACTION
PRINT '开始转账,请稍后....'
EXEC usp_takeMoney @outCardNo,@outCardMoney,@outCardPswd
SET @n=@n+@@ERROR
EXEC usp_takeMoney @inCardNo,@outCardMoney
SET @n=@n+@@ERROR
PRINT '转账成功!'
DECLARE @date datetime
DECLARE @nowDate datetime
SET @date = DATEADD(mi,-30,GETDATE())
SET @nowDate = DATEADD(mi,10,GETDATE())
PRINT '打印转出账户对账单'
PRINT '--------------------------'
EXEC usp_CheckSheet @outCardNo,@date,@nowDate
SET @n=@n+@@ERROR
PRINT '打印转入账户对账单'
PRINT '--------------------------'
EXEC usp_CheckSheet @inCardNo,@date,@nowDate
SET @n=@n+@@ERROR
IF (@n = 0)
BEGIN
COMMIT TRANSACTION
END
ELSE
BEGIN
ROLLBACK TRANSACTION
END
GO
EXEC usp_tradefer '1010357612345678','123456',200,'1010357612121130'
示例2 案例
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- python多线程编程特别适用于完成相互独立的任务,同时进行,相互之间没有依赖性。比如,下面我们介绍的从网站中查询...
- QuickStart基于SpringCloud体系实现,简单购物流程实现,满足基本功能:注册、登录、商品列表展示、...