文档库 最新最全的文档下载
当前位置:文档库 › 实验四-存储过程与触发器、函数

实验四-存储过程与触发器、函数

实验四-存储过程与触发器、函数
实验四-存储过程与触发器、函数

《数据库原理》实验报告

一、实验目的:

●掌握创建存储过程的方法和步骤。

●掌握创建触发器的方法和步骤。

●掌握用户自定义函数的类型及使用方法。

二、实验使用环境:

SQL server 2008、 SQL server 2008、SQL server 2012

三、实验内容与完成情况:

运行截图:

解题思路:用default(getdate())来设置默认时间,getdate()表示系统时间。Primart key设置主键--题目1

create table Inventory(

Goo_no char(8)not null,

Prices money,

Inv_num int,

Inv_date datetime default(getdate())not null,--默认为系统时间

primary key (Goo_no,Inv_date)--主码为商品编号、入库时间

)

运行截图:

解题思路:select新建表,通过满足1=0时插入来插入空表。

--题目2

select*into PurchaseBbak--新建表

from Purchase

where 1=0 --插入空记录

select*into SellBak

from Sell

where 1=0

go

create trigger Pur_Insert

on Purchase for insert--创建触发器,当对Purchase表做插入操作时触发

as

begin

declare@N_Goo_no char(8),@N_Goo_price money,@N_Goo_num int,@N_Pur_date date--声明临时变量

select@N_Goo_no=Goo_no from inserted

select@N_Goo_price=Pur_price from inserted--对临时变量进行赋值

select@N_Goo_num=Pur_num from inserted

select@N_Pur_date=Pur_date from inserted

if exists(select Goo_no

from Inventory

where@N_Goo_no=Goo_no)--判断插入的是否已经存在

测试代码:

运行截图:

Inventory表中正确插入信息:

解题思路:用if….else….分情况进行解决。先建立触发器,并声明临时变量用来临时保存插入数据的值,通过对临时变量进行判断查询来决定符合哪种情况,再在不同的条件语句中进行具体的操作,操作时应注意具体被操作的表以及操作对象。

begin--若已经存在

update Inventory--对Purchase表进行更新

set

Prices=(Purchase.Pur_price*Purchase.Pur_num+@N_Goo_price*@N_Goo_num)/(Purchase.Pur_num

+@N_Goo_num)

from Purchase inner join inserted--对原表和插入数据进行更新

on Purchase.Goo_no=@N_Goo_no

update Inventory

set Inv_num=Inv_num+@N_Goo_num--对数量进行更新

end

else--如果是新的数据

begin

insert into Inventory values(@N_Goo_no,@N_Goo_price,@N_Goo_num,@N_Pur_date)

--select Goo_no,Pur_price,Pur_num,Pur_date from inserted --将数据插入到表中end

end

insert into Purchase(Pur_price,Pur_num,Pur_date,Goo_no,Emp_no)

values(3600,20,'2019-3-5','JY000001',1001)

insert into Purchase(Pur_price,Pur_num,Pur_date,Goo_no,Emp_no)

values(3200,50,'2019-3-5','JY000001',1001)

select*from Inventory

--题目4

go

create trigger Sell_Insert

on Sell for insert

as

begin

declare@N_Sell_no char(5),@N_Sell_num int,@N_Sell_date date,@N_Sell_prices money,@N_Goo_no char(8),@N_Emp_no char(4)--声明临时变量

select@N_Sell_no=Sell_no from inserted

select@N_Sell_num=Sell_num from inserted--对临时变量进行赋值

select@N_Sell_date=Sell_date from inserted

select@N_Sell_prices=Sell_prices from inserted

select@N_Goo_no=Goo_no from inserted

select@N_Emp_no=Emp_no from inserted

update Inventory

set Inv_num=Inv_num-@N_Sell_num--先把库存数进行修改

if((select Inv_num from Inventory where Goo_no=@N_Goo_no)<0)--如果修改后的库存数小于0,说明库存不足

begin

print'库存不足!!'

rollback--如果库存不足,取消上面修改库存表的操作

end

if((select Inv_num from Inventory where Goo_no=@N_Goo_no)<10)--如果库存数小于10 begin

select Inventory.Goo_no,Goo_name,Inv_num

into Havano--新建预警表,并将库存数小于10的货物数据插入到预警表中

from Inventory inner join Goods

on Inventory.Goo_no=Goods.Goo_no

end

end

测试代码:

具体调试过程及截图:

执行下列测试语句:

执行后Inventory表的数量减少20

执行下列语句:

执行后Inventory减少45

并且预警表中加入缺货货物的信息:

insert into Sell(Sell_no,Sell_num,Sell_date,Sell_prices,Goo_no,Emp_no) values('A1016',20,'2019-5-24',4500,'JY000001',1301)

insert into Sell(Sell_no,Sell_num,Sell_date,Sell_prices,Goo_no,Emp_no) values('A1017',45,'2019-3-5',4400,'JY000001',1302)

--测试代码

select*from Inventory--查看库存表信息

select*from Sell--查看售货表信息

select*from Havano--查看预警表信息

--当货物足够,且货物量大于10时

insert into Sell(Sell_no,Sell_num,Sell_date,Sell_prices,Goo_no,Emp_no) values('A1016',20,'2019-5-24',4500,'JY000001',1301)

--当货物足够,但是售货后货物量小于10时

insert into Sell(Sell_no,Sell_num,Sell_date,Sell_prices,Goo_no,Emp_no) values('A1017',45,'2019-3-5',4400,'JY000001',1302)

--当货物量不够时

insert into Sell(Sell_no,Sell_num,Sell_date,Sell_prices,Goo_no,Emp_no) values('A1018',30,'2019-3-5',4100,'JY000001',1302)

执行下列语句:

显示库存不足

