ATM-簡單SQL查詢

来源:https://www.cnblogs.com/RemMai/archive/2018/09/25/9703899.html
-Advertisement-
Play Games

End ...




use master 
go
if exists(select * from sysDatabases where name = 'BankDB')
drop database BankDB
go
create database BankDB
go
use BankDB
go
--建用戶信息表
if exists(select * from sysObjects where name = 'Xxl_UserInfo')
drop table Xxl_UserInfo
go
create table Xxl_UserInfo
(
    Xxl_User_Id            int                not null    primary key identity ,
    Xxl_User_Name        nvarchar(20)    not null    ,
    Xxl_User_Sex        bit                not null    check(Xxl_User_Sex in (0,1)),
    Xxl_User_IDcard        char(18)        not null    unique ,
    Xxl_User_Moblie        char(11)        not null    check(Xxl_User_Moblie like '1[3579][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'),
    Xxl_User_Address    nvarchar(50)    not null 
)
go
--建用戶卡信息表
if exists(select * from sysObjects where name = 'Xxl_CardInfo')
drop table Xxl_CardInfo
go
create table Xxl_CardInfo
(
    Xxl_Card_No            char(16)        not null    primary key check(Xxl_Card_No like '66668888[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]') ,
    Xxl_Card_pwd        char(6)            not null    default('666888') ,
    From_Xxl_User_Id    int                not null    references Xxl_UserInfo(Xxl_User_Id),
    Xxl_Card_Date        DateTime        not null    default(getdate()) ,
    Xxl_Card_Balance    decimal(18,2)    not null    check(Xxl_Card_Balance >= 0) ,
    Xxl_Card_State        int                not null    check(Xxl_Card_State in (0,1,2)),
    Xxl_Card_Text        nvarchar(50)
)
go
--建交易信息表
if exists(select * from sysObjects where name = 'Xxl_TransInfo')
drop table Xxl_TransInfo
go
create table Xxl_TransInfo
(
    Xxl_Trans_FlowNum        int                not null    identity primary key    ,
    From_Xxl_Card_No        char(16)        not null    references Xxl_CardInfo(Xxl_Card_No) ,
    Xxl_Trans_Type            int                not null    check(Xxl_Trans_Type in (1,2)) ,
    Xxl_Trans_Quota            decimal(18,2)    not null    check(Xxl_Trans_Quota > 0) ,
    Xxl_Trans_Date            DateTime        not null    default(getdate()) ,
    Xxl_Trans_ed_Balance    decimal(18,2)    not null    check(Xxl_Trans_ed_Balance >= 0) ,
    Xxl_Trans_Text            varchar(50)        not null
)
go
------添加用戶信息
insert Xxl_UserInfo values('徐小龍','1','42028120000114125X','13071226588','湖北武漢')
insert Xxl_UserInfo values('張小楊','0','42028119980515543X','13045114154','湖北武漢')
insert Xxl_UserInfo values('吳小心','0','42028120001202114X','13071557444','湖北武漢')
------添加用戶卡信息
insert Xxl_CardInfo values('6666888845125214','666888','1','2006-2-12','600','0','使用')
insert Xxl_CardInfo values('6666888865896548','666888','1','2007-2-20','3000','0','使用')
insert Xxl_CardInfo values('6666888812454852','666888','2','2016-6-12','6300','0','使用')
insert Xxl_CardInfo values('6666888852145698','666888','3','2018-3-24','500','0','使用')    
------添加交易信息
insert Xxl_TransInfo values('6666888845125214','1','300','2016-3-12','300','存入300元')
insert Xxl_TransInfo values('6666888845125214','1','300','2017-5-3','600','存入300元')
insert Xxl_TransInfo values('6666888865896548','1','6000','2013-9-1','6000','存入6000元')
insert Xxl_TransInfo values('6666888865896548','2','3000','2014-9-1','3000','轉賬3000元給6666888812454852')
insert Xxl_TransInfo values('6666888812454852','1','3000','2017-3-6','3000','6666888865896548轉入的3000元')
insert Xxl_TransInfo values('6666888812454852','1','3300','2017-12-1','6300','存入3300元')
insert Xxl_TransInfo values('6666888852145698','1','3000','2018-6-3','3000','存入3000元')
insert Xxl_TransInfo values('6666888852145698','2','2500','2018-7-3','500','取出2500元')
------備份交易信息表
select * into Xxl_TransInfo_BAK from Xxl_TransInfo
--------查詢各表數據
--select * from Xxl_UserInfo
--select * from Xxl_CardInfo
--select * from Xxl_TransInfo
--select * from Xxl_TransInfo_BAK
----------------------------------------創建函數----------------------------------------
--加逗號的函數
if exists(select * from sysObjects where name='function_JiaDouhao')
    drop function function_JiaDouhao
