试验三 存储过程和触发器
存储过程及触发器实验报告
存储过程及触发器实验报告实验目的:1、了解存储过程及其应用;2、了解触发器及其应用;3、掌握使用存储过程及触发器完成数据操作的方法。
实验过程:1、存储过程存储过程是指一组为了完成特定功能的SQL语句集合。
存储过程可以接收传入参数并返回处理结果。
存储过程的好处是可以减少网络流量,提高性能,增加安全性。
在本次实验中,我们将学习如何创建存储过程。
首先,在MySQL中打开MySQL Workbench,进入我们的实验数据库。
然后我们就可以创建一个存储过程了。
创建存储过程的语法如下:CREATE PROCEDURE procedure_name ()BEGIN-- SQL statementsEND;在这个语法中,procedure_name是我们想要创建的存储过程的名称。
在BEGIN和END 之间,我们可以输入一组SQL语句,这些语句将组成存储过程的主体内容。
我们可以以一个创建一个简单的存储过程作为例子,这个存储过程的作用是输出一条信息。
我们将这个存储过程命名为print_message。
在上面的语句中,我们定义了一个存储过程,它被命名为print_message。
它只包含一条SELECT语句,这条语句将输出Hello, World!这个字符串。
创建完存储过程之后,我们可以通过CALL语句来调用它:CALL print_message();执行这个语句后,我们将会看到Hello, World!这个字符串输出到屏幕上。
2、触发器触发器是一种被动的对象,它是由数据库管理系统在数据表上自动执行的一些操作。
当数据表中发生某些指定的操作时,触发器就会被调用执行。
触发器通常用于数据表中的数据变更操作,比如插入、更新和删除。
在本次实验中,我们将学习如何创建和使用触发器。
在MySQL中创建触发器的语法如下:CREATE TRIGGER trigger_name{BEFORE | AFTER} trigger_event ON table_nameFOR EACH ROW trigger_body;在这个语法中,trigger_name是我们想要创建的触发器的名称。
触发器与存储过程的建立与使用
whereemp_name='刘刚')
命令已成功完成。
10.
createproceduresearchman
as
begin
declaresearchcursorfor
selectemp_no
fromemployee
whereemp_namelike'李%'andtitle='职员'
go
命令已成功完成。
execproaddemployee'E0022','罗刚','M','业务','经理','12/7/2009','01/01/1987',15000,'都匀市'
select*
fromemployee
8.
createprocedureproesc
as
begin
declare@emp_nochar(5),@emp_namechar(10),@ccust_idchar(5),@cust_namechar(20),@scust_idchar(5),@sale_idchar(5),@tot_amtnumeric(9,2)
begin
fetchnextfromcur_cus_new
select"fecth_status值"=@@FETCH_STATUS
end
select"cursor读取状态"=cursor_status('variable','@cur_cus_new')
3.
createtriggerdelelteemployee
数据库原理课程设计报告报告实验创建存储过程与触发器
存储过程与触发器实验日期和时间:2016 年 5 月13 日、星期五第节实验室:DJ2-信息管理实验室班级:学号:姓名:实验环境:1.硬件:笔记本电脑2.软件:SQL Server 2012实验原理:存储过程概念:存储过程是事先编好的,存储在数据库中的一组被编译了的T-SQL命令集合,这些命令用来完成对数据库的指定操作。
存储过程可以接受用户的输入参数、向客户端返回表格或标量结果和消息、调用数据定义语言(DDL)和数据操作语言(DML)语句,然后返回输入参数。
触发器概念:触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。
触发器经常用于加强数据的完整性约束和业务规则等。
实验任务:此作业成绩得分根据你完成的任务的难度和数量评分,完成后在实验室给老师演示验收,课后提交电子版报告。
如额外完成自拟题目应当事先将所拟题目提交给老师或在报告中明确标注题意。
假定有学校的图书馆管理信息系统,可以用于日常管理书库和同学们的借还书工作。
以下列出参考的库表情况:根据管理的业务需求来分析,该管理信息系统的数据库应至少包括如下数据表:(打★号的是必须有的表)1.★图书现有库存表。
作用:记录图书的现有库存情况。
至少包括:书号、书名、作者、简介、类别、价格、出版社、出版日期、现有库存数量、最小库存量、库存总量、库存位置等。
2.★读者信息表。
作用:记录读者信息。
至少包括:读者编号、证件类型、证件号码、姓名、性别、职业(可填写教师、学生、教工、其它……)、所属单位、地址、联系电话等。
3.★借书记录表。
作用:记录借书情况,以及是否归还。
至少包括:借阅ID(主键,可设置为自动编号)、书号、读者编号、借阅数量、借阅日期、是否归还、管理员编号……等。
存储过程、函数与触发器操作答案
《存储过程、函数与触发器操作》实验一、实验目的与要求1、掌握存储过程的使用。
2、掌握函数的使用。
3、掌握触发器操作。
三、实验内容一、存储过程1、在“教务管理系统”数据库中创建一个名为ProcStudentInfo的存储过程,它返回学生的学号、姓名、性别、班级编号、年级和籍贯信息。
CREATE PROCEDURE Proc_StudentInfoASSELECT 学号,姓名,性别,班级编号,年级,籍贯FROM 学生信息2、用EXECUTE执行Proc_StudentInfo存储过程。
EXECUTE Proc_StudentInfo3、创建一个存储过程,用于返回“教务管理系统”数据库上某个班级中所有学生的信息。
CREATE PROCEDURE Proc_GetClassStudent1@ClassID varchar(14)ASSELECT 学号,姓名,性别,班级编号,年级,籍贯FROM 学生信息WHERE 班级编号=@ClassID4、创建一个存储过程,用于返回“教务管理系统”数据库上某个班级中所有学生的信息,默认班级编号为'20031340000102' 。
CREATE PROCEDURE Proc_GetClassStudent2@ClassID varchar(14)= '20031340000102'ASSELECT 学号,姓名,性别,班级编号,年级,籍贯FROM 学生信息WHERE 班级编号=@ClassIDEXECUTE Proc_GetClassStudent2 '20031340000103'5、创建一个返回执行代码为100的存储过程。
CREATE PROCEDURE Proc_GetClassStudent4@ClassID varchar(14)ASBEGINSELECT 学号,姓名,性别,班级编号,年级,籍贯FROM 学生信息WHERE 班级编号=@ClassIDRETURN 100END6、执行存储过程Proc_GetClassStudent2和Proc_GetClassStudent4,并定义两个个变量存储执行返回代码。
存储过程和触发器(实验报告)
WITH ENCRYPTION AS
SELECT*
FROM student_info
WHERE性别='男'
EXEC stu_en
DROP PROCEDURE stu_en
4.使用grade表。
(1)创建一个存储过程stu_g_r,当输入一个学生的学号时,通过返回输出参数获取该学生各门课程的平均成绩。
CREATE PROC stu_g_r @stu_no varchar(8)=NULL,
@stu_score real OUTPUT
AS
SELECT@stu_score=AVG(分数)
FROM grade
WHERE (学号=@stu_no)
(2)执行存储过程stu_g_r,输入学号0002。
DECLARE @score real
WHERE (a.姓名=@stu_name)
EXEC stu_g_p ‘刘卫平’
sp_helptext stu_g_p
3.使用student_info表。
(1)创建一个加密的存储过程stu_en,查询所有男学生的信息。
(2)执行存储过程stu_en,查看返回学生的情况。
(3)使用Transact-SQL语句DROP PROCEDURE删除存储过程stu_en。
(3)掌握通过SQL Server管理平台和Transact-SQL语句Alter procedure修改存储过程的方法;
(4)掌握通过SQL Server管理平台和Transact-SQL语句Drop procedure删除存储过程的方法;
(5)掌握通过SQL Server管理平台和Transact-SQL语句Create trigger创建触发器的方法和步骤;
存储过程与触发器实验报告
存储过程与触发器实验报告一、引言存储过程和触发器是数据库中常用的高级功能,它们能够提高数据库的性能、数据一致性和安全性。
本实验报告将详细介绍存储过程和触发器的概念、用途以及实际应用。
二、存储过程2.1 概念存储过程是一组预定义的SQL语句集合,它们被命名并存储在数据库中,可以作为一个单元来调用和执行。
存储过程可以接受参数,并返回一个或多个结果集。
存储过程可以在应用程序层面减少网络传输,提高数据库性能。
2.2 用途存储过程的应用非常广泛,主要用于以下几个方面: 1. 数据库业务逻辑封装:将复杂的业务逻辑封装到存储过程中,使应用程序只需调用存储过程而不需要编写大量的SQL语句,简化应用程序的开发。
2. 数据库性能优化:通过存储过程可以减少网络传输,提高数据库性能。
3. 数据库安全性:通过存储过程,可以实现对数据库的访问权限控制,提高数据库的安全性。
2.3 示例下面以一个简单的示例来说明存储过程的使用。
2.3.1 创建存储过程CREATE PROCEDURE `get_employee_by_department` (IN department_id INT)BEGINSELECT * FROM employee WHERE department_id = department_id;END2.3.2 调用存储过程CALL `get_employee_by_department`(1);2.4 优化技巧为了进一步提高存储过程的性能,可以采用以下优化技巧: 1. 减少存储过程的参数:过多的参数会增加网络传输的负担,应尽量减少存储过程的参数数量。
2. 避免长时间占用资源:存储过程应尽量快速执行,避免长时间占用数据库资源。
三、触发器3.1 概念触发器是与表相关联的特殊类型的存储过程,它在表的数据发生变化时自动执行。
触发器可以监视INSERT、UPDATE或DELETE等操作,并在这些操作发生时自动触发执行一段预定义的代码。
存储过程及触发器实验报告
数据库技术与应用实验报告七班级:机械因材学号: 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图二执行1中创建的存储过程。
图三使用输入参数创建题1中的存储过程。
图四执行3中创建的存储过程,(按位置传递参数)图五执行3中创建的存储过程通过参数名传递参数;图六使用系统存储过程查看3中创建的存储过程图七删除3中创建的存储过程。
图八在Teacher上创建一个触发器,该触发器被操作DELETE所触发,且要求触发触发器的DELETE语句在执行被取消。
触发器和存储过程
DBMS
OS
DB
由于要设计自己的多任务处理机制和调度算法, 使得N+1方案的DBMS设计在整体上比2N方案要复杂。
Server要处理所有用户的申请,如果调度策略不当或
不能使数据库进程获得较高的优先权,这种方案将导 致瓶颈。 另外,N+1方案中要用到操作系统级的消息机制 以实现多进程向单进程以及单进程向多进程的数据传
针对强制关联关系, 建立触发器。
注意引用完整性
数据录入、修改
数据查询、报表
View
存储过程
T_student
T_teacher
T_Course
T_grade
触发器
三、 DBMS的基本功能和系统结构
1、DBMS的基本功能
◆ 数据库定义
对数据库的结构进行描述,包括外模式、模式、 内模式的定义;数据库完整性的定义;安全保密定义 (如用户口令、级别、存取权限);存取路径 (如索引)
2、设计有效索引 注 意:如果一项查询中,需访问表中多于20%的行, 则使用表扫描比使用索引效率高。 使用索引的指导方针:
● 适量使用索引 ● 不要索引较小的表(比如只有几百行) ● 尽可能使用较少的索引键列
● 尽可能使用覆盖查询(即查询内容包含于索引列
中,则只有索引被访问,表本身被“绕”过)
数据库设计中需要深入考虑的问题
的结果。
存储过程潜在的缺点如下:
1、难以保持负荷平衡。
存储过程提出了一种在服务器上集中处理的模型,
用集中处理代替事务的分布处理。这种方法,除非服 务器的性能进行了优化,符合存储过程运行的需求, 否则它会降低服务器的性能。 2、增加了管理要求。
存储过程是一个共享的资源。管理员必须确保使
存储过程和触发器PPT课件
利用全局变量修改刚才的例子
CREATE PROCedure sp_getemp;3 (@salary int =NULL) AS SELECT * FROM 职工 WHERE 工资 >
@salary IF @@ERROR = 0 RETURN 0 ELSE RETURN -1
例:执行以上存储过程。
DECLARE @status int EXECUTE @status=sp_getemp;3 @salary =1200 print @status
存储过程的修改和删除
• 修改存储过程的语句是(一般格式):
ALTER PROC[edure] procedure_name [ ; number ] [ @parameter data_type [ = default ], … ] AS sql_statement
无论什么时候执行存储过程,总要返回 一个结果码,用以指示存储过程的执行状态。 如果存储过程执行成功,返回的结果码是0; 如果存储过程执行失败,返回的结果码一般 是一个负数,它和失败的类型有关。我们在 创建存储过程时,也可以定义自己的状态码 和错误信息。
常用的存储过程返回状态表
0
过程成功执行
-1
对象丢失
它们的使用 • 插入类触发器 • 删除类触发器 • 更新类触发器 • 触发器的相关操作 • 修改删除触发器
建立触发器的语句
CREATE TRIGGER trigger_name
ON table
FOR { INSERT | UPDATE | DELETE }
AS
[IF UPDATE(column) [{AND | OR} UPDATE(column)…]] ss qtrli_ggsetar_tenmameen:t 给出了触发器的名称;
《SQL Server 数据库》数据库存储过程、触发器的创建于管理实验报告
北华航天工业学院《数据库系统管理》实验报告报告题目:存储过程、触发器的创建于管理所在系部:计算机科学与工程系所在专业:网络工程专业学号:姓名:教师姓名:完成时间:2011 年10 月19 日北华航天工业学院教务处制存储过程、触发器的创建与管理一、实验目的1、掌握存储过程的概念、优点、特点及用途;2、掌握创建、执行、查看、修改和删除存储过程的方法;3、了解触发器和一般存储过程的区别、概念及优点;4、掌握创建、查看、修改和删除触发器的方法。
二、实验内容(一)附加上次实验所创建的数据库“db_Library”,并回顾该数据库的数据表信息。
(二)练习创建和管理存储过程1、使用管理控制台创建一个名为“计算机系借阅信息_PROC”的无参存储过程,要求显示计算机系读者2011-1-1以后借阅的图书信息,包括“读者姓名”、“图书编号”和“借阅日期”三个字段,并执行该存储过程,查看显示结果。
2、使用T-SQL语句创建一个名为“读者借阅信息_PROC”的带参数的存储过程,要求根据输入的读者的编号显示读者的所有借阅信息,包括“读者编号”、“姓名”、“系部”、“图书编号”、“图书名称”和“借阅日期”等字段,并执行该存储过程,查看显示结果。
create proc读者借阅信息_PROC1@dzbh char(10)asbeginselect tb_reader.读者编号,姓名,系部,tb_book.图书编号,书名,借阅日期from tb_book,tb_reader,tb_borrowwhere tb_book.图书编号=tb_borrow.图书编号and tb_reader.读者编号=tb_borrow.读者编号and tb_reader.读者编号=@dzbhend--declare @srcs char(10),@fhzt intset @srcs='R10009'exec @fhzt=读者借阅信息_PROC1 @srcsprint'执行状态值为'+cast(@fhzt as varchar(10))3、使用T-SQL语句创建一个名为“图书借阅信息_PROC”的带参数的存储过程,要求根据输入的图书编号计算该图书的借阅数量,并根据程序执行结果返回不同的值,执行成功返回0,不成功返回错误号,并执行该存储过程,输出图书编号、借阅数量和程序结果返回值。
存储过程和触发器讲解
存储过程和触发器存储过程和触发器是SQL Server的数据库对象。
使用存储过程可以提高应用程序的效率。
触发器可以大大增强应用程序的健壮性、数据库的可恢复性和可管理性。
一、存储过程存储过程是一组T-SQL语句,它们只需编译一次,以后即可多次执行。
存储过程是在SQL Server中定义的子过程,是数据库对象之一。
存储过程可以执行范围很宽的各种操作与业务功能。
比如可以插入、更新或删除表中的数据。
通过传递参数值,存储过程可以判断是选择数据还是执行其他操作。
由于存储过程可以接受输入参数并以输出参数的格式向调用过程或批处理返回多个值;存储过程是包含用于在数据库中执行操作(包括调用其他过程)的编程语句。
此外存储过程可以向调用过程或批处理返回状态值,以指明成功或失败(以及失败的原因)。
故SQL Server 中的存储过程与其他语言中的过程(有时也称:函数)类似。
可以使用 T-SQL EXECUTE 语句来运行存储过程。
存储过程作为 SQL Server 数据库系统中很重要的概念之一,合理的使用存储过程,可以有效地提高程序的性能;并且将商业逻辑封装在数据库系统中的存储过程中,可以大大提高整个软件系统的维护性。
当商业逻辑发生了改变的时候,不再需要修改并编译客户端的应用程序以及重新分发它们到为数众多的用户手中,只需要修改位于服务器端的实现相应商业逻辑的存储过程即可。
使用 SQL Server 创建应用程序时,T-SQL编程语言是应用程序和 SQL Server 数据库之间的主要编程接口。
使用T-SQL程序时,可用两种方法存储和执行程序;一种是将程序存储在本地,然后创建向SQL Server发送命令并处理结果的应用程序;另一种是将程序作为存储过程存储在SQL Server中,然后创建执行过程并处理结果的应用程序。
在SQL Server中使用存储过程而不使用存储在客户端计算机本地的T-SQL程序,原因在于存储过程具有以下的好处:✓存储过程已在服务器注册。
存储过程、触发器和函数实验讲述
存储过程、触发器和用户自定义函数实验实验内容一练习教材中存储过程、触发器和用户自定义函数的例子。
教材中的BookSales数据库,在群共享中,文件名为BookSales.bak。
实验内容二针对附件1中的教学活动数据库,完成下面的实验内容。
1、存储过程(1)创建一个存储过程,该存储过程统计“高等数学”的成绩分布情况,即按照各分数段统计人数。
(2)创建一个存储过程,该存储过程有一个参数用来接收课程号,该存储过程统计给定课程的平均成绩。
(3)创建一个存储过程,该存储过程将学生选课成绩从百分制改为等级制(即A、B、C、D、E)。
(4)创建一个存储过程,该存储过程有一个参数用来接收学生姓名,该存储过程查询该学生的学号以及选修课程的门数。
(5)创建一个存储过程,该存储过程有两个输入参数用来接收学号和课程号,一个输出参数用于获取相应学号和课程号对应的成绩。
2、触发器(1)为study表创建一个UPDATE触发器,当更新成绩时,要求更新后的成绩不能低于原来的成绩。
(2)为study表创建一个DELETE触发器,要求一次只能从study表中删除一条记录。
(3)为course表创建一个INSERT触发器,要求插入的课程记录中任课教师不能为空。
3、用户自定义函数(1)创建一个返回标量值的用户定义函数 RectangleArea:输入矩形的长和宽就能计算矩形的面积。
create function RectangleArea(@a int,@b int)returns intasbeginreturn@a*@bend(2)创建一个用户自定义函数,功能为产生一张有关学生成绩统计的报表。
该报表显示每一门课程的课程号、课程名、选修人数、本门最高分、最低分和平均分。
调用这个函数,生成相应的报表并给用户浏览。
create function student_table()returns tableasreturn(select student_course.tcid课程号,ame课程名,COUNT(student_course.sno)选修人数,max(student_course.score)最高分,min(student_course.score)最低分,avg(student_course.score)平均分from student_course,coursewhere student_course.tcid=ogroup by student_course.tcid,ame)实验数据库说明教学活动数据库包括student、course和study三个基本表,三个基本表的结构说明和数据如下:(1)学生表(student)学生表的结构列名数据类型长度是否允许为空值字段说明sno char 5 NO 学号sname char 8 NO 姓名age smallint 年龄sex nchar 1 性别说明:sno为主键,age的范围为15~35之间,sex只能为“男”或“女”。
存储过程与触发器 实验报告
信息工程学院实验报告课程名称:《数据库原理》实验项目名称:存储过程与触发器一、实验目的:(1)了解存储过程的概念(2)掌握创建、执行存储过程的方法(3)了解查看、修改和删除存储过程的方法(4)了解触发器的概念(5)掌握创建触发器的方法(6)掌握查看、修改、删除触发器信息的方法二、实验设备与器件Win7 +Sql server 2008三、实验内容与步骤(一)存储过程运行实验四附录中的SQL语句,准备实验数据。
然后创建下列存储过程,并调试运行存储过程,查看运行结果。
1.在企业管理器中创建一个名为StuInfo的存储过程,完成的功能是在student表中查询系号为D2的学号、姓名、性别、年龄、系号的内容。
CREATE PROCEDURE StuInfoASSELECT SNO AS学号,SNAME AS姓名,SSEX AS性别,SAGE AS年龄,DNO AS系号FROM studentWHERE DNO='D2'结果:stuinfo2.使用T_SQL语句创建存储过程,完成的功能是在表student,course和study中查询以下字段:学号、姓名、性别、课程名称、考试分数。
use mydb--查询是否已存在此存储过程,如果存在,就删除它if exists(select name from sysobjectswhere name='StuScoreInfo'and type='P')drop procedure StuScoreInfogo--创建存储过程CREATE PROCEDURE StuScoreInfoasselect student.sno as学号,sname as姓名,ssex as性别,ame as课程名称,study.grade as考试分数from student,course,studywhere student.sno=study.sno and o=o结果:StuScoreInfo3.使用T_SQL语句创建一个带有参数的存储过程stu_sno_info,该存储过程根据传入的学生编号,在student表中查询此学生的信息。
存储过程与触发器实验报告
存储过程与触发器实验报告本实验旨在探究存储过程与触发器的概念、作用、使用范围和创建过程,并且通过编写相关的示例代码来展示它们的实际应用。
一、实验原理1. 存储过程存储过程是一组预定义好的 SQL 语句,可以重复使用并且可以直接被调用。
它类似于程序中的函数,可以接受参数、返回值、流程控制等。
2. 触发器触发器是与数据库表相关的事件响应机制,可以在数据库表上定义一些触发条件,当满足这些条件时就会触发执行一些操作,比如插入、更新或删除数据。
二、实验步骤1. 存储过程的创建与使用(1)创建一个用于统计某个用户的订单数量的存储过程。
```DELIMITER //CREATE PROCEDURE `getOrderCount`(IN p_userid INT, OUTp_count INT)BEGINSELECT COUNT(*) INTO p_count FROM orders WHERE user_id = p_userid;END//DELIMITER ;```(2)调用这个存储过程,并输出结果。
```CALL getOrderCount(123, @count);SELECT @count AS 'order_count';```2. 触发器的创建与使用(1)创建一个在用户表中插入新记录时自动生成一个账户记录的触发器。
```DELIMITER //CREATE TRIGGER `insert_user_account` AFTER INSERT ON `users` FOR EACH ROWBEGININSERT INTO accounts (user_id, balance) VALUES (NEW.id, 0);END//DELIMITER ;```(2)在用户表中插入一条新记录,触发器会自动执行并在账户表中生成一条新记录。
```INSERT INTO users (name, email) VALUES ('Alice','***************');SELECT * FROM accounts WHERE user_id =LAST_INSERT_ID();```三、实验结论通过实验我们发现,存储过程可以将一些常用的 SQL 语句封装为一个可以重复调用的函数,使得程序更加简洁和高效。
数据库实验-存储过程、触发器
group by Sno
order by sum(Grade)desc
exec total
drop proc total
执行结果:命令已成功完成。
如图:
(3)创建存储过程,查找某门课的最高分(带输入参数的存储过程)。
代码:
create proc grade1
@Cname char(20)
石家庄经济学院
实验报告
学院:信息工程学院
专业:网络工程
信息工程学院计算机实验中心制
学号
411109030110
姓名
马立杰
实验日期
2014.5.12
实验室
260
指导教师
张有华
设备编号
实验内容
实验6存储过程、触发器
一实验题目
1.存储过程的定义和使用
2.触发器的创建与使用
二实验目的
1.掌握存储过程的定义、执行和调用方法。
如图:
(5)创建存储过程,统计某门课选修的人数,将人数返回。(带返回值的存储过程)
代码:
create proc proc1
@Cno char(10),
@number int output
as
select @number=count(*)
from SC
where Cno=@Cno
group by Cno
where Sno=
(select top 1 Sno from SC
group by Sno
order by count(*) desc)
exec proc2
drop proc proc2
执行结果:命令已成功完成。
如图:
2.触发器的创建与使用
数据库触发器与存储过程的开发实践
数据库触发器与存储过程的开发实践在数据库开发的过程中,触发器(Trigger)与存储过程(Stored Procedure)起着至关重要的作用。
它们是数据库中存储的一段预定义的代码逻辑,可以在特定的数据库操作触发时执行相应的任务。
本文将介绍数据库触发器和存储过程的开发实践,包括定义及创建触发器和存储过程、数据库操作触发时的执行流程、使用场景等内容。
1.触发器的定义与创建触发器是与表相关联的一段代码,当满足特定的操作条件时,数据库就会自动执行相应的触发器代码。
触发器通常定义在表的插入(INSERT)、更新(UPDATE)或删除(DELETE)操作上。
创建触发器的语法一般如下:```sqlCREATE TRIGGER trigger_name{BEFORE|AFTER}{INSERT|UPDATE|DELETE}ON table_nameFOR EACH ROWBEGINtrigger_bodyEND;```其中:- `trigger_name`为触发器的名称;- `BEFORE|AFTER`用于指定触发器的执行时机,BEFORE表示在触发操作发生之前执行,AFTER表示在触发操作发生之后执行;- `INSERT|UPDATE|DELETE`用于指定触发器与哪种数据库操作相关联;- `table_name`为触发器所属的表名;- `FOR EACH ROW`表示触发器将对每一行进行操作;- `trigger_body`是触发器的主体代码,即在特定操作发生时执行的逻辑。
2.存储过程的定义与创建存储过程是一段预定义的可由数据库调用执行的代码集合。
与触发器不同,存储过程不会自动触发执行,而需要显式地由数据库开发人员调用。
创建存储过程的语法一般如下:```sqlCREATE PROCEDURE procedure_name(argument1 datatype, argument2 datatype,...)BEGINprocedure_bodyEND;```其中:- `procedure_name`为存储过程的名称;- `argument1, argument2,...`为存储过程的参数,可选;- `procedure_body`为存储过程的主体代码,即存储过程执行的逻辑。
数据库存储过程与触发器实验报告
南昌航空大学实验报告二00 年月日课程名称:数据库概论实验名称:数据库存储过程与触发器班级:122031 姓名:同组人:指导教师评定:签名:一、实验环境1.Windows2000或以上版本;2.SQLServer 2005。
二、实验目的熟悉不同数据库的存储过程和触发器,重点实践SQL Server2005,掌握SQL Server2005中有存储过程与触发器的相关知识。
三、实验要求完成实验指导书中p115-7和p132 -4。
四、实验步骤及参考源代码1.创建与执行存储过程create procedure C_P_Proc asselect distinct o,cna,pna,numfrom paper,customer,cpwhere o=o and paper.pno=cp.pno and cna='李涛' or cna='钱金浩' goexecute C_P_Proc2.删除存储过程drop procedure C_P_Proc3.创建插入触发器create trigger TR_PAPER_I ON PAKER12203125FOR INSERT ASDECLARE @appr floatDECLARE @apno intSELECT @appr=ppr,@apno=pno from insertedbeginif @appr<0 or @appr is nullbeginraiserror('报纸的单价为空或小于!',16,1)update paper set ppr=10where paper.pno=@apnoendend4.创建删除触发器create Trigger TR_PAPER_D on PAKER12203125after delete asdeclare @ipno char(6)declare @icount int;select @icount= count(*) from deleted,cpwhere deleted.pno=cp.pnoif @icount>=1beginselect @ipno=pnofrom deletedraiserror('级联删除cp表中的数据',16,1)delete from cp where cp.pno=@ipnoend5.创建修改触发器create trigger TR_PAPER_U ON PAKER12203125for update asdeclare @ippr floatselect @ippr=ppr from insertedif @ippr<0 or @ippr is nullbeginraiserror('输入单价不正确',16,1)rollback transactionend6. 分别对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'五、实验结果123.4.56六、实验体会试验过后,巩固了自己在课堂上所学的知识,并加深了记忆与了解,对以后的使用有很大作用在实验过程中,遇到一些困难,经过自己不断查找书籍并询问老师来解决问题,提高了自己的逻辑思维能力和动手能力。
存储过程与触发器实验报告
存储过程与触发器实验报告存储过程与触发器实验报告概述:本实验旨在探究数据库中存储过程与触发器的概念、作用以及使用方法。
通过编写实例代码并进行实验,深入理解存储过程与触发器在数据库管理系统中的重要性和应用场景。
一、存储过程存储过程是一组预定义的SQL语句集合,可以被多次调用。
存储过程通常用于执行一系列复杂的数据库操作,如数据的插入、更新、删除等。
它们可以被视为一种封装了业务逻辑的数据库对象,提供了更高效、更安全的数据处理方式。
在实验中,我首先创建了一个名为"AddEmployee"的存储过程,用于向员工表中插入新的员工信息。
该存储过程接受参数,包括员工姓名、性别、年龄等。
在存储过程中,我使用了INSERT INTO语句将参数值插入到员工表中。
通过调用该存储过程,可以方便地插入新员工的信息,减少了编写重复SQL语句的工作量。
二、触发器触发器是与数据库表相关联的特殊类型的存储过程,当表中的数据发生变化时,触发器会自动执行相应的操作。
触发器可以在数据的插入、更新、删除等操作前后触发,用于实现数据的自动验证、补充以及其他业务逻辑的处理。
在本次实验中,我创建了一个名为"UpdateStock"的触发器,用于在产品表中更新库存信息时自动更新库存变动记录表。
当产品表中的库存字段发生变化时,触发器会自动将相关信息插入到库存变动记录表中。
这样,无论是手动更新库存还是通过其他方式更新库存,库存变动记录都能够及时准确地被记录下来,方便后续的数据分析和追溯。
三、实验结果与总结通过本次实验,我深入学习了存储过程与触发器的概念、作用和使用方法。
通过编写实例代码并进行实验验证,我进一步认识到存储过程与触发器在数据库管理系统中的重要性和应用场景。
存储过程的使用可以提高数据库操作的效率和安全性,尤其适用于需要执行复杂业务逻辑的场景。
通过将一系列SQL语句封装成存储过程,可以减少网络传输的开销,提高数据库操作的性能。
SQL Server2005存储过程和触发器的设计实验三
3.存储过程和触发器的设计一、实验目的和要求(1)掌握 SQL Server中的触发器的使用方法;(2)掌握存储过程的操作方法。
二、实验内容和原理1. 基本操作实验在读者-图书数据库中用Transact-SQL语句描述下列功能:(1)在读者表上建立一个DELETE类型的触发器lianxi_del,触发动作是显示信息(已删除读者表中的数据),执行下列语句:create trigger lianxi_delon 读者for deleteas print ‘已删除读者表中的数据’(2)建立一个查询指定读者号的阅读信息的存储过程List_jy,输入参数为读者号,如果没有输入读者号,则要输出提示信息。
三、算法描述及实验步骤1. 触发器的操作(1)建立触发器首先,打开企业管理器,定位数据库并找到要创建触发器的表;然后,右击该表名,在弹出的快捷菜单中选择“设计表”,在打开的“设计表”窗口中单击按钮。
最后,在触发器属性窗口中输入触发器的内容,并单击“确定”按钮。
(2)查看触发器使用企业管理器2. 提高操作实验在学生-课程数据库中用Transact-SQL语句描述下列功能:1)为学生表建立一个名TRI_INSERT的INSERT触发器。
功能是当用户向学生表添加数据时,同时也把这些数据添加到stu表中。
其中:学生表和表stu的结构相同。
CREATE TRIGGER TRI_INSERTON STUDENTFOR INSERTASINSERT INTO STUSELECT * FROM INSERTED(2)创建一查询存储过程,过程名称为P_CX。
参数是学号,输出信息是指定学号所应的姓名、课程名称、成绩。
运行时若没有指定学号,则提示请输入学号;若学号不存在则提示学号不存在。
create procedure P_CX@sno char(10) =nullasif @sno is nullbeginprint '请输入一个学号'returnendelse if(not exists(select * from student where sno=@sno))print '学号不存在'elseselect sname,o,gradefrom student,course,scwhere student.sno=sc.sno and o=o and student.sno=@sno(3)创建一统计存储过程,过程名称为P_CJTJ。
实验:存储过程与触发器
实验名称:存储过程与触发器实验目的:掌握SQLSERVER存储过程与触发器的定义、调用操作数据库结构关系:语法规定:(1)存储过程定义语法:CREATE PROC 过程名@parameter 参数类型……@parameter 参数类型outputASBegin命令块End利用TSQL调用存储过程:Execute 过程名[参数值,……][Output]如果没有参数,直接调用过程名(2)创建事后触发器的语法:CREATE TRIGGER 触发器名ON 表名For Insert [,Update,Delete] AsBegin命令块End(3)创建替代触发器的语法:CREATE TRIGGER 触发器名ON 表名Instead of Insert [,Update,Delete] AsBegin命令块End实验内容:(一)存储过程(1)创建带输入参数的存储过程,输入查询的工资范围,输出查询到的职工信息Create proc Myproc1@mingzint,@maxgzintasselect * from 职工表where 工资between @mingz and @maxgz 调用该过程execute Myproc1 1000,4000(2)使用Transact-SQL语言创建带输入输出参数的存储过程。
输入仓库号,输出该仓库的职工信息、职工最高工资、最低工资Create proc Myproc2@cangkuhaovarchar(50),@maxgzint output,@avggzint outputasbeginselect * from 职工表where 仓库号=@cangkuhaoSelect @maxgz=max(工资) from 职工表where 仓库号=@cangkuhaoSelect @avggz=avg(工资) from 职工表where 仓库号=@cangkuhaoEnd调用存储过程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三存储过程和触发器一、实验目的1.掌握Transact-SQL编程知识;2.学习、掌握存储过程和触发器的建立和使用二、存储过程练习1建立简单存储过程创建一个简单的存储过程,了解实现存储过程的语法。
1)输入并执行下面语句USE NorthwindGOCREATE PROCEDURE FirstProcASSELECT TOP 5 ProductName, UnitPrice FROM Products ORDER BY UnitPrice desc GO2)输入并执行如下语句:Use northwindexec firstproc这个存储过程的含义是什么?是否可以用视图实现同样的功能?答:查询在Products中Unit price 在前5的商品名称(Product name)和价格(Unit price)可以视图来实现同样的功能,实验结果如图1所示图1 练习1结果截图注意:区别视图和存储过程。
存储过程第一次执行时进行编译并驻留在高速缓存中,以后再执行时,只需从高速缓存中调用已编好的二进制代码,对于经常被执行且功能固定的查询需求,存储过程将大节省SQL server执行时间(2)存储过程可以减少网络流量(3)是一种安全机制(4)屏蔽T-SQL 命令视图是一个虚拟表。
视图不在数据库中以存储的数据值形式存在。
行和列数据来自定义视图的查询所引用的表,并且在引用视图上自动生成。
练习2进一步使用存储过程,当执行存储过程时,将执行时的信息返回给用户1)输入并执行下面语句create proc Error_procasdeclare @MaxPrice moneydeclare @Char varchar(20)select @Maxprice=max(unitprice) fromproducts --找出价格最大值,并将值赋给变量set @char=cast(@Maxprice as varchar(20)) --转换数据类型为字符型raiserror('The max price is %s',10,1,@char) go2)输入并执行语句调用存储过程:exec error_proc显示结果是什么?变量值是否传递给显示信息?答:变量值可以传递到显示信息,实验结果为练习3使用输出参数返回变量值通过使用Output选项返回存储过程中的数值1)输入并执行下面语句create proc Return_proc@ReturnMaxPrice money outputasselect @ReturnMaxPrice=max(unitprice) from productsgo2)执行下面语句,调用存储过程declare @return moneyexec Return_proc @return outputselect @return是否显示结果?显示的内容是什么答:可以显示。
结果为:注意:在存储过程中的返回参数定义Output选项,在调用存储过程时也要定义Output选项,来接收返回值。
练习4按如下要求编写存储过程,并执行1)在pubs数据库中创建一个存储过程,输入书的ID号(title_id),存储过程检索该书的书名、出版社名。
use pubsgocreate proc return_info @title_id nvarchar(6) asselect titles.title,publishers.pub_namefrom titles,publisherswhere titles.pub_id=publishers.pub_id and titles.title_id=@title_idgo执行存储过程:use pubsexec return_info 'BU7832'实验结果为:2)创建一个存储过程,入口参数为一个时间类型的值,返回如下格式的时间字符串:xxxx 年xx月xx日。
(提示:使用DATEPART函数,可在联机丛书中查询使用方法)create proc dataty@date datetimeasprint(str(DATEPART(yy,@date))+'年'+str(DATEPART(mm,@date))+'月'+str(DATEPART(dd,@date))+'日')go执行存储过程:exec dataty '2010-12-25'实验结果为:3)在pubs数据库中创建一个存储过程。
如果作者所在的State为‘CA’,则显示为“加州”;如果是‘KS’,显示为“堪萨斯”;若是其它州,显示为“Others”。
use pubsgocreate proc infasselect au_id as作者编号,au_lname as作者名,state,所在地=case when state='CA'then'加州' when state='KS'then'堪萨斯' else'others'endfrom authorsgo执行存储过程:exec inf........以下结果略去。
二、触发器练习1:创建触发器要求:Products表中的UnitIsStock字段存放的是每个产品的库存量,[Order Details]表中存放的是订单信息。
当增加一个新订单时,库存量应该自动减去订单里面的订货数量。
1)先使用sp_helptrigger [Order Details]命令查看[Order Details]表中关于触发器信息。
2)在[Order Details]表上创建触发器,自动计算库存量。
输入并执行下面语句USE NorthwindGOIF EXISTS ( SELECT name FROM sysobjectsWHERE type = 'TR' AND name = 'OrdDet_Insert' )DROP TRIGGER OrdDet_InsertGOCREATE TRIGGER OrdDet_InsertON [Order Details]FOR INSERTASUPDATE P SETUnitsInStock = (P.UnitsInStock - I.Quantity)FROM Products AS P INNER JOIN Inserted AS ION P.ProductID = I.ProductIDGO3)用sp_helptrigger [Order Details]命令查看[Order Details]表中关于触发器信息。
4)使用下面的语句测试触发器。
输入编号为11077的订单,并且订货数量为50,并用两个Select语句查看结果。
(下面语句一起执行结果会很明显)select productid,UnitsInStock from products where productid=22insert into [Order Details] (orderid,productid,unitprice,quantity,discount)values (11077,22,21.00,50,0.0)select productid ,UnitsInStock from products where productid=224)两次库存数量的差值是什么?答:两次库存的差额是50实验结果如右图所示:注意:临时表Inserted的使用。
练习2:创建删除触发器设有两张表NewCategories和NewProducts。
当删除NewCategories表中一条记录时,NewProducts表中的相关数据同时删除。
1)创建两张新表NewCategories和NewProducts。
USE NorthwindGOSELECT * INTO NewCategories FROM CategoriesSELECT * INTO NewProducts FROM ProductsGO2)输入并执行下面语句,用以在NewCategories表上创建删除触发器CREATE TRIGGER Category_Delete ON NewCategoriesFOR DELETEASDELETE NewProductsFROM NewProducts AS P INNER JOIN Deleted AS dON P.CategoryID = D.CategoryID3)使用下面的语句测试触发器。
在NewCategories表中删除分类号为6的记录,并用两个Select语句查看NewProducts表结果。
(下面语句一起执行结果会很明显)SELECT ProductID, CategoryID, DiscontinuedFROM NewProducts WHERE CategoryID = 6DELETE NewCategories WHERE CategoryID = 6SELECT ProductID, CategoryID, DiscontinuedFROM NewProducts WHERE CategoryID = 64)NewProducts表中分类号为6的记录是否自动删除?答:删除了。
如右图所示练习3:使用触发器验证业务规则newProducts表中存放每个产品的基本信息,[Order Details]表中存放的是订单信息。
如果一个产品存在着订单,那么这个产品不能从newProducts表中被删除。
1)在上面实验创建的newProducts表上创建触发器。
USE NorthwindGOCREATE TRIGGER Product_DeleteON NewProducts FOR DELETEASIF (Select Count (*)FROM [Order Details] INNER JOIN deletedON [Order Details].ProductID = Deleted.ProductID) > 0BEGINRAISERROR('Transaction cannot be processed. This Product still has a history of orders.', 16, 1)ROLLBACK TRANSACTIONEND2)使用下面语句测试触发器,将产品编号为1的产品信息从NewProducts中删除。
DELETE NewProducts WHERE ProductID = 63)是否能删除?为什么?不能删除,触发器验证业务规则,如运行结果所示运行结果:消息50000,级别16,状态1,过程Product_Delete,第10 行Transaction cannot be processed. This Product still has a history of orders.消息3609,级别16,状态1,第1 行事务在触发器中结束。