实验6数据库实验存储过程和触发器Word格式文档下载.docx

上传人:b****4 文档编号:17140891 上传时间:2022-11-28 格式:DOCX 页数:22 大小:90.21KB
下载 相关 举报
实验6数据库实验存储过程和触发器Word格式文档下载.docx_第1页
第1页 / 共22页
实验6数据库实验存储过程和触发器Word格式文档下载.docx_第2页
第2页 / 共22页
实验6数据库实验存储过程和触发器Word格式文档下载.docx_第3页
第3页 / 共22页
实验6数据库实验存储过程和触发器Word格式文档下载.docx_第4页
第4页 / 共22页
实验6数据库实验存储过程和触发器Word格式文档下载.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

实验6数据库实验存储过程和触发器Word格式文档下载.docx

《实验6数据库实验存储过程和触发器Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《实验6数据库实验存储过程和触发器Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。

实验6数据库实验存储过程和触发器Word格式文档下载.docx

SET@sum=@sum+@i

6.调用上面修改后的addresult2存储过程,设置变量@s接收计算

1+2+3+…+10的结果。

DECLARE@sint

set@s=0

EXECaddresult210,@sum=@sout

PRINT@s

7.创建一存储过程Proc_Student用于显示学号为“0102”的学生基本信息(包括学号、姓名、性别与系)。

CREATEPROCEDUREProc_Student

select*

fromS

whereS、sno=0102

EXECProcStudent

8.创建一存储过程Stu_grade通过读取某门课的编号,求出不及格的学

生的学号。

CREATEPROCEDUREStu_grade

@nchar(10)

selectsno

fromSC

whereeno=@nandgrade<

60

9•调用上面的存储过程Stu_grade求出课程编号为“0101”的不及格

的学生

EXECStu_grade0101

彳1

EXECScugrade0101