go
create function function_JiaDouhao( @Money decimal(18,2))
    returns varchar(50) as
    begin
        declare @a varchar(50)= left(@Money,len(@Money)-3)
        declare @b varchar(50)= right(@Money,3)
        while (len(@a)>3)
            begin
                select @b = ','+right(@a,3)+@b
                select @a = left(@a,len(@a)-3)
            end 
        return @a+@b
    end
go
------------------------------------------結束------------------------------------------
----------------------------------------創建視圖----------------------------------------
--用戶信息視圖
if exists(select * from sysObjects where name    ='vw_UserInfo')
    drop view vw_UserInfo
go
create view vw_UserInfo 
    as                    
    select    
        Xxl_User_Id                編號,
        Xxl_User_Name            姓名,
        case Xxl_User_Sex 
            when 0 then ''
            when 1 then ''
            end                    性別,
        Xxl_User_IDcard            身份證,
        Xxl_User_Moblie            聯繫電話,
        Xxl_User_Address        籍貫
        from Xxl_UserInfo 
go
--使用視圖
--select * from vw_UserInfo
--卡信息視圖
if exists(select * from sysObjects where name='vw_CardInfo')
    drop view vw_CardInfo
go
create view vw_CardInfo 
    as                    
    select    
        Xxl_Card_No                                    卡號,
        Xxl_User_Name                                姓名,
        Xxl_Card_Balance                            餘額,
        Xxl_Card_Date                                開卡日期,
        case Xxl_Card_State
            when 0 then '正常'
            when 1 then '凍結'
            when 2 then '註銷'
        end                                            狀態,
        dbo.function_JiaDouhao(Xxl_Card_Balance)    貨幣表示
        from Xxl_UserInfo UserInfo inner join Xxl_CardInfo CardInfo on UserInfo.Xxl_User_Id = CardInfo.From_Xxl_User_Id
go
--使用視圖
--select * from vw_CardInfo
--交易記錄視圖
if exists(select * from sysObjects where name='vw_TransInfo')
    drop view vw_TransInfo
go
create view vw_TransInfo 
    as                    
    select    ----卡號,交易日期,交易類型,交易金額,餘額,描述
        Xxl_Card_No                卡號,
        Xxl_Trans_Date            交易日期,
        case Xxl_Trans_Type
            when 1 then '存入'
            when 2 then    '支取'
        end                     交易類型,
        case Xxl_Trans_Type
            when 1 then '+'+convert(varchar(20),Xxl_Trans_Quota)
            when 2 then '-'+convert(varchar(20),Xxl_Trans_Quota)
            end                    交易金額,
        Xxl_Trans_ed_Balance    餘額,
        Xxl_Trans_Text            描述
        from Xxl_CardInfo CardInfo inner join Xxl_TransInfo TransInfo on CardInfo.Xxl_Card_No = TransInfo.From_Xxl_Card_No
go
--使用視圖
--select * from vw_TransInfo
--------------------------------------------結束--------------------------------------------
----------------------------------------創建存儲過程----------------------------------------
--1、    查詢餘額
if exists(select * from sysObjects where name='p_SelectBalance')
    drop proc p_SelectBalance
go
create proc p_SelectBalance
    @CardNo char(16)