解题思路:类似上个题,同样是分情况讨论,不同情况进行不同的操作。但是需要注意的是,触发器触动时,是数据已经更改了的时候,本题中,当货物不足时,是不允许更改的,但是判断货物是否足够是在触发器触动之后,所以需要用到rollback,当货物不足时撤销更改的操作。同时,测试代码也要多方面考虑,当足够时,当足够但是不足10个时,当不够时,都要考虑在内。

insert into Sell(Sell_no,Sell_num,Sell_date,Sell_prices,Goo_no,Emp_no)

values('A1018',30,'2019-3-5',4100,'JY000001',1302)

--题目5

go

create proc proc_Purchase1

(

@Emp_name nvarchar(20)--输入数据局部变量

)

as

if not exists(select Emp_no

from Purchase--判断是否存在由该员工出售的商品

where Emp_no in(select Emp_no

from Employees--子查询,从员工表查找员工名对应的员工号

where Emp_name=@Emp_name)) begin

print'无该员工销售信息'

测试代码:

显示结果:

测试代码:

显示结果:

解题思路:题目未要求输入的是员工姓名还是员工编号,为了提升难度我选择了输入员工姓名,因为这样会多用到一张表,建立储存过程并声明输入参数,通过if not exists判断是否存在该员工出售的信息,如果return 1 --如果不存在该员工出售的商品,则返回1

end

else--如果存在该员工出售的商品

begin

select Pur_no,Pur_date,Pur_price,Goo_no,Emp_no

from Purchase--将该员工出售商品的商品信息赋值给输出临时变量进行输出

where Emp_no in(select Emp_no

from Employees

where Emp_name=@Emp_name)

end

exec proc_Purchase1'王燕'

exec proc_Purchase1'周宏'

不存在,输出提示信息;若存在则进行查询操作,通过嵌套查询显示该员工的销售情况。,

测试代码:

运行结果:

解题思路:我感觉这个题的难度在于知道怎么创建储存过程和调用储存过程,因为查询操作很简单。测declare@Goo_n char(8)

exec proc_gno

@Pro_name='佳能公司',

@Goo_name='5D MARKⅢ套机 (24-70mm)',

@Goo_no=@Goo_n output

select@Goo_n as产品编号

--题目6

go

create proc proc_gno

(

@Pro_name nvarchar(50),--输入变量

@Goo_name nvarchar(20),

@Goo_no char(8)output--输出变量

--输出变量

)

as

begin

select@Goo_no=Goo_no--查询商品编号

from Goods

where Pro_name=@Pro_name--筛选条件

and Goo_name=@Goo_name

end

试代码虽短,但是测试代码却花了我很久的时间进行编写。

--题目7

go

create proc ProSumByPurchase

(

@Pro_name nvarchar(50),--输入变量

@Goo_name nvarchar(20)--输入变量

)

as

begin

if exists(select Goo_no

from Sell

where Goo_no in(select Goo_no

from Goods

where Goo_name=@Goo_name

and Pro_name=@Pro_name))--判断售货表是否存在该商品

begin

select sum(Sell_num)as总销售量

from Sell

where Goo_no=(select Goo_no

from Goods--嵌套查询查找商品号

where Goo_name=@Goo_name

and Pro_name=@Pro_name)

and Sell_date>='2019-1-1'--日期限制在2019年1月期间

and Sell_date<='2019-1-31'

return 0 --若存在该售货商品,返回0

end

else

return 1 --若不存在,返回1

end

测试代码:

运行结果:

解题思路:不难处理,本题重点在于利用语句查询找到符合条件的信息。

测试代码:

运行结果:

exec ProSumByPurchase

@Pro_name='联想公司',

@Goo_name='拯救者15.6英寸轻薄游戏本'

select*from Purchase_Title('2019-1-1','2019-5-1')

--题目8

go

create function Purchase_Title

(

@Begin_date date,--起始日期

@End_date date--结束日期

)

returns table--返回值为表

as

return(

select*from Purchase

where Pur_date>=@Begin_date--时间在起始日期和结束日期之间

and Pur_date<=@End_date

)

解题思路:本题重点在于创建函数的过程,思路并不难。

测试代码:

运行截图:

解题思路:查询从N到M条记录,即先查询前M条记录,再查询前N-1条记录,将两条记录相减,即得到从N到M的记录。

--测试代码

exec proc_page4,7

--题目9

go

create proc proc_page

@Begin_no int,--开始编号

@End_no int--结束编号

as

begin

select top (@End_no)*

from Purchase--查询前End个

except--差运算

select top (@Begin_no-1)*

from Purchase--查询前@Begin_no-1个

end

go

测试代码:

运行结果:

解题思路:先声明可滚动游标,查询并保存符合条件的元组到局部变量。然后按照游标的流程,打开游标,分条件判断是否存在新表Sell_bak,若不存在,则新建并插入,若存在,则直接插入。移动游标,读取下条记录。最后一定要记得关闭并删除游标释放空间。

四、出现的的问题及解决方案(列出遇到的问题和解决办法,列出没有解决的问题)

问题:题目三中,运行触发器时出现以下报错

解决办法:在有自增长的SQL表格里用“*”插入数据的时候,会禁止操作

插入语句原本是:

修改后为

问题:

题目三中,当运行测试插入代码时,显示:

解决:向标识列插入显式的开关默认为关闭状态,打开即可

insert into Purchase select*from inserted--将数据插入到表中

insert into Purchase select Pur_no,Pur_price,Pur_date,Goo_no,Emp_no from inserted

--将数据插入到表中

SET IDENTITY_INSERT[Purchase]ON

select*from Sell_bak

存储过程与触发器实验

