目录
一、目的与意义 ............................................................... 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语言的理解,提高综合应用知识的能力、分析解决问题的能力,加强数据库知识的实践技能,初步培养开发实用数据库系统的能力。
二、设计内容与要求
设计一个银行账户管理系统,至少能够实现存款、取款、查询、转账等基本功能,要求在在数据库实现过程中至少建立三张表、不得少于四个查询、三个触发器、使用至少一个存
0
……………………………………………………………精品资料推荐…………………………………………………
储过程。
三、设计原理
SQL是一种介于关系代数与关系演算之间的结构化查询语言,其功能并不仅仅是查询。SQL是一个通用的、功能极强的关系数据库语言。它之所以能够为用户和业界所接受,并成为国际标准,是因为它是一个综合的、功能极强同时又简捷易学的语言。SQL语言集数据查询(Data Query)、数据操纵(Data Manipulation)、数据定义(Data Definition)和数据控制(Data Control)功能于一体。 1、数据库基本操作: Ⅰ、定义基本表
语句格式:
CREATE TABLE <表名>
(<列名> <数据类型>[ <列级完整性约束条件> ]
[,<列名> <数据类型>[ <列级完整性约束条件>] ] … [,<表级完整性约束条件> ] );
如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。 Ⅱ、修改基本表
语句格式:
[ ADD <新列名> <数据类型> [ 完整性约束 ] ]
[ DROP <完整性约束名> ]
[ ALTER COLUMN<列名> <数据类型> ]; III、删除基本表
语句格式:
DROP TABLE <表名>[RESTRICT| CASCADE];
RESTRICT:删除表是有限制的。欲删除的基本表不能被其他表的约束所引用,如果存在依赖该表的对象,则此表不能被删除。
CASCADE:删除该表没有限制。在删除基本表的同时,相关的依赖对象一起删除。 IV、数据查询
语句格式:
SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>] …
FROM <表名或视图名>[, <表名或视图名> ] … [ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ] [ ORDER BY <列名2> [ ASC|DESC ] ];
1
……………………………………………………………精品资料推荐…………………………………………………
V、插入元组
语句格式: INSERT
INTO <表名> [(<属性列1>[,<属性列2 >…)]
VALUES (<常量1> [,<常量2>] … ) 功能:将新元组插入指定表中。 VI、修改数据
语句格式:
UPDATE <表名>
SET <列名>=<表达式>[,<列名>=<表达式>]… [WHERE <条件>];
功能:修改指定表中满足WHERE子句条件的元组。 VII、删除数据
语句格式: DELETE
FROM <表名> [WHERE <条件>];
功能:删除指定表中满足WHERE子句条件的元组。 WHERE子句:指定要删除的元组。
缺省表示要删除表中的全部元组,表的定义仍在字典中。 2、数据库完整性 I、实体完整性定义
单属性构成的码有两种说明方法:定义为列级约束条件;定义为表级约束条件。 对多个属性构成的码只有一种说明方法:定义为表级约束条件。
插入或对主码列进行更新操作时,RDBMS按照实体完整性规则自动进行检查。包括: ①. 检查主码值是否唯一,如果不唯一则拒绝插入或修改。
②. 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。 II、参照完整性定义
在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码,用REFERENCES短语指明这些外码参照哪些表的主码。 参照完整性违约处理:
①.拒绝(NO ACTION)执行----默认策略 ②.级联(CASCADE)操作
③.设置为空值(SET-NULL)
对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值。
2
……………………………………………………………精品资料推荐…………………………………………………
3、触发器
触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程,由服务器自动激活,可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力。 I、定义触发器
语法格式:
CREATE TRIGGER <触发器名>
{BEFORE | AFTER} <触发事件> ON <表名> FOR EACH {ROW | STATEMENT} [WHEN <触发条件>] <触发动作体> II、激活触发器
触发器的执行,是由触发事件激活的,并由数据库服务器自动执行,一个数据表上可能定义了多个触发器。
同一个表上的多个触发器激活时遵循如下的执行顺序: ①.执行该表上的BEFORE触发器; ②.激活触发器的SQL语句; ③.执行该表上的AFTER触发器。 III、删除触发器
语法格式:
DROP TRIGGER <触发器名> ON <表名>;
触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除。 4、存储过程 I、PL/SQL的块结构
①.定义部分
DECLARE
------变量、常量、游标、异常等
定义的变量、常量等只能在该基本块中使用,当基本块执行结束时,定义就不再存在。 ②.执行部分 BEGIN
------SQL语句、PL/SQL的流程控制语句 EXCEPTION
------异常处理部分 END;
3
……………………………………………………………精品资料推荐…………………………………………………
II、变量常量的定义
①.PL/SQL中定义变量的语法形式是:: 变量名 数据类型 [ [NOT NULL]:=初值表达式]或 变量名 数据类型 [ [NOT NULL]初值表达式] ②.常量的定义类似于变量的定义::
常量名 数据类型 CONSTANT :=常量表达式
常量必须要给一个值,并且该值在存在期间或常量的作用域内不能改变。如果试图修改它,PL/SQL将返回一个异常。 ③.赋值语句
变量名称:= 表达式 III、控制结构
①.条件控制语句
IF-THEN,IF-THEN-ELSE和嵌套的IF语句: A. IF condition THEN
Sequence_of_statements; END IF
B. IF condition THEN
Sequence_of_statements1; ELSE
Sequence_of_statements2; END IF;
C. 在THEN和ELSE子句中还可以再包括IF语句,即IF语句可以嵌套。 ②.循环控制语句
A.最简单的循环语句LOOP LOOP
Sequence_of_statements; END LOOP;
多数数据库服务器的PL/SQL都提供EXIT、BREAK或LEAVE等循环结束语句,保证LOOP语句块能够结束。 B. WHILE-LOOP
WHILE condition LOOP
Sequence_of_statements; END LOOP;
每次执行循环体语句之前,首先对条件进行求值,如果条件为真,则执行循环体内的语句序列,如果条件为假,则跳过循环并把控制传递给下一个语句。 C. FOR-LOOP
FOR count IN [REVERSE]bound1 … bound2 LOOP Sequence_of_statements; END LOOP; ③.错误处理:
如果PL/SQL在执行时出现异常,则应该让程序在产生异常的语句处停下来,根据异常的类型去执行异常处理语句。
4
……………………………………………………………精品资料推荐…………………………………………………
SQL标准对数据库服务器提供什么样的异常处理做出了建议,要求PL/SQL管理器提供完善的异常处理机制。 IV、存储过程的用户接口
①. 创建存储过程:
CREATE Procedure 过程名([参数1,参数2,...]) AS 过程名:数据库服务器合法的对象标识。 参数列表:用名字来标识调用时给出的参数值,必须指定值的数据类型。参数也可以定义输入参数、输出参数或输入/输出参数。默认为输入参数。 过程体:是一个 CALL/PERFORM Procedure 过程名([参数1,参数2,...]); 使用CALL或者PERFORM等方式激活存储过程的执行。在PL/SQL中,数据库服务器支持在过程体中调用其他存储过程。 ③. 删除存储过程 DROP PROCEDURE 过程名(); 四、总体设计方案 首先进行需求分析和结构设计,确定该系统的一些功能要求及数据的存储方法,画出流程图以及E-R图。然后根据需求分析所得的流程图及E-R图设计表,确定属性。再用SQL语言编写程序实现操作。最后对系统进行调试与测试,确定系统是否完成设计要求。 五、详细设计 1、需求分析 银行账户管理系统主要用于用户的一些操作,包括存款、取款、查询、转账等基本操作,主要涉及到银行与用户两个实体,还有交易这个联系。 5 ……………………………………………………………精品资料推荐………………………………………………… 2、流程图 开始需求分析画流程图画E-R图设计表编写SQL程序调试与测试结束 3、E-R图 交易时间 姓名姓名 ID账号开户时间流水号名称网点存款总额开户银行customermtradenbank银行网点账户余额账号交易金额上次余额网点交易对象交易项目余额 4、设计表 Bank表:表示银行信息,属性有名称,网点,存款总额。其中网点号为主码。 6 ……………………………………………………………精品资料推荐………………………………………………… Customer表:表示客户信息,属性有账号,姓名,ID,开户时间,账户余额,开户银行,银行网点。其中账号为主码。 trade表:用于记录每次交易信息,属性有流水号,姓名,账号,交易项目,交易金额,交易时间,交易对象,余额,上次余额,网点。其中流水号为主码。 5、关系图 建立关系图 其中customer表的外码银行网点参照引用bank表的主码网点;trade表的外码账号参照引用customer表的主码账号;trade表的外码网点参照引用bank表的主码网点。 7 ……………………………………………………………精品资料推荐………………………………………………… 6、编码 CREATE TRIGGER totle ON dbo.user_customer after UPDATE AS if update(银行) update 总存款额 set 存款总额 = (select SUM(余额) from user_inform where 银行总存款额.银行=customer.银行) CREATE TRIGGER 交易项目 ON dbo.trade after UPDATE AS if update(余额) if ((select 余额 from trade where 流水号=(select max(流水号) from trade) )> (select 上次余额 from trade where 流水号=(select max(流水号) from trade))) update trade set 交易项目='支入' where 流水号=(select max(流水号) from trade) and 账号=(select 账号 from trade where 流水号 = (select max(流水号) from trade)) else update trade set 交易项目='支出' where 流水号=(select max(流水号) from trade) and 账号=(select 账号 from trade where 流水号 = (select max(流水号) from trade)) CREATE TRIGGER 交易余额 ON dbo.trade after UPDATE AS if update(交易金额) begin update trade set 余额= (select 账户余额 from customer where 账号 = (select 账号 from trade where 流水号 = (select max(流水号) from trade))) where 流水号 = (select max(流水号) from trade) end; CREATE proc 交易 @card varchar(18) as begin insert trade(交易时间,账号,姓名,余额,上次余额) select getdate(),@card,姓名,账户余额,账户余额 from customer a where a.账号=@card end 8 ……………………………………………………………精品资料推荐………………………………………………… GO CREATE PROCEDURE 存款(@card varchar(18),@cke money) AS BEGIN exec 交易 @card update customer set 账户余额=(账户余额+@cke) where 账号=@card update trade set 交易金额=@cke where 账号=@card and 流水号=(select max(流水号) from trade where 账号=@card ) select * from customer where 账号=@card RETURN; END; GO CREATE procedure 开户 @name varchar(20),@id varchar(18),@card varchar(18) output,@bal money as begin select @card='60'+substring(ltrim(str(rand(),30,30)),len(ltrim(str(rand(),30,30)))-15,6) insert customer(开户时间,姓名,ID,账号,账户余额) values (getdate(),@name,@id,@card,@bal) print '账号创建成功,你的账号为:'+@card end GO CREATE PROCEDURE 查询(@card varchar(18)) AS BEGIN exec 交易 @card update trade set 交易项目='查询' where 账号=@card and 流水号=(select max(流水号) from trade where 账号=@card ) select * from customer where 账号=@card select * from trade where 账号=@card RETURN; END; GO CREATE PROCEDURE 转账(@card1 varchar(18),@card2 varchar(18),@zze money) AS BEGIN exec 交易 @card1 update customer set 账户余额=(账户余额-@zze) where 账号=@card1 9 ……………………………………………………………精品资料推荐………………………………………………… if( (select 账户余额 from customer where 账号=@card1 )<0 ) begin print '余额不足!' update customer set 账户余额=(账户余额+@zze) where 账号=@card1 end else begin update trade set 交易项目='转出' where 账号=@card1 and 流水号=(select max(流水号) from trade where 账号=@card1 ) update trade set 交易金额=@zze where 账号=@card1 and 流水号=(select max(流水号) from trade where 账号=@card1 ) select *from customer where 账号=@card1 select * from trade where 账号=@card1 exec 交易 @card2 update customer set 账户余额=(账户余额+@zze) where 账号=@card2 update trade set 交易项目='转入' where 账号=@card2 and 流水号=(select max(流水号) from trade where 账号=@card2 ) update trade set 交易金额=@zze where 账号=@card2 and 流水号=(select max(流水号) from trade where 账号=@card2 ) select * from customer where 账号=@card2 select * from trade where 账号=@card2 end RETURN; END; GO CREATE PROCEDURE 取款(@card varchar(18),@qke money) AS BEGIN exec 交易 @card update customer set 账户余额=(账户余额-@qke) where 账号=@card if( (select 账户余额 from customer where 账号=@card )<0 ) begin print '账户余额不足!' update customer set 账户余额=(账户余额+@qke) where 账号=@card end else begin update trade set 交易项目='取款' where 账号=@card and 流水号=(select max(流水号) from trade where 账号=@card ) update trade set 交易金额=@qke where 账号=@card and 流水号=(select max(流水号) from trade where 账号=@card ) select * from customer where 账号=@card end RETURN; END; GO 10 ……………………………………………………………精品资料推荐………………………………………………… 六、测试与调试 进过设计与编码,基本已经将设计要求的功能做到,为了进一步确定系统功能的完整性以及应对错误的情况的处理机制,要进行相应的测试与调试。调试过程中要做到以下几项工作:测试主要功能是否达到要求;进行错误的操作,检查系统的应对机制是否达到要求;进一步加强系统的功能,增加一些附加功能。 一些操作过程的截图如下: 11 ……………………………………………………………精品资料推荐………………………………………………… 12 ……………………………………………………………精品资料推荐………………………………………………… 13 ……………………………………………………………精品资料推荐………………………………………………… 14 ……………………………………………………………精品资料推荐………………………………………………… 七、收获与体会 经过一周的课程设计,我的收获颇多。刚开始的时候我感到无从下手,很多问题都没有头绪,对于课程的理解不够,想了很久都没什么思路,甚至想到放弃或者抄袭,但想想自己这样做那就一点收获都没有了,所以还是硬着头皮往下做。后来经过老师的帮助和自己专研看书,在查阅了一些资料之后终于有了一些想法,并且逐步逐步的向下设计,慢慢完成要求,完善系统。 其实数据库是一项很有用的技术,现代社会凡是用到计算机的地方几乎都有数据库的存在,我想我们作为一个学习通讯的学生对于数据库的知识是必须掌握的,这对于我们未来是至关重要的,这是将来很多工作的基础。 课程设计作为一个实践环节,对于我们更好的掌握课本知识是很有利的,如果少了这个环节,我们仅仅是学理论,纸上谈兵,华而无实,无法体会到数据库的应用,这是很糟糕的,同时也不利于我们掌握书本上的理论知识。因为课程设计我教学环节所必须的一部分希望今后能多增加一些这样的环节,让我们更好的应用所学的理论,同时也让我们体会到知识的强大,因为我们用自己所学的东西亲手做一些东西并实现一些功能是相当有成就感的。 八、主要参考资料 《数据库系统概论》(第四版) 王珊 萨师煊 高等教育出版社 2007年11月 15 因篇幅问题不能全部显示,请点此查看更多更全内容