as
    select 貨幣表示 as 餘額 from vw_CardInfo where 卡號 = @CardNo
go
--exec p_SelectBalance '6666888845125214'
--2、    查詢某兩日期之間交易記錄
if exists(select * from sysObjects where name='p_SelectStart_StopDate')
    drop proc p_SelectStart_StopDate
go
create proc p_SelectStart_StopDate
    @CardNo char(16),
    @StartDate datetime,
    @StopDate datetime
as
    select * from vw_TransInfo where 卡號 = @CardNo and 交易日期 >= @StartDate and 交易日期 < dateadd(dd,1,@StopDate)
go
--exec p_SelectStart_StopDate '6666888845125214','1990-1-1','2018-9-9'

--3、    修改密碼功能
if exists(select * from sysObjects where name='p_Update_Pwd')
    drop proc p_Update_Pwd
go
create proc p_Update_Pwd
    @CardNo char(16),
    @CardPwdStart char(6),
    @CardPwdStop char(6)
as
    update Xxl_CardInfo set Xxl_Card_pwd=@CardPwdStop where Xxl_Card_No = @CardNo and Xxl_Card_pwd = @CardPwdStart
go
--exec p_Update_Pwd '6666888845125214','666888','548888'
--4、    存款功能(備份)
if exists(select * from sysObjects where name='p_SeveMoney')
    drop proc p_SeveMoney
go
create proc p_SeveMoney
    @CardNo char(16),
    @Quota decimal(18,2)
as
    if @Quota < 0
    begin
        begin tran
        declare @err int = 0
        declare @startBalance decimal(18,2) = 0
        select @startBalance=Xxl_Card_Balance from Xxl_CardInfo where Xxl_Card_No = @CardNo
        insert Xxl_TransInfo values(@CardNo,'1',@Quota,getdate(),(@startBalance + @Quota),('存入' + convert(varchar(50), @Quota) + ''))
        select @err = @@ERROR + @err
        update Xxl_CardInfo set Xxl_Card_Balance = (@startBalance + @Quota) where Xxl_Card_No = @CardNo
        select @err = @@ERROR + @err
        if @err = 0
        begin
            print '操作成功'
            commit tran
            return 0
        end
        begin
            print '未知錯誤!'
            rollback tran
            return -1
        end
    end
    else
    begin
        print '輸入金額有誤!'
        return -1
    end
go
--5、    取款功能(備份)
if exists(select * from sysObjects where name='p_GetMoney')
    drop proc p_GetMoney
go
create proc p_GetMoney
    @CardNo char(16),
    @Quota decimal(18,2)
as
    if @Quota < 0
    begin
        declare @startBalance decimal(18,2)
        select @startBalance=Xxl_Card_Balance from Xxl_CardInfo where Xxl_Card_No = @CardNo
        if @startBalance < @Quota
        begin
            begin tran
            declare @err int = 0
            insert Xxl_TransInfo values(@CardNo,'2',@Quota,getdate(),(@startBalance - @Quota),('取出' +  convert(varchar(50), @Quota) + ''))
            select @err = @@ERROR + @err
            update Xxl_CardInfo set Xxl_Card_Balance = (@startBalance - @Quota) where Xxl_Card_No = @CardNo
            select @err = @@ERROR + @err
            if @err = 0
            begin
                print '操作成功'
                commit tran
                return 0
            end
            else
            begin
                print '未知錯誤!'
                rollback tran
                return -1
            end
        end
        else
        begin
            print '餘額不足!'
            return -1
        end
    end
    else
    begin
        print '輸入金額有誤!'
        return -1
    end
go
--6、    轉帳功能(備份)
if exists(select * from sysObjects where name='p_TeansferMoney')
    drop proc p_TeansferMoney
go
create proc p_TeansferMoney
    @FromCardNo char(16),
    @ToCardNo char(16),
    @Quota decimal(18,2)