第一章存储过程与触发器实验 实验目的 1.理解存储过程的工作原理和作用。 2.掌握存储过程设置和程序设计过程。 3.理解触发器的工作原理和作用。 4.掌握触发器编写方法。 实验环境 采用IBM DB2或Sybase数据库管理系统作为实验平台。其中,DB2可以采用DB2 Express-C或DB2 V8 Enterprise。 实验完成人:李肇臻,谢锦 实验内容 一、存储过程实验 1.针对下面2个完整性约束条件,建立存储过程,实现当数据导入或更新时,可以自动修改拥塞率、半速率话务量比例 (1)拥塞率=拥塞数量/呼叫数量 (2)半速率话务量比例=半速率话务量/全速率话务量 在DB2CMD中运行,win7用管理员权限。 create procedure M() language SQL begin update CALLDATA set "callcongs"="congsnum"/"callnum" where "congsnum"<>0 and "callnum"<>0; update CALLDATA set "rate"="thtraff"/"traff" where "thtraff"<>0 and "traff"<>0; end @ 2.将存储过程添加到数据库服务器上

3.在客户端编写调用存储过程的主程序 4.运行客户端程序,调用存储过程,观察存储过程执行过程和数据更新情况;调用就用db2 CALL M() 二、触发器实验 1. 针对下列约束条件,分别建立1个触发器: 1)每个小区/扇区最多占用14个TCH频点,合法频点范围在[1,60]之间。当向小区中新加入频点时,如果小区中现有频点数目已达到14个,则用新加入的频点替换现有频点中的最小频点;当修改或新加入频点时,如果发现频点不在合法范围内,则输出提示信息,并拒绝该操作。 create trigger first_1 after insert on FREQUENCY

存储过程和触发器(数据库实验5)

数据库基础与实践实验报告实验五存储过程和触发器 班级:惠普测试142 学号:1408090213 姓名:闫伟明 日期:2016-11-14

1 实验目的: 1)掌握SQL进行存储过程创建和调用的方法; 2)掌握SQL进行触发器定义的方法,理解触发器的工作原理; 3)掌握触发器禁用和重新启用的方法。 2 实验平台: 操作系统:Windows xp。 实验环境:SQL Server 2000以上版本。 3 实验内容与步骤 利用实验一创建的sch_id数据库完成下列实验内容。 1.创建存储过程JSXX_PROC,调用该存储过程时可显示各任课教师姓名及其所教课程名称。 存储过程定义代码: CREATE PROCEDURE JSXX_PROC AS SELECT tn 教师姓名,cn 所教课程FROM T,TC,C WHERE T.tno=TC.tno AND https://www.wendangku.net/doc/9f9166644.html,o=https://www.wendangku.net/doc/9f9166644.html,o 存储过程执行语句与执行结果截图: EXECUTE JSXX_PROC 2.创建存储过程XM_PROC,该存储过程可根据输入参数(学生姓名)查询并显示该学生的学号、 所学课程名称和成绩;如果没有该姓名学生,则提示“无该姓名的同学”。 存储过程定义代码:

CREATE PROCEDURE XM_PROC @sname VARCHAR(100) AS BEGIN IF EXISTS(SELECT NULL FROM S WHERE sn=@sname) SELECT S.sno 学号,cn 课程,score 成绩FROM S,SC,C WHERE https://www.wendangku.net/doc/9f9166644.html,o=https://www.wendangku.net/doc/9f9166644.html,o AND SC.sno=S.sno AND S.sn=@sname ELSE PRINT'无该姓名的同学。' END 运行截图: 3.创建存储过程XBNL_PROC,该存储过程可根据输入参数(专业名词,默认值为计算机专业), 统计并显示该专业各年龄段男、女生人数。如果没有该专业,则显示“无此专业”。 存储过程定义代码: CREATE PROCEDURE XBNL_PROC @departName VARCHAR(30)='计算机', @begin INT, @end INT AS

数据库原理课程设计实验[创建存储过程与触发器]

存储过程与触发器实验日期和时间: 2016 年 5 月13 日、 星 期五第节 实验室:DJ2-信息管理实验室 班级:学号:姓名: 实验环境: 1.硬件:笔记本电脑 2.软件:SQL Server 2012 实验原理: 存储过程概念:存储过程是事先编好的,存储在数据库中的一组被编译了的T-SQL命令集合,这些命令用来完成对数据库的指定操作。存储过程可以接受用户的输入参数、向客户端返回表格或标量结果和消息、调用数据定义语言(DDL)和数据操作语言(DML)语句,然后返回输入参数。 触发器概念:触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete,update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 实验任务: 此作业成绩得分根据你完成的任务的难度和数量评分,完成后在实验室给老师演示验收,课后提交电子版报告。如额外完成自拟题目应当事先将所拟题目提交给老师或在报告中明确标注题意。

假定有学校的图书馆管理信息系统,可以用于日常管理书库和同学们的借还书工作。以下列出参考的库表情况: 根据管理的业务需求来分析,该管理信息系统的数据库应至少包括如下数据表:(打★号的是必须有的表) 1.★图书现有库存表。作用:记录图书的现有库存情况。至少包括:书号、书名、 作者、简介、类别、价格、出版社、出版日期、现有库存数量、最小库存量、库 存总量、库存位置等。 2.★读者信息表。作用:记录读者信息。至少包括:读者编号、证件类型、证件号 码、姓名、性别、职业(可填写教师、学生、教工、其它……)、所属单位、地 址、联系电话等。 3.★借书记录表。作用:记录借书情况,以及是否归还。至少包括:借阅ID(主 键,可设置为自动编号)、书号、读者编号、借阅数量、借阅日期、是否归还、 管理员编号……等。 4.★还书记录表。作用:记录还书情况。至少包括:还书ID(主键,可设置为自动 编号)、书号、读者编号、归还数量、归还日期、是否超期(超过假设45天为 超期)、超期天数、管理员编号……等。(附:为简化操作,续借可视为归还后 再借)。 5.管理员信息表。作用:记录负责管理书库和借书还书工作的管理员信息。至少包 括:管理员编号、职工编号(在职工档案表中的职工编号)、用户名、密码、管 理员级别等……。 6.职工档案表表。作用:记录职工档案。至少包括: 职工编号、姓名、性别、单 位、职称、职务、出生日期、学历、……其它字段自拟。

实验六 存储过程和触发器

