实验6数据库实验——存储过程和触发器
- 格式:docx
- 大小:97.55 KB
- 文档页数:20
存储过程及触发器实验报告实验目的: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是我们想要创建的触发器的名称。
实验六使用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、写明实验所采用的实验环境。
实验六存储过程和触发器1.实验目的(1) 掌握存储过程和触发器的基本概念和功能(2) 掌握创建,管理存储过程的方法(3) 掌握创建,管理触发器的方法2.实验内容及步骤(1) 利用SQL Server Management Studio创建一个存储过程ProcNum,查询每个班级中学生的人数,按班级号升序排序.在查询编辑器的存储过程模板中输入如下创建存储过程的代码并执行.USE teachingGOCREATE PROCEDURE ProcNum ASSELECT classno,COUNT(*)AS number FROM studentGROUP BY classno ORDER BY classno ASCGOEXEC ProcNum(2) 利用Transact-SQL语句创建一个带有参数的存储过程ProcInsert,向score 表插入一条选课记录,并查询该学生的姓名,选课的所有课程名称,平时成绩和期末成绩.<1> 在查询编辑器输入如下创建存储过程的代码并执行.USE teachingGOCREATE PROCEDURE ProcInsert(@sno NCHAR(10),@cno NCHAR(6),@usually NUMERIC(6,2),@final NUMERIC(6,2))ASINSERT INTO score VALUES (@sno,@cno,@usually,@final)SELECT sname,cname,usually,finalFROM student s,course c,score scWHERE s.studentno=sc.studentno and c.courseno=sc.courseno and s.studentno=@sno<2> 调用存储过程ProcInsert,向score表插入一条选课记录.DECLARE@AVERAGE NUMERIC(6,2)EXEC ProcInsert'16135222201','c05103',88,90(3) 利用Transact-SQL语句创建一个存储过程ProcAvg,查询指定班级指定课程的平均分。
存储过程与触发器实验报告一、引言存储过程和触发器是数据库中常用的高级功能,它们能够提高数据库的性能、数据一致性和安全性。
本实验报告将详细介绍存储过程和触发器的概念、用途以及实际应用。
二、存储过程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语句在执行被取消。
存储过程与触发器实验报告本实验旨在探究存储过程与触发器的概念、作用、使用范围和创建过程,并且通过编写相关的示例代码来展示它们的实际应用。
一、实验原理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 语句封装为一个可以重复调用的函数,使得程序更加简洁和高效。
“数据库技术及应用”教学单元6:存储过程与触发器实验本部分实验只适合SQL Server系统环境实验1: 使用企业管理器创建用户存储过程。
实验目的:掌握创建用户存储过程的方法;实现使用企业管理器创建用户存储过程,创建“男学员”存储过程,用于控制输入数据检验。
实验步骤:① 启动SQL Server企业管理器。
② 在“控制台目录”窗口左侧窗格中,首先,展开“SQL Server组”→“数据库”结点,然后,展开“Training”数据库→“存储过程”结点,单击鼠标右键,弹出快捷菜单,如下图所示。
③ 在快捷菜单中,选择“新建存储过程”菜单命令,打开“存储过程属性-新建存储过程”对话框,如下图所示。
④ 在“存储过程属性-新建存储过程”对话框的“文本”文本框中,输入下列存储过程代码:CREATE PROC 男学员AS SELECT stu_name,stu_sex,stu_phoneFROM tra_studentsWHERE stu_sex = '男'⑤ 在“存储过程属性-新建存储过程”对话框中,单击“检查语法”。
若没有错误,单击“确定”按钮,完成存储过程创建,如下图所示。
实验2:使用企业管理器创建触发器。
实验目的:掌握创建触发器的方法;实现使用企业管理器创建触发器,创建“学员_性别”触发器,用于控制输入数据检验。
实验步骤:① 启动SQL Server企业管理器。
② 在“控制台目录”窗口左侧窗格中,首先,展开“SQL Server组”→“数据库”结点,然后,展开“Training”数据库结点。
双击“表”子结点,在“控制台目录”的右侧窗格中选择要建立触发器的“Tra_students”表,单击鼠标右键,弹出快捷菜单,如下图所示。
③ 在快捷菜单中,选择“所有任务”→“管理触发器”菜单命令,打开“触发器属性”对话框。
在“触发器属性”对话框的“文本”文本框中输入下列触发器过程代码:CREATE TRIGGER 学员_性别 ON Tra_studentsFOR INSERT, UPDATEASIF EXISTS (SELECT * FROM tra_students WHERE stu_sex NOT IN ('男','女'))BEGINRAISERROR ('请输入合法性别!',16,1)ROLLBACK TRANSACTIONEND单击“确定”按钮,完成“学员_性别”触发器的创建。
实验6存储过程与触发器、实验目的1、加深与巩固对存储过程与触发器概念的理解。
2、掌握触发器的简单应用。
3、掌握存储过程的简单应用。
二、实验内容一)存储过程:1、创建一存储过程,求1+2+3+…+n并打印结果。
CREATE PROCEDURE addresultASDECLARE @n int =10, /* 最后一个数*/@i int =0,@result int =0 /* 结果*/BEGINWHILE (@i <=@r)BEGINSET @result =@result +@iSET @i =@i+1ENDPRINT '1+2+3+ 、、、+n 的结果就是:'PRINT @resultRETURN( @result )ENDGO2•调用上面的addresult存储过程打印l十2+3+…+10的结果EXEC addresult3、修改上述存储过程为addresultl,使得@n为输入参数,其具体值由用户调用此存储过程时指定。
CREATE PROCEDURE addresultl@n int =10 /* 最后一个数*/ASDECLARE @i int =0,@result int =0 /* 结果*/BEGINWHILE (@i <=@r)BEGINSET @result =@result +@iSET @i =@i+1ENDPRINT '1+2+3+ 、、、+n 的结果就是:’PRINT @resultRETURN( @result )ENDGO*命令已成9閘克4、调用上面修改后的addresultl存储过程,打印1+2+3十…+100的结果。
EXEC addresultl 100心消息1+2+3+..- 如瞬果是:他05•修改上述存储过程为addresult2,将@n参数设定默认值为10,并改设@sum为输出参数,让主程序能够接收计算结果。
CREATE PROCEDURE addresult2@n int =10, /* 最后一个数*/@sum int out /* 结果*/ASDECLARE @i int =0BEGINset @sum =0WHILE (@i <=@r)BEGINSET @sum =@sum+@iSET @i =@i+1ENDENDGO6. 调用上面修改后的addresult2存储过程,设置变量@s接收计算1+2+3+…+10的结果。
DECLARE @s intset @s = 0EXEC addresult2 10 , @sum=@s outPRINT '1+2+3+ 、、、+n 的结果就是:'PRINT @s7. 创建一存储过程Proc_Student用于显示学号为“ 0102”的学生基本信息(包括学号、姓名、性别与系)。
CREATE PROCEDURE Proc_StudentASBEGINselect *from Swhere S、sno =0102ENDEXEC Proc Student8. 创建一存储过程Stu_grade通过读取某门课的编号,求出不及格的学生的学号。
CREATE PROCEDURE Stu_grade@n char ( 10)ASBEGINselect snofrom SCwhere eno =@n and grade <60ENDGO9•调用上面的存储过程Stu_grade求出课程编号为“ 0101 ”的不及格的学生10. 创建一存储过程avgGrade通过读取学生的学号,以参数形式返回该学生的平均分。
CREATE PROCEDURE avgGrade@n char ( 10)ASBEGINselect AVG( grade )平均分from SCwhere sno =@ngroup by snoGO11. 调用上面的存储过程avgGrade求出学号为“ 990102014”的平均分。
平均分12. 删除上述存储过程avgGrade,drop procedure avgGrade—Lnr* ■■ 甘、—- r TT"■—- IB-drop p.oced口工飪aT-cGrade|鬲消息13、创建存储过程search该存储过程有三个参数,分别为@t、@p1,@p2, 根据这些参数,找出书名与@t有关,价格在@p1与@p2(@p2>=@p1之间的书的编号,书名,价格,出舨日期。
如果用户调用时没有指定@t参数的值.则表示可为任意值,如用户没有指定@p2,则书本价格没有上限。
用到的关系为:titles (title_id,title,price,pubdate)。
CREATE PROCEDURE search@t char ( 10 )= "%",@p1 char (10 ),@p2 char (10)=NULLASBEGINwhere title =@t and price <= @p2 and price >=@p1ENDGO14. 调用上面的存储过程search 求出书名与computer 有关,而且价格 小于$20大于$10的书。
EXEC search "computer" , 10 , 20二) 触发器:1、在学生成绩库中创建触发器 triggers 实现如下功能:当在学生成绩 表(xscj)中插入一条学生选课信息后,自动实现更新该学生在学生情况 表(xsqk)中的总学分信息。
分析:根据题意,也即要求在学生成绩表中插入一条记录时 ,自动更新 学生情况表中的相应记录信息。
可以通过在学生成绩表中定义INSERT 类型的触发器,触发器中语句要完成的功能就是更新学生情况表中的 相应学生的总学分信息。
其实,只要在该生原总学分基础上加上新选 课程的学分就可以了。
create trigger trigger1on xscjafterin sertasdeclare @credit int ;select @credit =credit from in serted xscj; update xsqk set allcredit =allcredit +@credit ;select title_idfrom titles,title , price , pubdate go2、创建触发器trigger2,实现当修改学生课程表(xskc)中的数据时,显示提示信息“学生课程表被修改了Ocreate trigger trigger2on xskcafter updateas goprint '学生课程表被修改了3、创建触发器trigger,实现当删除学生课程表中某门课程的记录时对应学生成绩表中所有有关此课程的记录均删除。
create trigger trigger3on xskcafter deleteasdeclare @cname char (10);select @cname =cname from deleted xsks delete xscj where cn ame =@c name;go4、创建触发器trigger4,实现当修改学生课程表(xskc)中的某门课的课程号时,对应学生成绩表(xscj)中的课程号也作相应修改。
create trigger trigger4on xskcafter updateasdeclare @cno char (10 );declare @cname char ( 10);select @cname =xskc、cname , @cno=xskc、eno from updated xsks ;update xscj set xscj 、eno =@cno where xscj 、cname =@cname;go5、创建触发器trigger5,实现当向学生成绩表(xscj)中插入一条选课记录时,查瞧该学生的信息就是否存在在学生信息表中,如果不存在,则把该学生的基本信息加入到学生信息表中。
create trigger trigger5on xscjafter in sertasdeclare @snamel char (10);declare @sname2 char (10)=NULL;select @sname1 =xscj 、sname from updated xscj ;select @sname2 =xsqk、sname from xsqk where xsqk 、sname =@sname1 ;if @s name2 =NULLin sert into xsqk values (NULL, @sn ame1);go6、在学生成绩库中创建触发器trigger6,实现如下功能:当在学生成绩表(xscj)中插入一条学生选课信息后,查瞧该学生的信息就是否存在在学生信息表中,如果不存在,则给出“该记录不能被插入!”的错误提示,并撤销插入操作;同样,如果课程信息在课程信息表中不存在,给出“该记录不能被插入!”的错误提示,并撤销插入操作。
create trigger trigger6on xscjfor in sertasbeginif not exists(select xsqk、sname from xsqk where xsqk、sname in( select xscj 、snamefrom in serted xscj )beginraiserror ('该记录不能被插入!’,16, 1)rollbackreturnendendgo7、创建触发器trigger7,强制实现业务规则:当向学生成绩表中插入一条记录时,自动修改学生情况表中该学生的总学分,要求总学分为该学生所有已修课程的学分总与。
create trigger trigger7on xscjfor in sertasbeg in tran sacti ondeclare @credit int ;select @credit =credit from in serted xscj ;update xsqk set allcredit =allcredit +@credit ;commit tran sacti ongo&分别用触发器与存储过程实现对学生情况表(xsqk与学生成绩表(xscj表的级联删除。
create trigger trigger8on xsqkafter deleteasdelete from xscjwhere xscj 、sname in(select xsqk 、sname from deleted xsqk )go1- 耳uqK.nnuirf frcn1. xsqk:CREATE PROCEDURE del_qk_cj @sname char (10)=NULL ASBEGINdelete from xscjwhere xscj 、sn ame =@s name;delete from xsqkwhere xsqk 、sn ame =@s name;ENDGOE CREATE PROCEDURE del_qk_cj Ssnair.e char (10 =1RJLLAS(i BEGINE] delete fron xacjwhexe xscj .且namg=世且口師十:r\delete fror x^qk炖b电工皀xsqk •朋克昭=临吕席址已:L END-命晶成功完成。