as
    if @FromCardNo = @ToCardNo
    begin
        if (select count(*) from Xxl_CardInfo where Xxl_Card_No = @ToCardNo) =1
        begin
            if @Quota < 0
            begin
                declare @FromStartBalance decimal(18,2) = 0 -- 轉出前
                select @FromStartBalance=Xxl_Card_Balance from Xxl_CardInfo where Xxl_Card_No = @FromCardNo
                if @FromStartBalance < @Quota
                begin
                    begin tran
                    declare @err int = 0
                    declare @ToStartBalance decimal(18,2) = 0    --轉入前
                    select @ToStartBalance=Xxl_Card_Balance from Xxl_CardInfo where Xxl_Card_No = @ToCardNo
                    insert Xxl_TransInfo values(@FromCardNo,'1',@Quota,getdate(),(@FromStartBalance - @Quota), '轉出' + convert(varchar(50), @Quota) + '元給'+@ToCardNo)
                    select @err = @@ERROR + @err
                    insert Xxl_TransInfo values(@ToCardNo,'2',@Quota,getdate(),(@ToStartBalance + @Quota),('' +@FromCardNo+ '轉入'+ convert(varchar(50), @Quota) + '
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近喜歡上了arch,然而遺憾的是沒有太多時間用來折騰,所以選擇了manjaro。 然而在安裝sogou pinyin時卻遇到了點小問題,如下圖: 和基礎軟體包發生衝突了,然而不管是官方源還是archlinuxcn,都已經同步到了最新狀態,而這個libidn又是systemd的依賴,並不能簡單的卸載 ...
  • 最近公司需要做一個宣傳片播放 視頻有點大 好幾百M 就想到使用Nginx來代理靜態資源,在過程中出現了一些問題,比如埠沒開、訪問是403等,沒有成功,後面慢慢查找問題,才發現大部分博客資料的都不全,所以在這裡記錄一下。 安裝過程本文就不提了 網上都有很多 本文主要說明 nginx.conf 的配置 ...
  • HTTPS協議建立過程 1) 客戶端首次發送請求時,由於客戶端(瀏覽器等)對一些加解密演算法的支持程度不一樣,但是在TLS傳輸中必須使用相同的加解密演算法,所以在TLS握手的階段,客戶端告訴伺服器端自己支持的加密演算法(加密套件list),客戶端產生一個隨機數存在客戶端,並且傳送給伺服器,客戶端的隨機數要 ...
  • 一.概述 在開啟shell腳本編程之前,必須要知道一款文本編輯器的用法,如文本編輯的查找,剪切,粘貼,定位等, 本篇只講vim編輯器。vim編輯器全名叫vi improved,是經過對Unix系統vi編輯器的一些改進而來,vi編輯器是Unix系統最初的編輯器。 1.1 檢查vim軟體包 下麵分析vi ...
  • 首先查看本機中的JAVA版本 如何需要卸載掉現有的JAVA版本的話,可以使用rpm -qa | grep java 和 rpm -e xxx --nodeps進行卸載 登錄到JAVA官方下載界面,提供了rpm包和tar.gz包兩種包。rpm包的話直接安裝就可以了,不用做修改。tar.gz包需要修改環 ...
  • Tcpdump抓包分析過程 一、TCP連接建立(三次握手) 過程 客戶端A,伺服器B,初始序號seq,確認號ack 初始狀態:B處於監聽狀態,A處於打開狀態 A -> B : seq = x (A向B發送連接請求報文段,A進入同步發送狀態SYN-SENT) B -> A : ack = x + 1, ...
  • 轉自:https://mp.weixin.qq.com/s?__biz=MzAxODI5ODMwOA==&mid=2666539134&idx=1&sn=5166f0aac718685382c0aa1cb5dbca45&scene=5&srcid=0527iHXDsFlkjBlkxHbM2S3E#r ...
  • 最近都在和Linux打交道,感覺還不錯。我覺得Linux相比windows比較麻煩的就是很多東西都要用命令來控制,當然,這也是很多人喜歡linux的原因,比較短小但卻功能強大。我將我瞭解到的命令列舉一下,僅供大家參考: 系統信息 arch 顯示機器的處理器架構(1) uname -m 顯示機器的處理 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...