实验六存储过程与触发器 一、目的与要求 1.掌握编写数据库存储过程的方法。 2.掌握建立数据库触发器的方法,通过实验观察触发器的作用与触发条件设置 等相关操作。 二、实验准备 1.了解编写存储过程与调用的T-SQL语法; 2.了解触发器的作用; 3.了解编写触发器的T-SQL语法。 三、实验内容 (一)存储过程 在studentdb数据库中建立存储过程getPractice,查询指定院系(名称)(作为存储过程的输入参数)中参与“实践”课程学习的所有学生学号、姓名、所学课程编号与课程名称,若院系不存在,返回提示信息。 提示:D_Info表中存储了院系代码D_ID,而St_Info表中学号字段St_ID的前两位与之对应,则D_Info表与St_Info表之间的联系通过这两个字段的运算构成连接条件。 1.分别执行存储过程getPractice,查询“法学院”与“材料科学与工程学院” 的学生中参与“实践”课程的所有学生学号、姓名、所学课程编号与课程名称。 create procedure getPractice @D_Name varchar(30) output as begin if not exists (select * from D_Info where D_Name= @D_Name ) print '对不起,该院系不存在' else select st_info、St_ID,C_Info、C_No,C_Name from s_c_info inner join st_info on st_info、St_ID=s_c_info、st_id inner join C_Info on s_c_info、c_no=C_Info、C_No where st_info、St_ID in ( select St_ID from st_info join D_Info on D_Info、D_ID =left(st_info、St_ID,2) where C_Info、C_Type='实践' and D_Info、D_Name= @D_Name ) end go

第3次报告_存储过程和触发器实验

西安邮电大学 (计算机学院) 课内实验报告 实验:存储过程和触发器实验 课程:数据库原理及应用A 班级:计科1405 学号:04141152 学生姓名:高宏伟 任课教师:孟彩霞

一、实验目的 1. 理解存储过程的概念,掌握存储过程的使用方法。 2. 学习触发器的使用,体会触发器执行的时机,加深对触发器功能和作用的理解 二、实验内容 1. 在数据库 JWGL 中,完成第四章例 1,例 3~7 中例题的创建存储过程的操作,并使用EXEC 语句调用这些存储过程执行,观察他们的执行结果。 2. 在 Market 数据库中,完成第四章习题 5 中(1)~(4)创建存储过程的操作。并使用 EXEC 语句调用这些存储过程执行,观察他们的执行结果。 3. 在 Market 数据库上,进一步完成以下操作。 (1) 创建一个存储过程 Goods_Orders1,查看任何指定货物的订单情况,包括订单号、订货客户姓名以及订货数量。 (2) 执行存储过程 Goods_Orders1时,如果没有给出任何参数,则系统会报错,如果希望不给出参数能查出所有货物的订单,则可以用默认参数值来实现。为此要求创建另一个存储过程 Goods'_Orders2来完成此功能。 (3) 创建一个存储过程 Goods_OrderSum,来获得某个货物的订单总额。 4. 在 JWGL数据库中,完成第四章例 8~13 中例题的创建触发器的操作,然后在相关的表上执行 INSERT、UPDATE、DELETE 语句,观察他们的执行结果。 5. 在 Market 数据库中,完成第四章习题 5 中(5)~(9)创建触发器的操作,然后在相关的表上执行 INSERT、UPDATE、DELETE 语句,观察他们的执行结果。 三、实验环境 MS SQL Server 2016 四、实验前准备 1. 学会存储过程的使用。 2. 学会触发器的使用。 五、实验步骤 存储过程 4.1 CREATE PROCEDURE student_course AS SELECT Student.sno,Sname,Cname,Grade FROM Student,Course,SC WHERE Student.Sno=SC.Sno AND https://www.wendangku.net/doc/9f9166644.html,o=https://www.wendangku.net/doc/9f9166644.html,o AND Sname = '程宇轩'; IF EXISTS(SELECT name FROM sysobjects WHERE name= 'student_course'AND type='P') DROP PROCEDURE student_course; 4.2 EXECUTE student_course 4.3 CREATE PROCEDURE student_course1 @StudentName VARCHAR(10) AS SELECT Student.Sno,Sname,Cname,Grade FROM Student,Course,SC WHERE Student.Sno=SC.Sno AND https://www.wendangku.net/doc/9f9166644.html,o=https://www.wendangku.net/doc/9f9166644.html,o AND Sname=@StudentName; EXECUTE student_course1 '李书豪' 4.4 CREATE PROCEDURE student_insert @Sno CHAR(8),@Sname VARCHAR(10),@Sex CHAR(2),@Age TINYINT,@Sdept VARCHAR(20)

存储过程与触发器 实验报告

信息工程学院实验报告 课程名称:《数据库原理》 实验项目名称:存储过程与触发器 一、实验目的: (1)了解存储过程的概念 (2)掌握创建、执行存储过程的方法 (3)了解查看、修改和删除存储过程的方法 (4)了解触发器的概念 (5)掌握创建触发器的方法 (6)掌握查看、修改、删除触发器信息的方法 二、实验设备与器件 Win7 +Sql server 2008 三、实验内容与步骤 (一)存储过程 运行实验四附录中的SQL语句,准备实验数据。然后创建下列存储过程,并调试运行存储过程,查看运行结果。 1.在企业管理器中创建一个名为StuInfo的存储过程,完成的功能是在student表中查询系号为D2的学号、姓名、性别、年龄、系号的内容。 CREATE PROCEDURE StuInfo AS SELECT SNO AS学号, SNAME AS姓名, SSEX AS性别, SAGE AS年龄, DNO AS系号 FROM student WHERE DNO='D2' 结果: stuinfo 2.使用T_SQL语句创建存储过程,完成的功能是在表student,course和study中查询以下字段:学号、姓名、性别、课程名称、考试分数。

