资源描述
《数据库技术与应用》
课程设计报告
项目名称:银行ATM存取款机系统设计与实现
姓 名:
专 业:
指导教师:
完成日期:2015年11月21日
62
内蒙古科技大学课程设计任务书
课程名称
数据库技术与开发
设计题目
银行ATM存取款机系统设计与实现
指导教师
时间
2015年11月20日
一、教学要求
1、培养学生运用所学课程《SQL Server 2012》的理论知识和技能以及对数据库组织、管理和使用能力。
2、掌握数据库应用系统的整个设计过程(包括需求分析、概念结构设计、逻辑结构设计与物理设计与实施)以及运用Transact-SQL编写代码
二、设计资料及参数
根据问题分析,明确银行ATM存取款系统的实体、实体属性及实体之间的关系:
在充分理解银行业务需求后,围绕银行的需求进行分析,确认与银行ATM存取款有紧密关系的实体,并得到每个实体的必要属性。
根据业务,分析多个实体之间的关系。实体之间的关系可以是一对一、一对多和多对多。
三、设计要求及成果
1.创建数据库、创建表、创建约束
2.使用触发器和插入测试数据
3.模拟常规业务、创建视图
4.使用存储过程实现业务处理
5.利用事务实现较复杂的数据更新
6.使用视图简化复杂的数据查询
7.使用游标技术实现结果集的行集操作
四、进度安排
用Power designer绘制CDM模型、生成PDM模型(1天)
用T-SQL进行编程(2天)
修改优化课程设计代码(2天)
编写课程设计说明书和验收(2天)
五、评分标准
1.实训文档(30%)
2.实训项目完成的质量(50%)
3.平日考勤(20%)
4.成绩采用五级分制评定
六、建议参考资料
1.《数据库设计规范》,
2.《数据库系统教程》,施伯乐,高等教育出版社
3.《数据库系统概论》,王珊,高等教育出版社
4. 《SQL Server 2012》,王英英,清华大学出版社
目录
内蒙古科技大学课程设计任务书 I
第一章 需求分析 1
1.1 项目任务 1
1.2 项目技能目标 1
1.3 需求概述 1
1.4 开发环境 1
1.5 问题分析 1
第二章 项目实训内容 4
2.1 实训一:制定《数据库设计与编程规范》 4
2.2 实训二:数据库分析设计与建模 4
2.3 实训三:创建数据库 6
2.4 实训四:创建触发器和插入测试数据 10
2.4 实训五:模拟常规业务 19
2.6 实训六:创建、使用视图 24
2.7 实训七:存储过程实现业务处理 27
2.8 实训八:利用事务实现转账 41
第三章 项目心得体会 46
第四章 对《我的租房网》进行优化 47
附页 57
第一章 需求分析
1.1 项目任务
创建数据库、创建表、创建约束
使用触发器和插入测试数据
模拟常规业务、创建视图
使用存储过程实现业务处理
利用事务实现较复杂的数据更新
1.2 项目技能目标
使用T-SQL语句创建数据库、表和各种约束。
使用T-SQL语句编程实现常见业务。
使用触发器实现多表之间的级联更新。
使用事务和存储过程封装业务逻辑。
使用视图简化复杂的数据查询。
使用游标技术实现结果集的行集操作。
1.3 需求概述
某银行是一家民办的小型银行企业,现有十多万客户,公司将为该银行开发一套ATM存取款机系统,对银行日常的存取款业务进行计算机管理,以便保证数据的安全性,提高工作效率。
要求根据银行存取款业务需求设计出符合第三范式的数据库结构,使用T-SQL语言创建数据库和表,并添加表约束,进行数据的增删改查,运用逻辑结构语句、事务、视图和存储过程,按照银行的业务需求,实现各项银行日常存款、取款和转账业务。
1.4 开发环境
数据库:SQL SERVER 2008开发版
1.5 问题分析
该项目的ATM存取款机业务如下:
(1) 银行存取款业务介绍
银行为客户提供了各种银行存取款业务。详见表1.1
表1.1银行存取款业务
业务
描述
活期
无固定存期,可随时存取,存取金额不限的一种比较灵活的存款
定活两便
事先不约定存期,一次性存入,一次性支取的存款
通知
不约定存期,支取时需提前通知银行,约定支取日期和金额方能支取的存款
整存整取
选择存款期限,整笔存入,到期提取本息的一种定期储蓄。银行提供的存款期限有1年、2年和3年
零存整取
一种事先原定金额,逐月按约定金额存入,到期支取本息的定期储蓄。银行提供的存款期限由1年、2年和3年
自助转账
在ATM存取款机上办理同一币种账户的银行卡之间互相划转
(2) 客户信息
每个客户凭个人身份证在银行可以开设多个银行卡账户,开设账户时,客户需要提供的开户数据如表1.2所示:
表1.2开设银行卡账户的客户信息
数据
描述
姓名
必须提供
身份证号
唯一确定客户,如果是二代身份证,则是由17位数字和1位数字或者字符X构成。如果是一代身份证,则身份证号全部是15位数字。
联系电话
分为座机号码和手机号码:座机号码由数字和“-”构成,由以下两种格式:XXX-XXXXXXXX或者XXXX-XXXXXXX。手机号码由11位数字构成,且前2位必须是13或者15开头。
居住地址
可以选择
(3) 银行卡账户信息
银行为每个账户提供一个银行卡,每个银行卡可以存入一种币种的存款,银行保存账户如表1.3所示:
表1.3 银行卡账户信息
数据
描述
卡号
银行的卡号由16位数字组成,其中:一般前8位代表特俗含义,如代表某总行某支行等,假定该行要求其营业厅的卡号格式为1010 3576 XXXX XXXX,后8位必须是随机产生且唯一,每4位号码后有空格。
密码
由6位数字构成,开户时默认为“888888”
币种
默认为RMB,目前该银行尚未开设其他币种存款业务。
存款类型
必须选择
开户日期
客户开设银行卡账户的日期,默认为当日
开户金额
客户开设银行卡账户时存入的金额,规定不得小于1元。
是否挂失
默认为“否”
客户持银行卡在ATM机上输入密码,经系统验证身份后办理存款、取款和转账等银行业务。银行规定,每个账户当前的存款金额不得小于1元。
(4) 银行卡交易信息
银行在为客户办理业务时,需要记录每一笔账目,账目交易信息如表1.4所示:
表1.4银行卡交易信息
数据
描述
卡号
银行的卡号由16位数字组成
交易日期
默认为当日
交易金额
必须大于0元
交易类型
包括:存入和支取两种
备注
对每笔交易做必要的说明
(5) 银行卡手工账户和存取款单据信息
该银行要求这套软件实现银行客户的开户、存款、取款、转账和余额查询等业务,使得银行储蓄业务方便、快捷,同事保证银行业务数据的安全性。
为使开发人员尽快了解银行业务,该银行提供了银行卡手工账户和存取款单据的样本数据,以供项目开发时参考,参加图1.1和图1.2。
图1.1银行卡手工账户样本数据
图1.2存取款单据样本数据
第二章 项目实训内容
2.1 实训一:制定《数据库设计与编程规范》
1.参考技术文档:《数据库设计规范 (1)》、《数据库设计规范(修订)》、《数据库设计及编写规范》、《编程规范(T-SQL)》、《Transact-SQL_数据库编程命名规范》、《SQL_Server数据库编程规范》等技术文档,
2.制定一份10-15页,不少于3000字的《数据库设计与SQL编程规范》,要求至少包含各个数据库对象的命名规范、编程规范及注释规范。
该实训项目的设计与编程要求遵循该实训制定的《数据库设计与编程规范》。
3.《数据库设计与SQL编程规范》见附页2
2.2 实训二:数据库分析设计与建模
(1)分析银行ATM存取款系统实体
根据问题分析,明确银行ATM存取款系统的实体、实体属性及实体之间的关系:
1.在充分理解银行业务需求后,围绕银行的需求进行分析,确认与银行ATM存取款有紧密关系的实体,并得到每个实体的必要属性。
2.根据业务,分析多个实体之间的关系。实体之间的关系可以是一对一、一对多和多对多。
3.要求使用Visio绘制出ATM存取款系统ER图。
4.参考资料:《ER设计》、《基本ER图要点》
创建如下图2.1所示ER模型图:
图2.1银行存取款系统数据ER图模型
(2)规范数据库结构设计
1.使用数据库设计范式对数据库表结构进行规范优化,规范数据库的表结构同时,要考虑软件运行性能。必要时,可以有悖于第三范式的要求,适当增加冗余数据、减少表间链接,以空间换取时间。
2.如所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
3.如在银行客户表BankCustomer中,不能将客户信息都放在一列中显示,也不能将其中的两列或多列在一列中显示;客户信息表的每一行只表示一个员工的信息,一个员工的信息在表中只出现一次。简而言之,第一范式就是无重复的列。
(3)安装并演示Power designer建模示例
参考《PowerDesigner系统分析与建模》,安装PowerDesigner及破解步骤、演示创建数据库概念模型CDM、数据库物理模型PDM和自动生成T-SQL语句等操作。
(4)绘制CDM模型、生成PDM模型和生成T-SQL语句
使用PowerDesigner,把设计数据库第一步结果(即分析得到的银行ATM存取款系统的实体、实体属性、以及实体之间的关系)用CDM表示,要求CDM要体现出各实体之间的关系以及各实体的实体属性。
创建如下图2.2所示的数据库概念模型:
图2.2银行存取款系统数据概念模型CDM
检查所创建CDM模型无误后,自动生成相应的CDM设计文档和银行存取款系统数据物理模型PDM。PDM模型如图2.3所示:
图2.3银行存取款系统数据物理模型PDM
2.3 实训三:创建数据库
(1)创建数据库
1.使用Create DataBase语句创建“ATM存取款机系统”数据库BankDB,数据文件和日志文件保存在指定目录下(建立一个文件夹,用于存放该实训项目的所有相关T-SQL源文件), 文件增长率为15%。
2.创建数据库的代码如下:
--创建BankDB数据库,数据库文件和日志文件均保存在
--文件夹D:\数据库设计与开发\2015年工程案例项目\银行ATM存取款机系统下
--文件增长率均为15%,数据文件起始大小为5MB,日志文件起始大小为2MB
create database BankDB
on primary
(
name=N'BankDB',
filename=N'D:\数据库设计与开发\2015年工程案例项目\银行ATM存取款机系统\BankDB.mdf',
size=5MB,
filegrowth=15%
)
log on
(
name=N'BankDB_log',
filename=N'D:\数据库设计与开发\2015年工程案例项目\银行ATM存取款机系统\BankDB_log.ldf',
size=2MB,
filegrowth=15%
)
go
(2) 创建各个数据表及相关的约束
创建银行业务类型表BankBusinessType
银行业务信息表如下:
--判断银行业务类型表BankBusinessType是否存在,若存在,则删除
if exists(select * from sysobjects where id=OBJECT_ID(N'BankBusinessType'))
drop table BankBusinessType
--创建银行业务类型表BankBusinessType,包含银行业务类型编号BBTId,银行业务类型名称BBTName,银行业务描述BBTComment
create table BankBusinessType
(
--定义银行业务类型编号,主键,标识列从1开始递增
BBTId int identity(1,1) primary key,
--定义银行业务类型名称,非空
BBTName char(20) not null,
--定义银行业务描述
BBTComment varchar(100)
);
go
创建银行卡客户表BankCustome
银行卡客户表如下:
--判断银行卡客户表BankCustomer是否存在,若存在,则删除
if exists(select * from sysobjects where id=OBJECT_ID(N'BankCustomer'))
drop table BankCustomer
--创建银行客户信息表BankCustomer,包含客户编号BCID,客户姓名BCName,客户身份证BCICNo,客户联系电话BCTel、客户地址BCAddr
create table BankCustomer
(
--定义客户编号,主键,标识列从1开始递增
BCId int identity(1,1) primary key,
--定义客户姓名,非空
BCName char(20) not null,
--定义客户身份证号前17位必须是数字,后1位可以是数字或者X,非空
BCICNo char(18) not null
check(left(BCICNo,17) like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
and (right(BCICNo,1) like '[0-9]' or right(BCICNo,1) like 'X')),
--定义客户联系电话,必须是固定电话号码或者手机号,座机号码由数字和“-”构成,由以下两种格式:XXX-XXXXXXXX或者XXXX-XXXXXXX,
--手机号码由11位数字构成,且前2位必须是13或者15或者18开头,非空
BCTel varchar(20) not null
check(BCTel like '[0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9][0-9][0-9]' or
BCTel like '[0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'or
BCTel like '1[358][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'),
--定义客户地址
BCAddr varchar(100)
);
go
创建银行卡账户信息表BankCard
银行卡账户信息表如下:
--判断银行卡账户信息表BankCard是否存在,若存在,则删除
if exists(select * from sysobjects where id=object_id(N'BankCard'))
drop table BankCard
/*创建银行卡账户信息表BankCard,包含银行卡卡号BCNo,银行卡密码BCPwd,币种BCCurrency,存款类型BCBBTId,
开户日期BCOpenDate,开户金额BCOpenAmount,是否挂失BCRegLoss,客户编号BCBCId,余额BankCardBCExistBalance*/
create table BankCard
(
--定义银行卡卡号,必须符合位数字构成,前位为1010 3576,后位是随机产生且唯一,每4位必须有一个空格,主键
BCNo char(19) primary key check(BCNo like '1010 3576 [0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9]'),
--定义银行卡密码,开户默认为“888888”,非空
BCPwd char(6) not null default('888888'),
--定义币种,默认为RMB类型,非空
BCCurrency char(5) not null default('RMB'),
--定义存款类型,非空
BCBBTId int not null,
--定义开户日期,默认当日,非空
BCOpenDate date not null default(getdate()),
--定义开户金额,不得小于1元,非空
BCOpenAmount money not null check(BCOpenAmount>=1),
--定义是否挂失,默认为“否”
BCRegLoss char(2) default(N'否'),
--定义客户编号,非空
BCBCId int not null,
--定义银行卡账户余额,非空
BCExistBalance money not null
);
go
创建银行卡交易信息表BankDealInfo
银行卡交易信息表如下:
--判断交易信息BankDealInfo是否存在,若存在则删除
if exists(select * from sysobjects where id=OBJECT_ID(N'BankDealInfo'))
drop table BankDealInfo
--创建银行卡交易信息表BankDealInfo,包含交易编号BDNo,银行卡卡号BDBCNo,交易日期BDDealDate,交易金额BDDealAcount,交易类型BDDealType,交易备注BDDealComment
create table BankDealInfo
(
--定义交易编号,标识列从1开始增长,主键
BDNo int identity(1,1) primary key,
--定义银行卡卡号,非空
BDBCNo char(19) not null,
--定义交易日期,默认为当日,非空
BDDealDate Date not null default(getdate()),
--定义交易金额,必须大于0元,非空
BDDealAcount money not null check(BDDealAcount>0),
--定义交易类型,有两种:存入和支取,非空
BDDealType Char(10) not null check(BDDealType='存入' or BDDealType='支取'),
--定义交易备注
BDDealComment varchar(100)
);
go
(3) 添加外键约束和生成数据库关系图
添加子表外键约束及生成数据库关系图
1.在银行卡账户信息表BankCard中BCBBTId字段上添加外键约束fk_BC_BBT
添加约束的代码如下:
--在表BankCard中的BCBBTId字段上添加外键约束fk_BC_BBT
alter table BankCard
add constraint fk_BC_BBT foreign key(BCBBTId) references bankbusinesstype(BBTId);
2.在银行卡账户信息表BankCard中BCBCId字段上添加外键约束fk_BC_BC
添加约束的代码如下:
--在表BankCard中的BCBCId字段上添加外键约束fk_BC_BC
alter table BankCard
add constraint fk_BC_BC foreign key(BCBCId) references BankCustomer(BCId);
3.在银行卡交易信息表BankDealInfo中BDBCNo字段上添加外键约束fk_BDI_BC
添加约束的代码如下:
--在表BankDealInfo中的BDBCNo字段上添加外键约束fk_BDI_B
alter table BankDealInfo
add constraint fk_BDI_BC foreign key(BDBCNo) references BankCard(BCNo);
在SQL SERVER里自动生成数据库关系图,如图2.4所示:
图2.4 BankDB数据库关系图
2.4 实训四:创建触发器和插入测试数据
(1)创建级联触发器
1.创建tr_InsertDealInfo触发器
在交易信息表BankDealInfo中创建一个tr_InsertDealInfo触发器,当增加一条交易信息时,修改相应银行卡的存款余额。使用游标,实现批量增加的级联更新。
创建触发器的代码如下:
--判断触发器tr_InsertdealInfo是否存在,若存在,则删除
if (object_id('tr_InsertdealInfo','tr') is not null)
drop trigger tr_InsertdealInfo
go
--在表bankdealinfo上创建一个触发器tr_InsertdealInfo
create trigger tr_InsertdealInfo
on bankdealinfo
for insert
as
declare @type char(10),@sum money,@BDBCNo char(19);
--创建一个游标cursor_BankDealinfo,指向inserted表
declare cursor_BankDealinfo cursor for select BDDealType,BDDealAcount,BDBCNo from inserted
--打开游标
open cursor_BankDealinfo
--取游标中各个字段的值复制给各个变量
fetch next from cursor_BankDealinfo into @type,@sum,@BDBCNo
while @@fetch_status=0
begin
--判断交易记录里是存入还是支取,及时更新银行卡表的存款余额
if(rtrim(ltrim(@type))='存入')
update bankcard set BCExistBalance=BCExistBalance+@sum where BCNo=@BDBCNo;
if(rtrim(ltrim(@type))='支取')
update bankcard set BCExistBalance=BCExistBalance-@sum where BCNo=@BDBCNo;
fetch next from cursor_BankDealinfo into @type,@sum,@BDBCNo
end
--关闭游标
close cursor_BankDealinfo
--释放游标
deallocate cursor_BankDealinfo
go
2.创建tr_DeldealInfo触发器
在交易信息表创建一个tr_DeldealInfo触发器,当删除一条交易信息时,修改相应银行卡的存款余额。使用游标,实现批量删除的级联更新。
创建触发器的代码如下:
--判断触发器tr_DeldealInfo是否存在,若存在,则删除
if (object_id('tr_DeldealInfo','tr') is not null)
drop trigger tr_DeldealInfo
go
--在表bankdealinfo上创建一个触发器tr_InsertdealInfo
create trigger tr_DeldealInfo
on bankdealinfo
for delete
as
declare @type char(10),@sum money,@BDBCNo char(19);
--创建一个游标cursor_BankDealinfo,指向deleted表
declare cursor_BankDealinfo cursor for select BDDealType,BDDealAcount,BDBCNo from deleted
--打开游标
open cursor_BankDealinfo
--取游标中各个字段的值复制给各个变量
fetch next from cursor_BankDealinfo into @type,@sum,@BDBCNo
while @@fetch_status=0
begin
--判断交易记录里是存入还是支取,及时更新银行卡表的存款余额
if(rtrim(ltrim(@type))='存入')
update bankcard set BCExistBalance=BCExistBalance-@sum where BCNo=@BDBCNo;
if(rtrim(ltrim(@type))='支取')
update bankcard set BCExistBalance=BCExistBalance+@sum where BCNo=@BDBCNo;
fetch next from cursor_BankDealinfo into @type,@sum,@BDBCNo
end
--关闭游标
close cursor_BankDealinfo
--释放游标
deallocate cursor_BankDealinfo
go
3.创建tr_UpdatedealInfo触发器
在交易信息表创建一个tr_UpdatedealInfo触发器,当更新一条交易信息时,修改相应银行卡的存款余额。使用游标,实现批量删除的级联更新。
创建触发器的代码如下:
--在交易信息表中插入一个触发器,使用游标,当更新一个交易信息,修改银行卡的存款余额
if (object_id('tr_UpdatedealInfo','tr') is not null)
drop trigger tr_UpdatedealInfo
go
create trigger tr_UpdatedealInfo
on BankDealInfo
for update
as
declare @type char(10),@sum money,@BDBCNo char(19);
--先进行删除操作
--创建一个游标,指向deleted表
declare cursor_delete_BankDealinfo cursor for select BDDealType,BDDealAcount,BDBCNo from deleted
--打开游标
open cursor_delete_BankDealinfo
fetch next from cursor_delete_BankDealinfo into @type,@sum,@BDBCNo
while @@fetch_status=0
begin
--判断交易记录里是存入还是支取,及时更新银行卡表的存款余额
if(rtrim(ltrim(@type))='存入')
update BankCard set BCExistBalance=BCExistBalance-@sum where BCNo=@BDBCNo;
if(rtrim(ltrim(@type))='支取')
update BankCard set BCExistBalance=BCExistBalance+@sum where BCNo=@BDBCNo;
fetch next from cursor_del_BankDealinfo into @type,@sum,@BDBCNo
end
close cursor_delete_BankDealinfo
deallocate cursor_delete_BankDealinfo
--再进行增加操作
--创建一个游标,指向inserted表
declare cursor_insert_BankDealinfo cursor for select BDDealType,BDDealAcount,BDBCNo from inserted
--打开游标
open cursor_insert_BankDealinfo
fetch next from cursor_insert_BankDealinfo into @type,@sum,@BDBCNo
while @@fetch_status=0
begin
--判断交易记录里是存入还是支取,及时更新银行卡表的存款余额
if(rtrim(ltrim(@type))='存入')
update BankCard set BCExistBalance=BCExistBalance+@sum where BCNo=@BDBCNo;
if(rtrim(ltrim(@type))='支取')
update BankCard set BCExistBalance=BCExistBalance-@sum where BCNo=@BDBCNo;
fetch next from cursor_insert_BankDealinfo into @type,@sum,@BDBCNo
end
close cursor_insert_BankDealinfo
deallocate cursor_insert_BankDealinfo
go
4.创建tr_InsertDatedealInfo触发器
在交易信息表创建一个tr_InsertDatedealInfo触发器,当在交易信息表中插入一条交易信息时,如果交易日期早于开户日期时,禁止插入。使用游标,实现批量删除的级联更新。
创建触发器的代码如下:
--在交易信息表中插入一个触发器,如果交易日期早于开户日期,禁止插入
use BankDB;
if (object_id('tr_InsertDatedealInfo','tr') is not null)
drop trigger tr_InsertDatedealInfo
go
create trigger tr_InsertDatedealInfo
on BankDealInfo
for insert
as
declare @BDDealDate date,@BDBCNo char(19);
--创建一个游标,指向inserted表
declare cursor_insertBankDealinfo cursor for select BDDealDate,BDBCNo from inserted
--打开游标
open cursor_insertBankDealinfo
--此时游标处于活动状态,只想查询结果的第一个元组之前
--取游标中各个字段的值复制给各个变量
fetch next from cursor_insertBankDealinfo into @BDDealDate,@BDBCNo
while @@fetch_status=0
begin
if(DATEDIFF(DAY,(select BCOpenDate from BankCard where BCNo=@BDBCNo),@BDDealDate)<=0)
begin
--raiserror('交易日期不得早于开户日期',1,1)
print '交易日期不得早于开户日期'
rollback transaction
end
fetch next from cursor_insertBankDealinfo into @BDDealDate,@BDBCNo
end
--关闭游标
close cursor_insertBankDealinfo
--删除游标引用
deallocate cursor_insertBankDealinfo
go
5.创建tr_ReglossdealInfo触发器
在交易信息表创建一个tr_ReglossdealInfo触发器,当银行卡挂失之后,不能对交易信息表进行插入操作。使用游标,实现批量删除的级联更新。
创建触发器的代码如下:
--在交易信息表中插入一个触发器,当银行卡挂失了之后,不能进行交易
if (object_id('tr_ReglossdealInfo','tr') is not null)
drop trigger tr_ReglossdealInfo
go
create trigger tr_ReglossdealInfo
on bankdealinfo
for insert
as
declare @BDBCNo char(19),@BDBCNo1 char(19);
select @BDBCNo1=BCNo from BankCard where BCRegLoss ='是'
--创建一个游标,指向inserted表
declare cursor_BankDealinfo cursor for select BDBCNo from inserted
--打开游标
open cursor_BankDealinfo
--取游标中各个字段的值复制给各个变量
fetch next from cursor_BankDealinfo into @BDBCNo
while @@fetch_status=0
begin
if(@BDBCNo=@BDBCNo1)
begin
--raiserror('交易日期不得早于开户日期',1,1)
print '银行卡已挂失,操作不成功!'
rollback transaction
end
fetch next from cursor_BankDealinfo into @BDBCNo
end
close cursor_BankDealinfo
deallocate
展开阅读全文