闻结杲[匕消息

sno

10.创建一存储过程avgGrade通过读取学生的学号,以参数形式返回该学生的平均分。

CREATEPROCEDUREavgGrade

selectAVG(grade)平均分

wheresno=@n

groupbysno

11.调用上面的存储过程avgGrade求出学号为“990102014”的平均

分。

EXECavgGrade990102014

*1

EXEC

3结果蔭消息」

平均分

12.删除上述存储过程avgGrade,

dropprocedureavgGrade

—Lnr*■■甘、—-rtt"

■—-ib

-dropp.oced口工飪aT-cGrade|

鬲消息

13、创建存储过程search该存储过程有三个参数,分别为@t、@p1,@p2,根据这些参数,找出书名与@t有关,价格在@p1与@p2(@p2>

=@p1之间的书的编号,书名,价格,出舨日期。

如果用户调用时没有指定@t参

数的值.则表示可为任意值,如用户没有指定@p2,则书本价格没有上限。

用到的关系为:

titles(title_id,title,price,pubdate)。

CREATEPROCEDUREsearch

@tchar(10)="

%"

@p1char(10),

@p2char(10)=NULL

wheretitle=@tandprice<

=@p2andprice>

=@p1

14.调用上面的存储过程search求出书名与computer有关,而且价格小于$20大于$10的书。

EXECsearch"

computer"

10,20

2)触发器:

1、在学生成绩库中创建触发器triggers实现如下功能:

当在学生成绩

表(xscj)中插入一条学生选课信息后,自动实现更新该学生在学生情况表(xsqk)中的总学分信息。

分析:

根据题意,也即要求在学生成绩表中插入一条记录时,自动更新

学生情况表中的相应记录信息。

可以通过在学生成绩表中定义INSERT类型的触发器,触发器中语句要完成的功能就是更新学生情况表中的相应学生的总学分信息。

其实,只要在该生原总学分基础上加上新选课程的学分就可以了。

createtriggertrigger1

onxscj

afterinsert

as

declare@creditint;

select@credit=creditfrominsertedxscj;

updatexsqksetallcredit=allcredit+@credit;

go

2、创建触发器trigger2,实现当修改学生课程表(xskc)中的数据时,显示

createtriggertrigger2

onxskc

afterupdate

print'

学生课程表被修改了

asgo

3、创建触发器trigger,实现当删除学生课程表中某门课程的记录时对应学生成绩表中所有有关此课程的记录均删除。

createtriggertrigger3

afterdelete

declare@cnamechar(10);

select@cname=cnamefromdeletedxsksdeletexscjwherecname=@cname;

4、创建触发器trigger4,实现当修改学生课程表(xskc)中的某门课的课程号时,对应学生成绩表(xscj)中的课程号也作相应修改。

createtriggertrigger4

declare@cnochar(10);

declare@cnamechar(10);

select@cname=xskc、cname,@cno=xskc、enofromupdatedxsks;

updatexscjsetxscj、eno=@cnowherexscj、cname=@cname;

5、创建触发器trigger5,实现当向学生成绩表(xscj)中插入一条选课记录时,查瞧该学生的信息就是否存在在学生信息表中,如果不存在,则

把该学生的基本信息加入到学生信息表中。

createtriggertrigger5

declare@snamelchar(10);

declare@sname2char(10)=NULL;

select@sname1=xscj、snamefromupdatedxscj;

select@sname2=xsqk、snamefromxsqkwherexsqk、sname=@sname1;

if@sname2=NULL

insertintoxsqkvalues(NULL,@sname1);

6、在学生成绩库中创建触发器trigger6,实现如下功能:

表(xscj)中插入一条学生选课信息后,查瞧该学生的信息就是否存在在学生信息表中,如果不存在,则给出“该记录不能被插入!

”的错误提示,并撤销插入操作;

同样,如果课程信息在课程信息表中不存在,给出

“该记录不能被插入!

”的错误提示,并撤销插入操作。

createtriggertrigger6

forinsert

begin

ifnotexists

(selectxsqk、snamefromxsqkwherexsqk、snamein(selectxscj、sname

frominsertedxscj)

raiserror('

该记录不能被插入!

’,16,1)

rollback

return

end

7、创建触发器trigger7,强制实现业务规则:

当向学生成绩表中插入一条记录时,自动修改学生情况表中该学生的总学分,要求总学分为该学生所有已修课程的学分总与。

createtriggertrigger7

begintransaction

committransaction

&

分别用触发器与存储过程实现对学生情况表(xsqk与学生成绩表

(xscj表的级联删除。

createtriggertrigger8

onxsqk

deletefromxscj

wherexscj、snamein

(selectxsqk、snamefromdeletedxsqk)

1-耳uqK.nnuirffrcn1.xsqk:

CREATEPROCEDUREdel_qk_cj@snamechar(10)=NULLAS

delete

from

xscj

where

xscj、

sname=@sname;

xsqk

xsqk、

ECREATEPROCEDUREdel_qk_cjSsnair.echar(10=1RJLL

(iBEGIN

E]deletefronxacj

whexexscj.且namg=世且口師十:

r\deletefrorx^qk

炖b电工皀xsqk•朋克昭=临吕席址已:

Lend

-命晶成功完成。

9、创建触发器8,要求实现:

当向xscj表插入一条记录时,判断该学生的总学分,如果总学分大于等于25,则给出“该学生已修满,不需要再选

修!

”的提示信息;

否则,自动更新该学生的总学分

createtriggertrigger88

forinsertas

begin

declare

@credit1

int;

@credit2

@sname

char(10);

select

=xscj、credit

@sname

=xscj、

snamefrom

insertedxscj;

=xsqk、allcredit

wherexsqk

、sname=@sname;

if(@credit1+@credit2)>

=25

该学生已修满,不需要再选修!

else

insertintoxscjvalues(@credit1,NULL,NULL,@sname);

[■

3exeateLzigyet22

okxaejfcrinsexta雷

]be-gm

icreditlint;

ID匸匚

dsslai!

«

0seat趙eh&

r(10)?

sslsct-credit-,囂gcj”羽凰贱fssm.acscj:

selectScreait-L-xs口k・aiicreoixrronixsaiwneiexsaic■超厲圧=越毁ehik:

]if(3czedxcl+€eredic2)>

-2&

]Legla

raia^rrori'

该学生.已倚;

苗"

不需要再选瞭!

*"

”!

.)

rcllbaLCk

xeturn

-end

xntQ搖values(ScicdjLtlrtlULLp'

4UXLP@;

*nd.

L

Tr

命令已威功壳成:

10、在数据库中用以下语句创建两张表:

CREATETABLE烟销售表

卷烟品牌VARCHAR(40)PRIMARYKEYNOTNULL,购货商VARCHAR(40)NULL,

销售数量INTNULL,

销售单价MONEYNULL,

销售金额MONEYNULL

--业务规则:

库存金额=库存数量*库存单价业务规则。

CREATETABLE烟库存表

卷烟品牌VARCHAR(40)PRIMARYKEYNOTNULL,

库存数量INTNULL,

库存单价MONEYNULL,

库存金额MONEYNULL

创建触发器[T_INSERT卷烟库存表],实现每当[卷烟库存表]发生INSERT动作,则引发该触发器。

触发器功能:

强制执行业务规则,保证插入的数据中,库存金额=库存数量*库存单价。

针对[卷烟库存表],插入测试数据:

注意,第一条数据(红塔山新势力)中的数据符合业务规则,第二条数据(红塔山人为峰)中,[库存金额]空,不符合业务规则,第三条数据(云南映像)中,[库存金额]不等于[库存数量]乘以[库存单价],不符合业务规则。

第四条数据库存数量为0。

请注意在插入数据后,检查[卷烟库存表]中的数据就是否库存金额=库存数量*库存单价。

INSERTINTO卷烟库存表(卷烟品牌,库存数量,库存单价,库存金额)

values(红塔山新势力'

100,12,1200)

values(红塔山人为峰'

100,22,null)

values(云南映像'

100,60,500)

□insertinto誉烟库存表•卷姻品牌r库存魏量『库仔单价,库存金额;

values(玉溪'

0,30,0)

-p且Lue3(,红塔山新势力

IITSERTINTO卷烟库存表I卷烟品牌土库存数量f库存单价》库存金额Ivaluefl('

红塔山人为峰\100,22,7.^11)

valueB■云南映像'

100,SO,5DC

工砧皿工1HTO<烟库存表(卷烟品牌「库存数量『库存单价,库存金頼」values('

玉,奚'

”0rdCL0

AINSERTINTO卷烟厘存表(卷烟品牌卢库存数量*库存单价”库存金訓;

rrr

由消息

丄行受覺响)

L彳亍受影响)

行受覺响)

1行受影响]

行登影响)

ri行受影响]

彳亍受覺响)