use mydb --查询是否已存在此存储过程,如果存在,就删除它 if exists(select name from sysobjects where name='StuScoreInfo'and type='P') drop procedure StuScoreInfo go --创建存储过程 CREATE PROCEDURE StuScoreInfo as select student.sno as学号, sname as姓名, ssex as性别, https://www.wendangku.net/doc/9f9166644.html,ame as课程名称, study.grade as考试分数 from student,course,study where student.sno=study.sno and https://www.wendangku.net/doc/9f9166644.html,o=https://www.wendangku.net/doc/9f9166644.html,o 结果: StuScoreInfo 3.使用T_SQL语句创建一个带有参数的存储过程stu_sno_info,该存储过程根据传入的学生编号,在student表中查询此学生的信息。 if exists(select name from sysobjects where name='stu_info'and type='P') drop procedure stu_info go --创建存储过程 create procedure stu_info @sno varchar(8) as select sno as学号, sname as姓名, ssex as性别, sage as年龄, dno as年级

实验6 数据库实验——存储过程和触发器

实验6 存储过程与触发器 一、实验目的 1、加深与巩固对存储过程与触发器概念的理解。 2、掌握触发器的简单应用。 3、掌握存储过程的简单应用。 二、实验内容 一)存储过程: 1、创建一存储过程,求l+2+3+…+n,并打印结果。 CREATE PROCEDURE addresult AS DECLARE @n int=10,/*最后一个数*/ @i int=0, @result int=0 /*结果*/ BEGIN WHILE(@i<=@n) BEGIN SET @result=@result+@i SET @i=@i+1 END PRINT'1+2+3+、、、+n的结果就是:' PRINT @result RETURN(@result) END GO 2.调用上面的addresult存储过程,打印l十2+3+…+10的结果。EXEC addresult

3、修改上述存储过程为addresult1,使得@n为输入参数,其具体值由用户调用此存储过程时指定。 CREATE PROCEDURE addresult1 @n int=10 /*最后一个数*/ AS DECLARE @i int=0, @result int=0 /*结果*/ BEGIN WHILE(@i<=@n) BEGIN SET @result=@result+@i SET @i=@i+1 END PRINT'1+2+3+、、、+n的结果就是:' PRINT @result RETURN(@result) END GO 4、调用上面修改后的addresult1存储过程,打印l+2+3+…+100的结果。 EXEC addresult1 100 5.修改上述存储过程为addresult2,将@n参数设定默认值为10,并改设@sum为输出参数,让主程序能够接收计算结果。

实验五:触发器和存储过程

实验五:触发器和存储过程 一.实验目的:理解触发器和存储过程的含义,掌握用SQL语句实现触发器和存储过程的编写,并初步掌握什么情况下使用事务。 二.实验内容: 有一个小型的图书管理数据库,包含的表为: bookstore(bookid,bookname,bookauthor,purchasedate,state);--图书库存表 borrowcard(cardid,ownername);--借书证表 borrowlog(cardid,bookid,borrowdate,returndate);--借书记录表 写一个存储过程,实现借书操作,要求有事务处理。(1)读者借书,要先设置书籍不在库标志state(借出),然后增加借书记录,在同一事务中完成。(2)要求在事务执行过程中引入错误触发事件,以此体会事务的错误保护机制和事务编程的作用。(3)要求用触发器实现表的完整性控制。 三、操作与运行 1.创建图书数据库: create table bookstore (bookid int not null primary key, bookname char(20), bookauthor char(20),

purchasedate datetime, state char(4) ) create table borrowcard (cardid int not null primary key, ownername char(20) ) create table borrowlog (cardid int not null, bookid int not null, borrowdate datetime, returndate datetime, primary key(cardid,bookid), ---foreign key(cardid)references borrowcard(cardid), ---foreign key(bookid)references bookstore(bookid) ) 通过以上语句,可以看到数据库中的表建立成功。 2.创建存储过程: create proc book_borrow @mycardid_in int, @mybookid_in int, @str_out char(30) output

数据库存储过程与触发器实验报告

南昌航空大学实验报告 二00 年月日 课程名称:数据库概论实验名称:数据库存储过程与触发器 班级:122031 姓名:同组人: 指导教师评定:签名: 一、实验环境 1.Windows2000或以上版本; 2.SQLServer 2005。 二、实验目的 熟悉不同数据库的存储过程和触发器,重点实践SQL Server2005,掌握SQL Server2005中有存储过程与触发器的相关知识。 三、实验要求 完成实验指导书中p115-7和p132 -4。 四、实验步骤及参考源代码 1.创建与执行存储过程 create procedure C_P_Proc as select distinct https://www.wendangku.net/doc/9f9166644.html,o,cna,pna,num from paper,customer,cp where https://www.wendangku.net/doc/9f9166644.html,o=https://www.wendangku.net/doc/9f9166644.html,o and paper.pno=cp.pno and cna='李涛' or cna='钱金浩' go execute C_P_Proc 2.删除存储过程 drop procedure C_P_Proc 3.创建插入触发器 create trigger TR_PAPER_I ON PAKER12203125 FOR INSERT AS DECLARE @appr float DECLARE @apno int SELECT @appr=ppr,@apno=pno from inserted begin if @appr<0 or @appr is null begin

raiserror('报纸的单价为空或小于!',16,1) update paper set ppr=10 where paper.pno=@apno end end 4.创建删除触发器 create Trigger TR_PAPER_D on PAKER12203125 after delete as declare @ipno char(6) declare @icount int; select @icount= count(*) from deleted,cp where deleted.pno=cp.pno if @icount>=1 begin select @ipno=pno from deleted raiserror('级联删除cp表中的数据',16,1) delete from cp where cp.pno=@ipno end 5.创建修改触发器 create trigger TR_PAPER_U ON PAKER12203125 for update as declare @ippr float select @ippr=ppr from inserted if @ippr<0 or @ippr is null begin raiserror('输入单价不正确',16,1) rollback transaction end 6. 分别对PAKER12203125表进行插入、修改、删除操作 insert into PAKER12203125 (pno,pna,ppr)values('000006','江西日报','1') insert into PAKER12203125 (pno,pna,ppr)values('000007','江南都市报','15.5') delete from PAKER12203125 where pno='000001' update PAKER12203125 set ppr=12.5 where pno='000002' update PAKER12203125 set ppr=-2 where pno='000004' 五、实验结果

