关于银行系统的数据库课程设计.docx
- 文档编号:23970237
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:21
- 大小:199.82KB
关于银行系统的数据库课程设计.docx
《关于银行系统的数据库课程设计.docx》由会员分享,可在线阅读,更多相关《关于银行系统的数据库课程设计.docx(21页珍藏版)》请在冰豆网上搜索。
关于银行系统的数据库课程设计
一、目的与意义1
二、设计内容与要求1
三、设计原理1
1、数据库基本操作:
1
Ⅰ、定义基本表1
Ⅱ、修改基本表1
III、删除基本表2
IV、数据查询2
V、插入元组2
VI、修改数据2
VII、删除数据2
2、数据库完整性3
I、实体完整性定义3
II、参照完整性定义3
3、触发器3
I、定义触发器3
II、激活触发器4
III、删除触发器4
4、存储过程4
I、PL/SQL的块结构4
II、变量常量的定义4
III、控制结构5
IV、存储过程的用户接口5
四、总体设计方案6
五、详细设计6
1、需求分析6
2、流程图6
3、E-R图7
4、设计表7
5、关系图8
6、编码8
六、测试与调试11
七、收获与体会15
八、主要参考资料15
一、目的与意义
本课程设计是在学完《数据库系统与应用》课程之后,让学生综合应用数据库知识,设计数据库,进行调试与测试,以加深对数据库基本知识及SQL语言的理解,提高综合应用知识的能力、分析解决问题的能力,加强数据库知识的实践技能,初步培养开发实用数据库系统的能力。
二、设计内容与要求
设计一个银行账户管理系统,至少能够实现存款、取款、查询、转账等基本功能,要求在在数据库实现过程中至少建立三张表、不得少于四个查询、三个触发器、使用至少一个存储过程。
三、设计原理
SQL是一种介于关系代数与关系演算之间的结构化查询语言,其功能并不仅仅是查询。
SQL是一个通用的、功能极强的关系数据库语言。
它之所以能够为用户和业界所接受,并成为国际标准,是因为它是一个综合的、功能极强同时又简捷易学的语言。
SQL语言集数据查询(DataQuery)、数据操纵(DataManipulation)、数据定义(DataDefinition)和数据控制(DataControl)功能于一体。
1、数据库基本操作:
Ⅰ、定义基本表
语句格式:
CREATETABLE<表名>
(<列名><数据类型>[<列级完整性约束条件>]
[,<列名><数据类型>[<列级完整性约束条件>]]…
[,<表级完整性约束条件>]);
如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。
Ⅱ、修改基本表
语句格式:
[ADD<新列名><数据类型>[完整性约束]]
[DROP<完整性约束名>]
[ALTERCOLUMN<列名><数据类型>];
III、删除基本表
语句格式:
DROPTABLE<表名>[RESTRICT|CASCADE];
RESTRICT:
删除表是有限制的。
欲删除的基本表不能被其他表的约束所引用,如果存在依赖该表的对象,则此表不能被删除。
CASCADE:
删除该表没有限制。
在删除基本表的同时,相关的依赖对象一起删除。
IV、数据查询
语句格式:
SELECT[ALL|DISTINCT]<目标列表达式>
[,<目标列表达式>]…
FROM<表名或视图名>[,<表名或视图名>]…
[WHERE<条件表达式>]
[GROUPBY<列名1>[HAVING<条件表达式>]]
[ORDERBY<列名2>[ASC|DESC]];
V、插入元组
语句格式:
INSERT
INTO<表名>[(<属性列1>[,<属性列2>…)]
VALUES(<常量1>[,<常量2>]…)
功能:
将新元组插入指定表中。
VI、修改数据
语句格式:
UPDATE<表名>
SET<列名>=<表达式>[,<列名>=<表达式>]…
[WHERE<条件>];
功能:
修改指定表中满足WHERE子句条件的元组。
VII、删除数据
语句格式:
DELETE
FROM<表名>
[WHERE<条件>];
功能:
删除指定表中满足WHERE子句条件的元组。
WHERE子句:
指定要删除的元组。
缺省表示要删除表中的全部元组,表的定义仍在字典中。
2、数据库完整性
I、实体完整性定义
单属性构成的码有两种说明方法:
定义为列级约束条件;定义为表级约束条件。
对多个属性构成的码只有一种说明方法:
定义为表级约束条件。
插入或对主码列进行更新操作时,RDBMS按照实体完整性规则自动进行检查。
包括:
①.检查主码值是否唯一,如果不唯一则拒绝插入或修改。
②.检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。
II、参照完整性定义
在CREATETABLE中用FOREIGNKEY短语定义哪些列为外码,用REFERENCES短语指明这些外码参照哪些表的主码。
参照完整性违约处理:
①.拒绝(NOACTION)执行----默认策略
②.级联(CASCADE)操作
③.设置为空值(SET-NULL)
对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值。
3、触发器
触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程,由服务器自动激活,可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力。
I、定义触发器
语法格式:
CREATETRIGGER<触发器名>
{BEFORE|AFTER}<触发事件>ON<表名>
FOREACH{ROW|STATEMENT}
[WHEN<触发条件>]
<触发动作体>
II、激活触发器
触发器的执行,是由触发事件激活的,并由数据库服务器自动执行,一个数据表上可能定义了多个触发器。
同一个表上的多个触发器激活时遵循如下的执行顺序:
①.执行该表上的BEFORE触发器;
②.激活触发器的SQL语句;
③.执行该表上的AFTER触发器。
III、删除触发器
语法格式:
DROPTRIGGER<触发器名>ON<表名>;
触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除。
4、存储过程
I、PL/SQL的块结构
①.定义部分
DECLARE
------变量、常量、游标、异常等
定义的变量、常量等只能在该基本块中使用,当基本块执行结束时,定义就不再存在。
②.执行部分
BEGIN
------SQL语句、PL/SQL的流程控制语句
EXCEPTION
------异常处理部分
END;
II、变量常量的定义
①.PL/SQL中定义变量的语法形式是:
:
变量名数据类型[[NOTNULL]:
=初值表达式]或
变量名数据类型[[NOTNULL]初值表达式]
②.常量的定义类似于变量的定义:
:
常量名数据类型CONSTANT:
=常量表达式
常量必须要给一个值,并且该值在存在期间或常量的作用域内不能改变。
如果试图修改它,PL/SQL将返回一个异常。
③.赋值语句
变量名称:
=表达式
III、控制结构
①.条件控制语句
IF-THEN,IF-THEN-ELSE和嵌套的IF语句:
A.IFconditionTHEN
Sequence_of_statements;
ENDIF
B.IFconditionTHEN
Sequence_of_statements1;
ELSE
Sequence_of_statements2;
ENDIF;
C.在THEN和ELSE子句中还可以再包括IF语句,即IF语句可以嵌套。
②.循环控制语句
A.最简单的循环语句LOOP
LOOP
Sequence_of_statements;
ENDLOOP;
多数数据库服务器的PL/SQL都提供EXIT、BREAK或LEAVE等循环结束语句,保证LOOP语句块能够结束。
B.WHILE-LOOP
WHILEconditionLOOP
Sequence_of_statements;
ENDLOOP;
每次执行循环体语句之前,首先对条件进行求值,如果条件为真,则执行循环体内的语句序列,如果条件为假,则跳过循环并把控制传递给下一个语句。
C.FOR-LOOP
FORcountIN[REVERSE]bound1…bound2LOOP
Sequence_of_statements;
ENDLOOP;
③.错误处理:
如果PL/SQL在执行时出现异常,则应该让程序在产生异常的语句处停下来,根据异常的类型去执行异常处理语句。
SQL标准对数据库服务器提供什么样的异常处理做出了建议,要求PL/SQL管理器提供完善的异常处理机制。
IV、存储过程的用户接口
①.创建存储过程:
CREATEProcedure过程名([参数1,参数2,...])AS
过程名:
数据库服务器合法的对象标识。
参数列表:
用名字来标识调用时给出的参数值,必须指定值的数据类型。
参数也可以定义输入参数、输出参数或输入/输出参数。
默认为输入参数。
过程体:
是一个
包括声明部分和可执行语句部分。
②.执行存储过程:
CALL/PERFORMProcedure过程名([参数1,参数2,...]);
使用CALL或者PERFORM等方式激活存储过程的执行。
在PL/SQL中,数据库服务器支持在过程体中调用其他存储过程。
③.删除存储过程
DROPPROCEDURE过程名();
四、总体设计方案
首先进行需求分析和结构设计,确定该系统的一些功能要求及数据的存储方法,画出流程图以及E-R图。
然后根据需求分析所得的流程图及E-R图设计表,确定属性。
再用SQL语言编写程序实现操作。
最后对系统进行调试与测试,确定系统是否完成设计要求。
五、详细设计
1、需求分析
银行账户管理系统主要用于用户的一些操作,包括存款、取款、查询、转账等基本操作,主要涉及到银行与用户两个实体,还有交易这个联系。
2、流程图
3、E-R图
4、设计表
Bank表:
表示银行信息,属性有名称,网点,存款总额。
其中网点号为主码。
Customer表:
表示客户信息,属性有账号,姓名,ID,开户时间,账户余额,开户银行,银行网点。
其中账号为主码。
trade表:
用于记录每次交易信息,属性有流水号,姓名,账号,交易项目,交易金额,交易时间,交易对象,余额,上次余额,网点。
其中流水号为主码。
5、关系图
建立关系图
其中customer表的外码银行网点参照引用bank表的主码网点;trade表的外码账号参照引用customer表的主码账号;trade表的外码网点参照引用bank表的主码网点。
6、编码
CREATETRIGGERtotleONdbo.user_customer
afterUPDATE
ASifupdate(银行)
update总存款额set存款总额=(selectSUM(余额)fromuser_informwhere银行总存款额.银行=customer.银行)
CREATETRIGGER交易项目ONdbo.trade
afterUPDATE
ASifupdate(余额)
if((select余额fromtradewhere流水号=(selectmax(流水号)fromtrade))>(select上次余额fromtradewhere流水号=(selectmax(流水号)fromtrade)))
updatetradeset交易项目='支入'where流水号=(selectmax(流水号)fromtrade)and账号=(select账号fromtradewhere流水号=(selectmax(流水号)fromtrade))
else
updatetradeset交易项目='支出'where流水号=(selectmax(流水号)fromtrade)and账号=(select账号fromtradewhere流水号=(selectmax(流水号)fromtrade))
CREATETRIGGER交易余额ONdbo.trade
afterUPDATE
ASifupdate(交易金额)
begin
updatetradeset余额=(select账户余额fromcustomerwhere账号=(select账号fromtradewhere流水号=(selectmax(流水号)fromtrade)))where流水号=(selectmax(流水号)fromtrade)
end;
CREATEproc交易@cardvarchar(18)
as
begin
inserttrade(交易时间,账号,姓名,余额,上次余额)selectgetdate(),@card,姓名,账户余额,账户余额fromcustomerawherea.账号=@card
end
GO
CREATEPROCEDURE存款(@cardvarchar(18),@ckemoney)
AS
BEGIN
exec交易@card
updatecustomerset账户余额=(账户余额+@cke)where账号=@card
updatetradeset交易金额=@ckewhere账号=@cardand流水号=(selectmax(流水号)fromtradewhere账号=@card)
select*fromcustomerwhere账号=@card
RETURN;
END;
GO
CREATEprocedure开户@namevarchar(20),@idvarchar(18),@cardvarchar(18)output,@balmoney
as
begin
select@card='60'+substring(ltrim(str(rand(),30,30)),len(ltrim(str(rand(),30,30)))-15,6)
insertcustomer(开户时间,姓名,ID,账号,账户余额)
values(getdate(),@name,@id,@card,@bal)
print'账号创建成功,你的账号为:
'+@card
end
GO
CREATEPROCEDURE查询(@cardvarchar(18))
AS
BEGIN
exec交易@card
updatetradeset交易项目='查询'where账号=@cardand流水号=(selectmax(流水号)fromtradewhere账号=@card)
select*fromcustomerwhere账号=@card
select*fromtradewhere账号=@card
RETURN;
END;
GO
CREATEPROCEDURE转账(@card1varchar(18),@card2varchar(18),@zzemoney)
AS
BEGIN
exec交易@card1
updatecustomerset账户余额=(账户余额-@zze)where账号=@card1
if((select账户余额fromcustomerwhere账号=@card1)<0)beginprint'余额不足!
'updatecustomerset账户余额=(账户余额+@zze)where账号=@card1end
else
begin
updatetradeset交易项目='转出'where账号=@card1and流水号=(selectmax(流水号)fromtradewhere账号=@card1)
updatetradeset交易金额=@zzewhere账号=@card1and流水号=(selectmax(流水号)fromtradewhere账号=@card1)
select*fromcustomerwhere账号=@card1
select*fromtradewhere账号=@card1
exec交易@card2
updatecustomerset账户余额=(账户余额+@zze)where账号=@card2
updatetradeset交易项目='转入'where账号=@card2and流水号=(selectmax(流水号)fromtradewhere账号=@card2)
updatetradeset交易金额=@zzewhere账号=@card2and流水号=(selectmax(流水号)fromtradewhere账号=@card2)
select*fromcustomerwhere账号=@card2
select*fromtradewhere账号=@card2
end
RETURN;
END;
GO
CREATEPROCEDURE取款(@cardvarchar(18),@qkemoney)
AS
BEGIN
exec交易@card
updatecustomerset账户余额=(账户余额-@qke)where账号=@card
if((select账户余额fromcustomerwhere账号=@card)<0)beginprint'账户余额不足!
'updatecustomerset账户余额=(账户余额+@qke)where账号=@cardend
else
begin
updatetradeset交易项目='取款'where账号=@cardand流水号=(selectmax(流水号)fromtradewhere账号=@card)
updatetradeset交易金额=@qkewhere账号=@cardand流水号=(selectmax(流水号)fromtradewhere账号=@card)
select*fromcustomerwhere账号=@card
end
RETURN;
END;
GO
六、测试与调试
进过设计与编码,基本已经将设计要求的功能做到,为了进一步确定系统功能的完整性以及应对错误的情况的处理机制,要进行相应的测试与调试。
调试过程中要做到以下几项工作:
测试主要功能是否达到要求;进行错误的操作,检查系统的应对机制是否达到要求;进一步加强系统的功能,增加一些附加功能。
一些操作过程的截图如下:
七、收获与体会
经过一周的课程设计,我的收获颇多。
刚开始的时候我感到无从下手,很多问题都没有头绪,对于课程的理解不够,想了很久都没什么思路,甚至想到放弃或者抄袭,但想想自己这样做那就一点收获都没有了,所以还是硬着头皮往下做。
后来经过老师的帮助和自己专研看书,在查阅了一些资料之后终于有了一些想法,并且逐步逐步的向下设计,慢慢完成要求,完善系统。
其实数据库是一项很有用的技术,现代社会凡是用到计算机的地方几乎都有数据库的存在,我想我们作为一个学习通讯的学生对于数据库的知识是必须掌握的,这对于我们未来是至关重要的,这是将来很多工作的基础。
课程设计作为一个实践环节,对于我们更好的掌握课本知识是很有利的,如果少了这个环节,我们仅仅是学理论,纸上谈兵,华而无实,无法体会到数据库的应用,这是很糟糕的,同时也不利于我们掌握书本上的理论知识。
因为课程设计我教学环节所必须的一部分希望今后能多增加一些这样的环节,让我们更好的应用所学的理论,同时也让我们体会到知识的强大,因为我们用自己所学的东西亲手做一些东西并实现一些功能是相当有成就感的。
八、主要参考资料
《数据库系统概论》(第四版)王珊萨师煊高等教育出版社2007年11月
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关于 银行 系统 数据库 课程设计