u行受影响)

J消息

卷咽品牌

库存数重

库存单价

库存

1

iSL埸山人拘幡

T100

22.00

2200図

2

红増山新牺力

100

1ZM

1200.M

_3_

玉濯

乳皿

Q.W

4

云南腆嫁

S0.00

€00000

11、创建触发器[T_INSERT卷烟销售表],实现每当卷烟库存表发生

INSERT动作,则引发该触发器。

实现业务规则:

如果销售的卷烟品牌不存在库存或者库存为零,则返回错误。

否则则自动减少

卷烟库存表中对应品牌卷烟的库存数量与库存金额。

createtriggerT_INSERT_卷烟销售表

on卷烟销售表

begintransaction

ifnotexists(select卷烟品牌

from卷烟库存表

where卷烟品牌in(select卷烟品牌

frominserted卷烟库存表))

该卷烟不存在于库存,不能销售!

’,16,1);

ifexists(select库存数量

frominserted卷烟库存表)

and库存数量<=0)

该卷烟库存小于等于,不能销售!

’,16,1);

update卷烟库存表

set库存金额=库存数量*库存单价

where卷烟品牌in(select卷烟品牌frominserted卷烟库存表)

declare@卷烟品牌VARCHAR(40)

卷烟销售表)

set@卷烟品牌=(select卷烟品牌frominserted

declare@销售数量INT

set@销售数量=(select销售数量frominserted

set库存数量=库存数量-@销售数量,

库存金额=(库存数量-@销售数量)*库存单价where卷烟品牌=@卷烟品牌

命令已咸功完成。

三)T-SQL编程

1、从学生_课程数据库中查询所有学生选课成绩情况:

姓名、课程名、成绩。

要求:

将学生的百分制转换为5级评分制,成绩大于等于90显示为“优秀”,成绩在80-89分显示为“良好”,“70-79”分显示为“中等”,成绩在60-69显示为“及格”,60以下显示为“不及格”,没成绩的显示为“未考”。

并且输出记录按下列要求排序:

先按学号升序,再按课程号升序,最后按成绩降序。

CREATEPROCEDURE选课成绩情况

selectS、sno学号,S、sname姓名,C、cno课程号,C、cname课程名,成绩=

case

when

SC、grade

>

=90

then

优秀'

=80

良好'

=70

中等'

=60

及格'

=0

不及格

1丰毛1

未考

fromSC,S,C

whereSC、eno=C、enoandSC、sno=S、snoorderbySC、gradedese

ECREATEPROCEDURE选课成绩情况丄

selectS.snorSrC.cnc谏程号fC・uumgje课程名F成绩r

余好尊fe

优良中及

Vfnenjraae>

=3Qthen

vhenSC.grade>

=S0then

whenS匚+grade>

=T0then

whenS匚.gr且日轻thenwhenSC.CTtade^-Othen"

不及格'

■1«

"

未考,

fromSCf3fC

wiiere:

SG・cno=C・匸口口已口d.SC・sno=S■日tid

-EHD

口rderbyS・snoasc

口结果;

.J消寻

学弓

姓普

课程母

课程名

95001

I

wool

3

信息系毓

95002

#lft

j

S5002

倍息购

9W

5

埶据帥

7

55W5

王敏

t

揃乍啟

a

^003

数据応

96004

弓边

10

95004

 

二堵臭IdiML

II

!

IX霁

壬酿

aus

不爾

i

不脚a

ftt?

爭IB

J1

ftfi?

申專

»

壬萌

d

flmtt

SW

W■

廉程唱

tea

0D1

|科

nw

35W1

S50D1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 自然景观

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1