第6章_存储过程与触发器练习题

有教师表(教师号,教师名,职称,基本工资),其中基本工资的取值与教师职称有关。实现这个约束的可行方案是( )。 A 在教师表上定义一个视图 B 在教师表上定义一个存储过程 C 在教师表上定义插入和修改操作的触发器 D 在教师表上定义一个标量函数 参考答案 C 在SQL SERVER中,执行带参数的过程,正确的方法为()。 A 过程名参数 B 过程名(参数) C 过程名=参数 D ABC均可 参考答案 A 在SQL SERVER服务器上,存储过程是一组预先定义并()的Transact-SQL语句。 A 保存 B 解释 C 编译 D 编写 参考答案 C 在SQL Server中,触发器不具有()类型。 A INSERT触发器 B UPDATE触发器 C DELETE触发器 D SELECT触发器 参考答案 D

()允许用户定义一组操作,这些操作通过对指定的表进行删除、插入和更新命令来执行或触发。 A 存储过程 B 规则 C 触发器 D 索引 参考答案 C 为了使用输出参数,需要在CREATE PROCEDURE语句中指定关键字( )。 A OPTION B OUTPUT C CHECK D DEFAULT 参考答案 B 下列( )语句用于创建触发器。 A CREATE PROCEDURE B CREATE TRIGGER C ALTER TRIGGER D DROP TRIGGER 参考答案 B 下列( )语句用于删除触发器。 A CREATE PROCEDURE B CREATE TRIGGER C ALTER TRIGGER D DROP TRIGGER 参考答案 D

实验八 存储过程和触发器_参考答案

实验八存储过程和触发器 一、目的与要求 1. 正确理解存储过程和触发器的概念、功能和类型; 2. 掌握使用SSMS和T-SQL语句创建和管理存储过程和触发器。 二、上机准备 利用教师提供的XSGL数据库,该库中有3个表:student,course,sc。 三、实验内容 1. 将教师提供的XSGL数据库附加到本地数据库中。 2. 分别使用SSMS和T-SQL语句创建和管理存储过程和触发器。 (1)创建一个存储过程proc_stud_sc_info,查询学号、姓名、性别、系、课程号和成绩等信息。 use xsgl go create procedure proc_stud_sc_info as select student.sno,sname,sex,dept,cno,grade from student left join sc on student.sno=sc.sno go (2)创建一个存储过程proc_stud_info,根据输入的学号,查询学生的基本信息。 use xsgl go create procedure proc_stud_info @sno char(5)='95001' as select * from student where sno=@sno go (3)创建一个存储过程proc_stud_birth_year,根据输入的学生姓名,计算该学生的出生年份。 use xsgl go create procedure proc_stud_birth_year @sname varchar(6)='张立' as select sname,year(getdate())-age as 出生年份 from student where sname=@sname go

创建存储过程与触发器

实验7 创建存储过程与触发器 实验日期和时间:2011-11-11 实验室:2#206 班级:09计本(4)学号:2009810182 姓名:周伟 实验环境: 1.硬件:1G内存 1.73GHz 2.软件:SQL server2008 实验原理: 创建存储过程,执行存储 通过建立触发器实现对数据库的更新。 实验任务: 此作业成绩得分根据你完成的任务的难度和数量评分,完成后在实验室给老师演示验收,课后提交电子版报告。如额外完成自拟题目应当事先将所拟题目提交给老师或在报告中明确标注题意。 假定有某个企业(或公司,或代理商)经销某类产品,需要用一个信息系统对销售业务和库存进行管理。 首先,他们得在数据库中存储所有经营过的产品的信息,并建立现有库存的信息表; 其次,对于每次销售或者进货,他们都得记录下来以便进行管理,将来对这些信息进行统计或财务管理;再次,在每笔销售记录中需要记录相关客户信息,在进货时需要记录相关供应商的信息,也为了与不同的供应商和客户进行联系,需要分别建立二者的信息表。综上所述,在以上建立的数据库中我们至少需要以下几个基本表: 1.产品表(记录公司曾经经营的所有产品信息) 2.现有库存表(记录公司目前经营的产品的现有库存信息) 3.出库单表(记录产品销售出库时的情况:时间、销售员、客户、商品编码、 商品数量等) 4.入库单表(记录公司每次产品进货入库时的信息) 5.供应商表(记录为公司供货的主要供应商信息) 6.客户表(记录公司的所有客户信息) 以下是供参考的表结构的部分信息,同学们可以根据题意自行修改表的结构 1.产品表(记录公司的产品信息) 字段名数据类型长度备注 产品编号文本主键 产品名称文本非空 类别文本 供应商编号文本外键(来自供应商表) 产地文本 最新参考单价货币

实验3 SQL Server的视图、存储过程和触发器

实验三 SQL Server的视图、存储过程和触发器 一、实验目的 本实验主要了解SQL Server视图、存储过程和触发器的基本概念和使用方法。通过本实验,读者将掌握视图的创建、修改和删除的操作方法和T-SQL语句;学会在SSMS中创建、修改、执行和删除存储过程的操作及相关的T-SQL语句;掌握触发器的创建、修改和删除的操作方法和T-SQL语句。 二、实验环境 ●Microsoft SQL Server Managerment Studio ●Book数据库 三、实验内容 1. 创建视图view_book1,使其包含预订数量最高的20%的教材信息。要求显示教材代号(BookCode)、教材名称(BookName)、ISBN号(ISBNCode)和出版社名称(Publisher)。 2. 创建视图view_book2,查询预订了教材名中含有“程序”一词的教师姓名(TeacherName)和所在学院名称(AcadName)。 3. 创建视图view_book3,使其包含“学院名称(AcadName)”、“教师姓名(TeacherName)”、“预订书名(BookName)”、“是否领走(TakeAway)”。 4. 创建存储过程proc_book1,查询指定学院的教师预订教材的情况。要求显示教材名称(T_BookInfo.BookName)、教师姓名(T_Teacher.TeacherName)和教材数量(T_BookOrder.StuBookNum+T_BookOrder.TeaBookNum)。 (1) 查询条件为:学院代码 (2) 查询条件为:学院名称 5. 创建存储过程proc_book2,查询指定教材的预订数量。 6. 创建添加教材信息的存储过程proc_book3。 7. 创建存储过程proc_book4,查询指定教材名称和出版社名称的教材所对应的教材代号和库存。 8. 创建触发器tri_book1,在对T_Teacher表进行插入、修改和删除记录时,都会自动显示表中的内容。 9. 创建触发器tri_book2,当修改T_Teacher表中的TeacherCode字段值时,该字段在T_BookOrder表中的对应值也作修改。 10. 创建触发器tri_book3,检查插入在T_BookInfo表中的教材库存(StockNum)是否大于等于0。 11. 创建触发器tri_book4,当删除教师信息时同步删除T_BookOrder表中对应教师所预订的教材记录。

实验五 存储过程和触发器(计科)

实验五:触发器和存储过程 一、实验目的:理解触发器和存储过程的含义,掌握用SQL语句实现触发器和存储过程的编写,并初步掌握什么情况下使用事务。 二、预习要求:存储过程和触发器的相关概念,事务的相关概念,编写相应的SQL语句。 三、实验内容: 有一个小型的图书管理数据库,包含的表为: bookstore(bookid,bookname,bookauthor,purchasedate,state); --图书库存表 borrowcard(cardid,ownername);--借书证表 borrowlog(cardid,bookid,borrowdate,returndate);--借书记录表 写一个存储过程,实现借书操作,要求有事务处理。(1)读者借书,要先设置书籍不在库标志state(借出),然后增加借书记录,在同一事务中完成。(2)要求在事务执行过程中引入错误触发事件,以此体会事务的错误保护机制和事务编程的作用。(3)要求用触发器实现表的完整性控制。 四、完成情况(附上设计的SQL语句)。 ------触发器和存储过程 ------触发器和存储过程 CREATE DATABASE BOOK1 go use BOOK1 CREATE TABLE BOOKSTORE(Bookid nvarchar(10),Bookname nvarchar(10),Bookauthor nvarchar(10),purchasedate datetime,state Nvarchar(10),primary key(Bookid)) Create table Borrowcard(Cardid int,ownername nvarchar(10),primary key(Cardid)) Create table Borrowlog(Cardid int,Bookid nvarchar(10),borrowdate datetime,returndate datetime ,primary key(Cardid,Bookid))

存储过程和触发器实验报告

数据库技术与应用 实验报告七 班级:机械因材学号: 16 姓名:高永吉 一:实验名称:存储过程及触发器 二.实验目的: ⑴使用系统常用的存储过程; ⑵掌握存储过程的创建及应用 (3) 理解触发器的概念; (4) 掌握触发器的创建及应用。 三.实验内容、过程和结果: 存储过程 1创建一个存储过程.查看学号为1(根据实际情况取)的学生的信息.包括该学生的学号.班级编号.姓名。(提示:查询涉及到表Student)2执行1中创建的存储过程。 3使用输入参数创建题1中的存储过程。题1中所创建的存储过程只能学号为1的学生信息进行查看.要想对其他学生进行查看.需要进行参数传递。 4执行3中创建的存储过程.(1)按位置传递参数;(2)通过参数名传递参数; 5触发器 1)在课程表Course上创建一个触发器.该触发器被操作DELETE所触发.且要求触发触发器的DELETE语句在执行被取消。

2)在表Student中建立插入触发器, 插入一条记录时.若年龄>100或者年龄<=0,拒绝插入记录并显示:“年龄不符合规定.无法插入此记录!”; 3)创建一个触发器.如果在Student表中添加或更改数据.向客户端显示一条消息“你正在插入或修改学生表的数据”.要求触发触发器的DELETE、UPDATE语句被执行。 4 )为Course表创建一个名称为my_trig的触发器.当用户成功删除该表中的一条或多条记录时.触发器自动删除Student表中与之有关的记录。 5 )使用系统存储过程查看创建的触发器。 图一:创建一个存储过程.查看Tno为1(根据实际情况取)的教师的信息.包括该教师的姓名.sal

11计科 张小华 数据库实验十一 存储过程与触发器

西安思源学院数据库实验报告 实验名称:存储过程与触发器 班级:11计算机科学与技术学号:111102020104 姓名:张小华 指导教师:王英强 实验时间:2013年5月 成绩:

实验11存储过程与触发器 1.实验目的 (1)掌握创建存储过程和触发器的方法和步骤。 (2)掌握存储过程和触发器的使用方法。 2.实验准备 (1)了解存储过程和触发器的基本概念和类型。 (2)了解创建存储过程和触发器的SQL语句的基本用法。 (3)了解查看、执行、修改和删除存储过程的SQL语句的用法。 (4)了解查看、修改和删除触发器的SQL语句的用法。 3.实验内容 (1)使用存储过程: ①使用student数据库中的“学生”、“课程注册”、“课程”、表创建一个不带参数的存储过程(kcxd)。该存储过程的功能是:显示所有学生的学号、选修的课程名和课程成绩。 .执行kcxd存储过程,显示所有学生的学号、选修课程和课程成绩。 源代码: use student go create proc kcxd as select学生.姓名,学生.学号,课程名,成绩 from学生,课程注册,课程 where学生.学号=课程注册.学号and课程.课程号=课程注册.课程号 go

执行kcxd代码: use student go exec kcxd go ②使用student数据库中的“学生”、“课程注册”、“课程”、表创建一个不带参数的存储过程(cjxc)。该存储过程的功能是:当任意给定一个学生的姓名时,将显示该学生的学号,选修的课程名和课程成绩,若没有给定学生的姓名,则显示所有学生的学号、选修的课程名和课程成绩。 .执行cjcx存储过程,查询“周红梅”的学号、选修课程和课程成绩。 .执行cjcx存储过程,不指定参数值。 .使用系统存储过程sp_helptxt查看存储过程cjcx的文本信息。 源代码: use student go create proc cjkx @student_name char(10) as if @student_name='' begin select学生.姓名,学生.学号,课程名,成绩 from学生,课程注册,课程 where学生.学号=课程注册.学号and

实验四-存储过程与触发器、函数

《数据库原理》实验报告 一、实验目的: ●掌握创建存储过程的方法和步骤。 ●掌握创建触发器的方法和步骤。 ●掌握用户自定义函数的类型及使用方法。 二、实验使用环境: SQL server 2008、 SQL server 2008、SQL server 2012 三、实验内容与完成情况: 运行截图: 解题思路:用default(getdate())来设置默认时间,getdate()表示系统时间。Primart key设置主键--题目1 create table Inventory( Goo_no char(8)not null, Prices money, Inv_num int, Inv_date datetime default(getdate())not null,--默认为系统时间 primary key (Goo_no,Inv_date)--主码为商品编号、入库时间 )

运行截图: 解题思路:select新建表,通过满足1=0时插入来插入空表。 --题目2 select*into PurchaseBbak--新建表 from Purchase where 1=0 --插入空记录 select*into SellBak from Sell where 1=0 go create trigger Pur_Insert on Purchase for insert--创建触发器,当对Purchase表做插入操作时触发 as begin declare@N_Goo_no char(8),@N_Goo_price money,@N_Goo_num int,@N_Pur_date date--声明临时变量 select@N_Goo_no=Goo_no from inserted select@N_Goo_price=Pur_price from inserted--对临时变量进行赋值 select@N_Goo_num=Pur_num from inserted select@N_Pur_date=Pur_date from inserted if exists(select Goo_no from Inventory where@N_Goo_no=Goo_no)--判断插入的是否已经存在

实验六 存储过程和触发器

实验六使用SQLServer查询分析器创建存储过程和触发器 一、实验目的 (1) 掌握存储过程的实现; (2) 掌握触发器定义和使用; (3) 利用存储过程和触发器维护数据完整性; (4) 了解使用存储过程来进行数据库应用程序的设计。 二、实验内容 (1) 编写存储过程; (2) 创建触发器。 三、实验步骤:(包含实验记录,提供的数据、图表等资料内容) 1、对教学管理数据库,编写存储过程,完成下面功能: (1)①创建一个无参存储过程StuScoreInfo,查询以下信息:学号、姓名、性 别、课程名称、考试成绩。 ②写出存储过程的调用语句。 (2) ①创建一个带参数的存储过程stu_info,该存储过程根据传入的学生编号 在S表中查询此学生的信息。 ②写出存储过程的调用语句。 (3) ①创建一个带参数的存储过程StuScoreInfo2,该存储过程根据传入的学生 编号和课程号查询以下信息:学号、姓名、性别、课程名称、考试成绩。 ②写出存储过程的调用语句。 (4) ①编写带参数的存储过程,根据传入的课程名称统计该课程的平均成绩。 ②写出存储过程的调用语句。 2、对教学管理数据库,编写触发器,完成下面功能: (1) 在SC表上创建一个删除学生成绩事件的触发器,触发动作为输出:“对 不起,学生成绩不允许删除”,并且回滚删除事务。 (2) 创建一个删除学生的触发器,删除学生前要先删除学生成绩。 (3) 创建一个AFTER触发器,完成的功能是:在sc表上创建一个插入、更新 类型的触发器scCheck,当在sc表的grade字段中插入或修改考试分数后,触

发该触发器,检查分数是否在0-100之间,如果不在0-100之间就输出“输入分数错误”。 (4) 定义一个学生查询所有选课成绩的视图VIEW_SC,要求显示学号、学生 姓名、课程名、学分、成绩。在该视图上创建一个插入数据的INSTEAD OF 触发器,代替插入命令执行查询操作。 四、实验报告要求 1、用SQL表示实验内容里的相应语句; 2、列出遇到的问题和解决办法; 3、列出没有解决的问题; 4、写明实验所采用的实验环境。(操作系统、数据库管理系统)

第11章 触发器

触 发 器 11.1 练习题11及参考答案 1.什么是触发器?其主要功能是什么? 答:触发器是一种实施复杂数据完整性的特殊存储过程,在对表或视图执行UPDATE 、INSERT 或DELETE 语句时自动触发执行,以防止对数据进行不正确、未授权或不一致的修改。 触发器主要用于保持数据完整性、检查数据有效性、实现数据库管理任务和一些附加的功能。 2.触发器分为哪几种? 答:触发器分为DML 和DDL 触发器: ? DML 触发器:是在执行数据操作语言事件时被调用的触发器,其中数据操作语言 事件包括:INSERT 、UPDATE 和DELETE 语句。触发器中可以包含复杂的T-SQL 语句,触发器整体被看作一个事务,可以进行回滚。 ? DDL 触发器:它也是一种特殊的存储过程,由相应的事件触发后执行。与DML 不同的是,它相应的触发事件是由数据定义语言引起的事件,包括CREATE 、ALTER 和DROP 语句。DDL 触发器用于执行数据库管理任务,如调节和审计数据库运转。DDL 触发器只能在触发事件发生后才会调用执行,即它只能是AFTER 类型的。 3. INSERT 触发器、UPDA TE 触发器和DELETE 触发器有什么不同? 答:它们的主要区别是触发的事件不同,INSERT 触发器由INSERT 操作所触发执行;UPDA TE 触发器由UPDA TE 操作所触发执行;DELETE 触发器由DELETE 操作所触发执行。 4. AFTER 触发器和INSTEAD OF 触发器有什么不同? 答:两者的区别如下: ? AFTER 触发器:在执行了INSERT 、UPDATE 或DELETE 语句操作之后执行 第 章 11

相关文档
相关文档 最新文档