实验五存储过程和触发器地定义和使用
触发器与存储过程的建立与使用

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
存储过程和触发器(数据库实验5)

数据库基础与实践实验报告实验五存储过程和触发器班级:惠普测试142学号:**********姓名:***日期:2016-11-141 实验目的:1)掌握SQL进行存储过程创建和调用的方法;2)掌握SQL进行触发器定义的方法,理解触发器的工作原理;3)掌握触发器禁用和重新启用的方法。
2 实验平台:操作系统:Windows xp。
实验环境:SQL Server 2000以上版本。
3 实验内容与步骤利用实验一创建的sch_id数据库完成下列实验内容。
1.创建存储过程JSXX_PROC,调用该存储过程时可显示各任课教师姓名及其所教课程名称。
存储过程定义代码:CREATE PROCEDURE JSXX_PROCASSELECT tn 教师姓名,cn 所教课程FROM T,TC,C WHERE T.tno=TC.tno AND o=o存储过程执行语句与执行结果截图:EXECUTE JSXX_PROC2.创建存储过程XM_PROC,该存储过程可根据输入参数(学生姓名)查询并显示该学生的学号、所学课程名称和成绩;如果没有该姓名学生,则提示“无该姓名的同学”。
存储过程定义代码:CREATE PROCEDURE XM_PROC @sname VARCHAR(100)ASBEGINIF EXISTS(SELECT NULL FROM S WHERE sn=@sname)SELECT S.sno 学号,cn 课程,score 成绩FROM S,SC,C WHERE o=o AND SC.sno=S.sno ANDS.sn=@snameELSEPRINT'无该姓名的同学。
'END运行截图:3.创建存储过程XBNL_PROC,该存储过程可根据输入参数(专业名词,默认值为计算机专业),统计并显示该专业各年龄段男、女生人数。
如果没有该专业,则显示“无此专业”。
存储过程定义代码:CREATE PROCEDURE XBNL_PROC@departName VARCHAR(30)='计算机',@begin INT,@end INTASDECLARE @numOfBoys INTDECLARE @numOfGirls INTDECLARE @d# VARCHAR(3)DECLARE @result VARCHAR(50)BEGINSELECT @d# = dno FROM D WHERE dn=@departNameIF @d# IS NOT NULLBEGINSELECT @numOfBoys =COUNT(sno)FROM S WHERE age BETWEEN @begin AND @end AND dno=@d# AND sex='男'SELECT@numOfGirls =COUNT(sno)FROM S WHERE age BETWEEN@begin AND@end AND dno=@d# AND sex='女'SET @result = @departName+'专业年龄在'+CAST(@begin AS VARCHAR(3))+'-'+CAST(@end AS VARCHAR(3))+'之间的男生有'+CAST(@numOfBoys AS VARCHAR(3))+'人,'+'女生有'+CAST(@numOfGirls AS VARCHAR(3))+'人'ENDELSESET @result='无此专业。
MySQL中的存储过程和触发器

MySQL中的存储过程和触发器在MySQL数据库中,存储过程和触发器是两种非常有用的特性。
它们可以帮助开发人员简化数据库管理和提高应用程序的效率。
本文将深入探讨MySQL中存储过程和触发器的概念、用途以及如何创建和使用。
一、存储过程存储过程是一组预编译SQL语句的集合,可以使用输入参数,输出参数和返回值。
它们可以用于执行常见的数据库操作,如插入、更新和删除数据。
存储过程还可以用于实现业务逻辑,从而减少在应用程序中执行的SQL语句数量。
1.1 存储过程的优点- 提高性能:存储过程经过编译,可以使用缓存以提高查询性能。
- 简化管理:存储过程可以简化复杂的数据库管理操作,如维护数据库结构和数据安全。
- 实现业务逻辑:存储过程可以在数据库中实现业务逻辑,从而减少应用程序代码中执行的SQL语句的数量和复杂性。
1.2 存储过程的创建和使用在MySQL中创建存储过程需要使用CREATE PROCEDURE语句。
以下是一个简单的示例:```CREATE PROCEDURE get_customer(IN customer_id INT)BEGINSELECT * FROM customers WHERE id = customer_id;END;```在执行上述存储过程后,可以使用以下语句查询:```CALL get_customer(1);```1.3 存储过程的注意事项- 存储过程是在数据库服务器上执行的,因此需要一定的安全性考虑。
- 由于存储过程可以在数据库中执行大量计算,因此可能会影响服务器性能。
二、触发器触发器是一种特殊的存储过程,当特定事件发生时自动触发执行。
可以根据需要定义触发器在INSERT、UPDATE或DELETE操作之前或之后执行。
2.1 触发器的优点- 数据完整性:触发器可以防止对数据库中重要数据的误更改或误删除。
- 降低复杂性:使用触发器可以避免在应用程序中编写对数据库的复杂操作。
2.2 触发器的创建和使用在MySQL中创建触发器需要使用CREATE TRIGGER语句。
第5讲 存储过程和触发器

在调用存储过程时,有两种数据传递的方法: (1)在传递参数时,使实参的顺序和定义时的参数顺序一 致。 (2)可以采用“参数=值”的形式,此时,各个参数的顺 序可以任意排列。
【例4-66】在School中创建一个存储过程proc_UpdateGrade,修 改指定学号(StudentCode)和课程代号(CourseCode)的成绩 (Grade)。
(3) 执行存储过程
存储过程定义后,可以通过EXECTE语句来执行该存储过程。 语法格式: EXEC[UTE] 存储过程名[@形参=]实参值 说明: 1)“@形参”是创建存储过程时定义的形参名; 2)“实参值”是输入参数的值; 3)“@变量”表示用来保存参数或者返回参数的变量; OUTPUT表示指定参数为返回参数; 4)DEFAULT表示使用该参数的默认值作为实参。 5)如果有多个参数,可以依次按以上参数定义规则列出, 用逗号“,”隔开。
说明: “形式参数”名称必须符合标识符规则;OUTPUT表示该参 数是可以返回的,可将信息返回调用者;如果有多个参数, 可以依次按以上参数定义规则列出,用逗号“,”隔开。
CREATE PROC proc_Course AS
SELECT * FROM T_Course
调用创建的存储过程proc_Course的语句为:
EXEC proc_Course
【例2】在School中创建一个的存储过程 proc_Se程带一个输入参数) CREATE PROC proc_SearchStudent @stcode char(8) AS SELECT StudentName, CourseName FROM T_Student JOIN T_Grade JOIN T_Course ON T_Grade.CourseCode=T_Course.CourseCode ON T_Student.StudentCode=T_Grade.StudentCode WHERE T_Student.StudentCode=@stcode
实验五 存储过程和触发器的使用

实验五存储过程和触发器的使用【目的要求】1、了解存储过程的基本概念和类型。
2、了解创建存储过程的T-SQL语句的基本语法。
3、了解查看、执行、修改和删除存储过程的T-SQL命令的用法。
4、了解触发器的基本概念和类型。
5、了解创建触发器的T-SQL语句的基本语法。
6、了解查看、修改和删除存储过程的T-SQL命令的用法。
【实验内容】内容一:存储过程的使用一、数据需求分析存储过程是一种数据库对象,为了实现某个特定任务,将一组预编译的SQL语句以一个存储单元的形式存储在服务器上,供用户调用,自动完成需要预先执行的任务。
存储过程在第一次执行时进行编译,然后将编译好的代码保存在高速缓存中便于以后调用,提高了代码的执行效率。
二、内容要点分析1、SQL SERVER支持五种类型的存储过程:系统存储过程、本地存储过程、临时存储过程、远程存储过程和扩展存储过程。
其中,系统存储过程是由系统提供的存储过程,可以作为命令执行各种操作。
系统存储过程定义在系统数据库master中,其前缀是sp_。
本地存储过程是指在用户数据库中创建的存储过程,这种存储过程完成特定数据库操作任务,不能以sp_为前缀。
2、只能在当前数据库中创建存储过程。
3、创建存储过程时,应指定所有输入参数和向调用过程或批处理返回的输出参数、执行数据库操作的编程语句和返回至调用过程或批处理以表明成功或失败的状态值。
4、创建存储过程的T-SQL语句CREATE PROC[EDURE] 存储过程名称[{ @参数名称数据类型 }] [,…n][WITH{ RECOMPILE|ENCRYPTION }]ASSQL语句序列说明:(1)RECOMPILE表明每次运行该过程时,将其重新编译。
(2)ENCRYPTION表示 SQL SERVER 加密SYSCOMMENTS表中包含CREATE PROCEDURE语句文本的条目。
注:必须将CREATE PROCEDURE语句放在单个批处理中。
实验五 存储过程和触发器的定义和使用

实验五存储过程和触发器的定义和使用一、实验目的1、掌握局部变量、全局变量、流程控制语句的使用方法2、了解存储过程的类型和作用,并掌握使用对象资源管理器和Transact-SQL语句创建存储过程的方法及使用方法。
3、理解触发器的特点和作用,并掌握使用Transact-SQL语言创建触发器的方法二、实验内容1. 在学生成绩库中中有如下各表:学生表(Student)create database学生成绩数据库create table Student(学号Char(6)not null,姓名Char(8)not null,性别Bit not null,出生日期smalldatetime,专业Char(10),所在系Char(10),联系电话Char(11)null)课程表(Course)create table Course(课程号Char(3)not null,课程名Char(20)not null,教师Char(10),开课学期Tinyint,学时Tinyint,学分Tinyint not null,)学生选课成绩表(SC)create table SC(学号Char(6)not null,课程号Char(3)not null,成绩Smallint,)对三个表格分别导入,截图如下:2、T-SQL语句中流程控制语句的使用(1)全局变量的使用。
显示到当前日期和时间为止试图登录SQL Server的次数。
select getdate()as'当前的日期和时间',@@connections as'试图登陆的次数'(2)IF语句的使用。
①在Student表中,若存在学号“020205”的学生,则显示该学生的信息,否则插入该学生的记录(020205, 李萍,0, 1983-7-20, 电子商务, 经济系, 88297171)If exists(select*from Student where学号='020205')select*from Student where学号='020205'Elseinsert into Student values('020205','李萍','0','1983-7-20','电子商务','经济系','88297171')②查询杨颖有没有选课,若选了课,则统计其平均成绩,若没有选课,则输出“杨颖没有选课”If exists(select姓名from Student,SC where姓名='杨颖'and Student.学号=SC.学号)select avg(成绩)from SC,Student where Student.姓名='杨颖'and Student.学号=SC.学号Elseprint'杨颖没有选课!'(3)循环语句的使用。
存储过程和触发器

实验存储过程和触发器实验一存储过程的创建和使用【实验目的】1.掌握存储过程的概念,了解存储过程的类型2.掌握创建各种存储过程的方法3.掌握执行存储过程的方法。
4.掌握查看,修改,删除存储过程的方法【实验内容】1.在SSMS图形化界面下创建对表Customers进行插入,修改和删除的3个存储过程:insertCustomers、updateCustomers、deleteCustomers.2.在查询分析其中创建一个存储过程,要求输入作者的姓和名,如果存在,则返回这个作者以及作者所出版的书的信息,否则给出相应的提示信息。
3.用系统存储过程查看刚创建的存储过程的信息。
4.删除存储过程【实验主要步骤】1.在SSMS图形化界面下创建对表Customers进行插入,修改和删除的3个存储过程:insertCustomers、updateCustomers、deleteCustomers.2.在查询分析其中创建一个存储过程,要求输入作者的姓和名,如果存在,则返回这个作者以及作者所出版的书的信息,否则给出相应的提示信息。
3.用系统存储过程查看刚创建的存储过程的信息。
4.删除存储过程实验二触发器的创建和使用【实验目的】1.理解触发器的概念与类型。
2.理解触发器的功能及工作原理。
3.掌握创建、修改和删除触发器的方法。
4.掌握利用触发器维护数据完整性的方法。
【实验内容】触发器是一种实施复杂数据完整性的特殊存储过程,在对表或视图执行UPDATE、INSERT、DELETE语句时自动触发执行,以防止对数据不正确、未授权或不一致的修改。
1.使用T-SQL语句创建一个DELETE触发器,完成的功能是当在Categories表中删除记录时,检测Products表中是否存在相关记录,如果存在,则给出提示信息“不能删除该条记录”;如果不存在,则删除该条记录。
2.基于Sales表创建一个触发器,针对INSERT、DELETE、UPDATE操作。
MySQL存储过程与触发器的使用技巧

MySQL存储过程与触发器的使用技巧引言:MySQL是一种广泛使用的开源关系型数据库管理系统,它提供了存储过程和触发器功能,可以帮助开发者更好地管理和操作数据库。
本文将介绍MySQL存储过程和触发器的使用技巧,以帮助读者更好地利用这些功能提升数据库的性能和灵活性。
一、存储过程的概念和作用存储过程是一组预编译的SQL语句,可以在数据库中进行存储和重复执行。
它具有以下的几个主要作用:1. 提高数据库性能:存储过程在执行过程中不需要每次都解析SQL语句,可以减少数据库服务器的负载,提升查询性能。
2. 简化应用程序开发:通过存储过程,可以将复杂的数据操作逻辑封装为一个可供应用程序调用的接口,简化了应用程序的开发过程。
3. 提高安全性:通过存储过程,可以将敏感的数据操作逻辑封装在数据库中,减少了对数据库直接操作时的安全隐患。
二、存储过程的语法和使用方法1. 存储过程的创建:CREATE PROCEDURE procedure_name ([IN|OUT|INOUT] parameter_name parameter_type)BEGIN-- 存储过程的具体实现逻辑END;2. 存储过程的调用:CALL procedure_name(parameter_value);3. 存储过程的注释:DELIMITER // -- 修改定界符CREATE PROCEDURE procedure_name ([IN|OUT|INOUT] parameter_name parameter_type)BEGIN-- 存储过程的具体实现逻辑END //DELIMITER ; -- 恢复定界符4. 存储过程的参数:- IN参数:用于传入存储过程的输入值,仅在存储过程内部使用,不影响原始变量的值。
- OUT参数:用于传出存储过程的输出值,返回给调用者使用。
- INOUT参数:兼具IN和OUT的功能,既可以传入数据,也可以传出数据。
数据库实验存储过程、触发器和函数实验

存储过程、触发器和用户自定义函数实验实验内容一练习教材中存储过程、触发器和用户自定义函数的例子。
教材中的BookSales数据库,在群共享中,文件名为BookSales.bak。
实验内容二针对附件1中的教学活动数据库,完成下面的实验内容。
1、存储过程(1)创建一个存储过程,该存储过程统计“高等数学”的成绩分布情况,即按照各分数段统计人数。
执行存储过程:exec countpeople(2)创建一个存储过程,该存储过程有一个参数用来接收课程号,该存储过程统计给定课程的平均成绩。
执行存储过程:exec avg_score'C602'(3)创建一个存储过程,该存储过程将学生选课成绩从百分制改为等级制(即A、B、C、D、E)。
执行存储过程:exec alterscore(4)创建一个存储过程,该存储过程有一个参数用来接收学生姓名,该存储过程查询该学生的学号以及选修课程的门数。
执行存储过程:exec select_courses'李强'(5)创建一个存储过程,该存储过程有两个输入参数用来接收学号和课程号,一个输出参数用于获取相应学号和课程号对应的成绩。
执行存储过程:declare@score smallintexec select_socre'98601','C602',@score outputprint'成绩是'+convert(char(2),@score)+'分'2、触发器(1)为study表创建一个UPDATE触发器,当更新成绩时,要求更新后的成绩不能低于原来的成绩。
创建完触发器尝试进行更新数据:update study set score=60 where sno='98601'and cno='C601'执行完之后查询结果发现成绩仍然是90select score from study where sno='98601'and cno='C601'再更新一个高于90分的成绩则可以成功update study set score=91 where sno='98601'and cno='C601'select score from study where sno='98601'and cno='C601'(2)为study表创建一个DELETE触发器,要求一次只能从study表中删除一条记录。
实验五存储过程和触发器的定义和使用

实验五存储过程和触发器的定义和使用实验内容:1.在学生成绩数据库中建立表,并相应的导入数据create database学生成绩use学生成绩create table student(学号char(6)not null,姓名char(8)not null,性别bit not null,出生日期smalldatetime,专业名char(10),所在系char(10),联系电话char(11)null)create table course(课程号char(3)not null,课程名char(20)not null,教师char(10),开课学期tinyint,学时tinyint,学分tinyint not null)create table sc(学号char(6)not null,课程号char(3)not null,成绩smallint)2.(1)全局变量(2)if语句①②(3)循环语句①declare@i int,@sum int,@count intset@i=1set@sum=0set@count=0while (@i<100)beginif(@i%3=0)beginset@sum=@sum+@iset@count=@count+1endset@i=@i+1endprint'总和为:'+convert(varchar(10),@sum)print'个数为:'+convert(varchar(10),@count)②declare@i1int,@s1intset@i1=1set@s1=0beg:if(@i1<=5)beginset@s1=@s1+@i1set@i1=@i1+1goto begendprint@s1(4)waitfor 语句①waitfor delay'00:00:05'select*from studentgo②waitfor time'10:20'exec update_all_stats(5)case语句①select学号,性别=case性别when'1'then'男'when'0'then'女'endfrom studentgo②select学号,成绩=casewhen成绩IS NULL then'未考'when成绩<60 then'不及格'when成绩>=60 and成绩<70 then'及格'when成绩>=70 and成绩<90then'良好'when成绩>=90 then'优秀'endfrom sc3.存储过程(1)create proc proc1asselect学号,课程号from scwhere成绩between 60 and 80goexec proc1(2)①create proc proc21(@学号char(10))asdelete成绩from scwhere学号=@学号go②create proc proc22(@学号char(6),@课程号char(3),@成绩smallint)asinsert into scvalues(@学号,@课程号,@成绩)go(3)create proc proc3(@学号char(6),@课程号char(3),@成绩smallint output)asselect@成绩=成绩from scwhere学号=@学号and课程号=@课程号godeclare@成绩smallintexec proc3'020101','101',@成绩output select'成绩'=@成绩(4)create proc proc_t1(@专业名称char(10))asselect专业名,student.学号,姓名,course.课程号,course.课程名,成绩,学分from student,sc,coursewhere专业名=@专业名称and student.学号=sc.学号and sc.课程号=course.课程号goexec proc_t1'信息管理'go(5)alter proc proc_t1(@专业名称char(10))asselect专业名,student.学号,姓名,course.课程号,course.课程名,成绩,学分from student,sc,coursewhere专业名=@专业名称and student.学号=sc.学号and sc.课程号=course.课程号and student.性别=1goexec proc_t1'信息管理'go(6)drop proc proc_t1(7)create proc proc7(@课程名char(10))asbeginselect课程名,sum(case when成绩between 0 and 59 then 1 else 0 end)as'0-60分', sum(case when成绩between 60 and 79 then 1 else 0 end)as'60-79分', sum(case when成绩between 80 and 89 then 1 else 0 end)as'80-89分', sum(case when成绩between 90 and 100 then 1 else 0 end)as'90-100分' from sc,coursewhere课程名=@课程名and sc.课程号=course.课程号group by课程名endgoexec proc7'英语'go4.(1)create trigger tri_sc_insert on scafter insertasbegindeclare@sno char(6)select@sno=inserted.学号from insertedif not exists(select学号from student where学号=@sno) delete scwhere sc.学号=@snoendgo(2)create trigger tri_sc_upd on scafter updateasif UPDATE(成绩)beginprint'修改失败!!'raiserror ('不能修改SC表的成绩',16,10)rollback transactionendgo③create trigger trigger_1on Coursefor updateasif update(课程号)begin update SCset课程号=(select课程号from inserted)from SC,deletedwhere SC.课程号=deleted.课程号end④create trigger trigger_2on Studentfor deleteasbegindelete SCfrom SC,deletedwhere SC.学号=deleted.学号endgo⑤create trigger trigger_3on Studentfor updateasprint'学生表被修改了!'go⑥alter trigger trigger_3on Studentfor updateasdeclare@kch char(6)select@kch=学号from deletedprint'学生表中学号为'+@kch+'的记录被修改了' go⑦drop trigger trigger_3三、思考题1.存储过程的类型有哪些?分别有什么特征?类型:系统存储过程、扩展存储过程、用户定义存储过程特征:(1)系统存储过程:由系统创建、管理和使用;主要存储在master数据库,以sp_ 为前缀;用户只能对其调用,不能修改或删除;通过系统存储过程能够得到系统信息或为数据库系统管理员管理SQL Server提供支持。
存储过程与触发器 实验报告

信息工程学院实验报告课程名称:《数据库原理》实验项目名称:存储过程与触发器一、实验目的:(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表中查询此学生的信息。
实验五 存储过程和触发器

实验五触发器、存储过程操作实验本实验需要2学时。
请大家先根据“触发器.doc”文档完成相关操作,再进行本次实验。
介绍完“存储过程”后,需上交本次实验报告。
一、实验目的(1)掌握SQL Server中的触发器的使用方法;(2)掌握存储过程的操作方法。
二、实验内容1. 创建、查看、修改和删除触发器。
2. 创建、查看、修改和删除存储过程。
三、实验方法1. 触发器的操作(1)建立触发器方法一:使用企业管理器首先,打开企业管理器,定位数据库并找到要创建触发器的表;然后,右击该表名,在弹出的快捷菜单中选择“设计表”,在打开的“设计表”窗口中单击按钮,打开如图1所示窗口。
图1 触发器属性窗口最后,在触发器属性窗口中输入触发器的内容,并单击“确定”按钮。
方法二:使用CREATE TRIGGER语句语法:CREATE TRIGGER <触发器名>ON { <表名> | <视图名>}{ FOR | INSTEAD OF | AFTER}{ [UPDATE] [,] [INSERT] [,] [DELETE]}AS<SQL 语句块>(2)查看触发器方法一:使用企业管理器方法二:使用T-SQL语句- sp_help <触发器名>- sp_helptext <触发器名>- sp_depends <触发器名>(3)修改触发器方法一:使用企业管理器方法二:使用ALTER TRIGGER语句语法:ALTER TRIGGER <触发器名>ON { <表名> | <视图名>}{ FOR | INSTEAD OF | AFTER}{ [UPDATE] [,] [INSERT] [,] [DELETE]} AS<SQL 语句块>(4)删除触发器方法一:使用企业管理器方法二:使用DROP TRIGGER语句语法为:DROP TRIGGER <触发器名>2. 存储过程的操作(1)建立存储过程方法一:使用建立存储过程向导方法二:使用企业管理器方法三:使用SQL语句(CREATE PROCEDURE)语法:CREATE PROC[EDURE] <存储过程名>[{@<参数名> <数据类型>}]AS {<SQL语句> | <语句块> }(2)查看存储过程方法一:使用企业管理器方法二:使用SQL语句(系统存储过程)- sp_help <存储过程名>- sp_helptext <存储过程名>- sp_depends <存储过程名>(3)修改存储过程方法一:使用企业管理器方法二:使用SQL语句(ALTER PROCEDURE)语法为:ALTER PROC[EDURE] <存储过程名>[{@<参数名> <数据类型>}]AS {<SQL语句>| <语句块> }(4)删除存储过程方法一:使用企业管理器方法二:使用DROP PROCEDURE语句语法为:DROP PROCEDURE <存储过程名>四、实验内容1、在学生表student上建立一个DELETE类型的触发器tr_delete,触发动作是显示信息“已删除学生表中的数据”。
实验5触发器的定义剖析

实验5触发器的定义一实验题目:触发器的定义。
二实验目的:熟悉触发器的定义和使用。
三实验内容及要求:(从下面10个题目中选一个)题目一:学生(学号,年龄,性别,系名)课程(课号,课名,学分,学时)选课(学号,课号,成绩)1.建立学生表的insert触发器,若向学生表中插入一条记录,则自动向选课表中插入一行,令该生选一门选修人数最多的课。
2.在建立学生表的delete触发器,若选课表中该生有选课记录,则拒绝删除,要求在删除学生信息同时,将相关表中的信息全部删除。
题目二:图书(书号,书名,价格,出版社)读者(卡号,姓名,年龄,所属单位)借阅(书号,卡号,借阅日期)建立图书的insert触发器,若向图书中插入一条记录,则自动向借阅表中插入一行,令该书被借阅次数最多的读者借阅。
题目三:商品(编号,品名,进价,库存,售价,厂商编号)顾客(卡号,姓名,电话,积分)厂商(编号,厂址,名称、电话)销售(顾客卡号,商品编号,数量,日期)建立商品的delete 触发器,只有当此商品没有人买时才可删除,若有销售记录不能删除。
题目四:图书(书号,书名,作者编号,价格,出版社编号)作者(编号,姓名,电话)出版社(编号,出版社名称,地址)建立作者的delete 触发器,只有当此作者没有任何作品才可删除,若有出书的记录不能删除。
题目五:零件(编号,名称,颜色)车间(编号,名称,人数,主任)产品(编号,名称,车间编号)使用(产品编号,使用零件编号,个数)建立零件的delete 触发器,只有当此零件没有产品用时才可删除,若有使用记录不能删除。
题目六:药品(编号,名称,价格,厂商)处方(药品编号,数量,医生编号)医生(编号,姓名,科室,职称)建立药品的delete 触发器,只有当此药品品没有人买时才可删除,若有处方记录不能删除。
题目七:学生(学号,年龄,性别,系名)教材(编号,书名,出版社编号,价格)订购(学号,书号,数量)出版社(编号,名称,地址)建立学生的insert触发器,若向学生表中插入一条记录,则自动向订购表中插入一行,令该学生订购被订购数量最多的教材。
数据库触发器与存储过程的开发实践

数据库触发器与存储过程的开发实践在数据库开发的过程中,触发器(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`为存储过程的主体代码,即存储过程执行的逻辑。
数据库实验5 存储过程和触发器

实验五存储过程和触发器一、实验目的(1) 通过实践理解存储过程和触发器的概念、作用及优点;(2) 掌握存储过程的定义与调用,实现存储过程中带有不同参数的应用;(3) 掌握创建触发器。
二、实验原理1.存储过程一个被命名的存储在服务器上的T-SQL语句的集合,是封装重复性工作的一种方法。
(1)创建存储过程CREATE PROC[DURE]PROCDURE_NAME [{@PARAMENT DATA_TYPE}[VARYING][=DEFAULT][OUTPUT]] [, (1)AS SQL_STATEMENTPROCEDURE_NAME:新存储过程的名称,必须符合标识符规则且唯一。
@PARAMETER:过程中的参数。
可以声明一个或多个参数。
用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。
使用 @ 符号作为第一个字符来指定参数名称。
参数名称须符合标识符规则。
每个过程的参数仅用于该过程本身;相同的参数名称可用在其它过程中。
默认情况下参数只能代替常量,不能代替表名、列名或其它数据库对象名称。
DATA_TYPE:参数的数据类型。
DEFAULT:参数的默认值。
如果定义了默认值,不必指定该参数的值即可执行过程。
默认值必须是常量或 NULL。
OUTPUT:表明参数是返回参数。
该选项的值可以返回给 EXEC[UTE]。
使用 OUTPUT 参数可将信息返回给调用过程。
(2)执行存储过程SQL SERVER系统中,可以使用EXECUTE语句执行存储过程。
EXECUTE语句也可以简写为EXEC。
如果将要执行的存储过程需要参数,那么应该在存储过程名称后面带上参数值。
[EXEC[UTE]]{[@RETURN_STATUS=]{PROCEDURE_NAME[;NUMBER]|@PROCEDURE_NAME_VAR}[@PARAMETER={VALUE|@VARIABLE[OUTPUT]|[DEFAULT]}[,…N](3) 删除存储过程使用DROP PROCEDURE语句可永久地删除存储过程。
实验:存储过程与触发器

实验名称:存储过程与触发器实验目的:掌握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调用存储过程。
存储过程和触发器的使用和区别

存储过程和触发器的使⽤和区别今天被问到存储过程和触发器的使⽤和区别?仔细想想,好像存储器是存储器,触发器是触发器?没啥关系呀?存储过程:是在⼤型数据库系统中,⼀组为了完成特定功能的SQL 语句集,存储在数据库中,经过第⼀次编译后再次调⽤不需要再次编译,⽤户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执⾏它。
存储过程是数据库中的⼀个重要对象优点:1允许模块化程序设计(创建⼀次多次使⽤)2允许更快执⾏3减少⽹络流量4更好的安全机制格式:DELIMITER //CREATE PROCEDURE 储存名([ IN ,OUT ,INOUT ]?参数名?数据类形...)BEGINSQL语句END //DELIMITER ;调⽤过程:⽤call 过程名()查看所有的存储过程show procedure status;查看创建的存储过程show create procedure 过程名;删除过程 drop procedure 过程名In 表⽰参数从外部传⼊到⾥⾯使⽤(过程内部使⽤)Out 表⽰参数从过程⾥边把数据保存到变量中,交给外部使⽤,所有传⼊的必须是变量如果说传⼊的out变量本⾝在外部有数据,那么在进⼊过程之后,第⼀件事就是被清空,设为nullInout 数据可以从外部传⼊到过程内部使⽤,同时内部操作之后,⼜会将数据返回给外部触发器:触发器是⼀种特殊类型的存储过程,它⼜不同于存储过程,触发器主要是通过事件进⾏触发⽽被执⾏的,⽽存储过程可以通过存储过程名字⽽被直接调⽤作⽤:1.可在写⼊数据表前,强制检验或转换数据2.触发器发⽣错误时,异动的结果会被撤销格式DELIMITER //Create trigger 触发器名字触发时机触发事件 on 表 for eachrowBegin操作的内容End //DELIMITER ;触发对象:on 表 for each row 触发器绑定实质是表中的所有⾏,因此当每⼀⾏发⽣改变的时候,就会触发触发器触发时机:每张表中对应的⾏都会有不同的状态,当SQL 指令发⽣的时候,都会令⾏中的数据发⽣改变,每⼀⾏总会有两个状态。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五存储过程和触发器的定义和使用一、实验目的1、掌握局部变量、全局变量、流程控制语句的使用方法2、了解存储过程的类型和作用,并掌握使用对象资源管理器和Transact-SQL语句创建存储过程的方法及使用方法。
3、理解触发器的特点和作用,并掌握使用Transact-SQL语言创建触发器的方法二、实验容1. 在学生成绩库中中有如下各表:学生表(Student)create database学生成绩数据库create table Student(学号Char(6)not null,Char(8)not null,性别Bit not null,出生日期smalldatetime,专业Char(10),所在系Char(10),联系Char(11)null)课程表(Course)create table Course(课程号Char(3)not null,课程名Char(20)not null,教师Char(10),开课学期Tinyint,学时Tinyint,学分Tinyint not null,)学生选课成绩表(SC)create table SC(学号Char(6)not null,课程号Char(3)not null,成绩Smallint,)对三个表格分别导入,截图如下:2、T-SQL语句中流程控制语句的使用(1)全局变量的使用。
显示到当前日期和时间为止试图登录SQL Server的次数。
select getdate()as'当前的日期和时间',connections as'试图登陆的次数'(2)IF语句的使用。
①在Student表中,若存在学号“020205”的学生,则显示该学生的信息,否则插入该学生的记录(020205,萍,0, 1983-7-20, 电子商务, 经济系, 88297171)If exists(select*from Student where学号='020205')select*from Student where学号='020205'Elseinsert into Student values('020205','萍','0','1983-7-20','电子商务','经济系','88297171')②查询颖有没有选课,若选了课,则统计其平均成绩,若没有选课,则输出“颖没有选课”If exists(select from Student,SC where='颖'and Student.学号=SC.学号)select avg(成绩)from SC,Student where Student.='颖'and Student.学号=SC.学号Elseprint'颖没有选课!'(3)循环语句的使用。
①用WHILE语句编程计算1-100之间所有能被3整除的数的个数及总和。
DECLARE S SMALLINT,I SMALLINT,NUMS SMALLINTSET S=0SET I=1SET NUMS=0WHILE(I<=100)BEGINIF(I%3=0)BEGINSET S=S+ISET NUMS=NUMS+1ENDSET I=I+1ENDPRINT SPRINT NUMS②利用GOTO语句求出从1加到5的总和。
DECLARE S SMALLINT,I SMALLINTSET I=1SET S=0BEG:IF(I<=5)BEGINSET S=S+ISET I=I+1GOTO BEGENDPRINT S(4)W AITFOR语句的使用。
①等待5秒后执行查询Student学生信息waitfor delay '00:00:05'select*from Student②等到晚上10:20执行存储过程update_all_stats 。
BEGINWAITFOR TIME'10:20'EXECUTE update_all_statsEND(5)CASE语句的使用。
①查询Student的SNO,SEX,如果SEX为“1”则输出“男”,如果为“0”输出“女”。
SELECT学号,性别=CASE性别WHEN'1'THEN'男'WHEN'0'THEN'女'ENDFROM Student②从SC表中查询所有同学选课成绩情况,凡成绩为空者输出“未考”、小于60分输出“不及格”、60分至70分输出“及格”、70分至90分输出“良好”、大于或等于90分时输出“优秀”。
SELECT学号,课程号,成绩=CASEWHEN成绩IS NULL THEN'未考'WHEN成绩<60 THEN'不及格'WHEN成绩>=60 AND成绩<70 THEN'及格'WHEN成绩>=70 AND成绩<90 THEN'良好'WHEN成绩>=90 THEN'优秀'ENDFROM SC3、存储过程的的使用。
在上面学生成绩库中完成如下操作:(1)创建如下不带参数的简单存储过程:查询成绩在60至80分之间的学生的学号和课程号。
create procedure SCListasselect学号,课程号from SCwhere成绩>60 and成绩<80(2)分别创建如下的带输入参数的存储过程:①根据用户输入的学号,删除该学生选课成绩记录;create procedure studentqk1(学号char(10))asdelete成绩from SCwhere学号=学号②向SC表中插入数据。
create procedure sccharu(学号char(10),课程号char(10),成绩int)asinsert into SC values(学号,课程号,成绩)(3)创建如下的带输出参数的存储过程,并写出一个执行该过程的例子:根据用户输入的学号,课程号,输出其成绩。
create procedure grade(学号char(10),课程号char(10)output,成绩int output)asselect成绩=成绩from SCwhere学号=学号and课程号=课程号declare成绩intexecute grade '020101','101',成绩outputselect'成绩'=成绩(4)创建存储过程proc_t1,要现如下功能:输入专业名称,产生该专业学生的选课情况列表,其中包括专业、学号、、课程号、课程名、成绩、学分等。
并调用此存储过程,显示“信息管理”专业学生的选课情况列表。
create procedure proc_t1 (专业char(10))asselect Student.学号,Student.专业,Student.,Course.课程号,Course.课程名,Course.学分,成绩from Student,Course,SCwhere Student.学号=SC.学号and Course.课程号=SC.课程号and Student.专业=专业exec proc_t1 '信息管理'(5)对学生成绩库中已创建的存储过程proc_t1进行修改,要现如下功能:输入专业名称,产生该专业所有男生的选课情况列表,其中包括专业、学号、、课程号、课程名、成绩、学分等。
并调用修改后的存储过程,显示“信息管理”专业男生的选课情况列表。
alter procedure proc_t1 (专业char(10))asselect Student.学号,Student.专业,Student.,Course.课程号,Course.课程名,Course.学分,成绩from Student,Course,SCwhere Student.学号=SC.学号and Course.课程号=SC.课程号and Student.专业=专业and性别=1exec proc_t1 '信息管理'(6)删除学生成绩库中的存储过程proc_t2。
drop procedure proc_t1(7)编写存储过程,要现如下功能:输入课程名称,产生该课程各分数段及其相应人数的成绩分布情况统计。
create procedure scqk (课程名char(10))asbeginselect课程名,sum (case when成绩between 0 and 59 then 1 else 0 end ) as'不及格',sum (case when成绩between 60 and 69 then 1 else 0 end ) as'60-69',sum (case when成绩between 70 and 89 then 1 else 0 end ) as'70-89',sum (case when成绩between 90 and 100 then 1 else 0 end ) as'90-100' from SC,Coursewhere SC.课程号=Course.课程号and课程名=课程名group by课程名endexec scqk '计算机原理'4、触发器的使用。
在上面学生成绩库中完成如下操作:(1)DML触发器的使用①创建一个INSERT触发器tri_sc_insert,当向sc表中添加数据时,如果添加的数据与Student表中的数据不匹配(没有对应的学号),则将此数据删除。
create trigger tri_sc_insert on SCfor insertasbegindeclare bh char(6)select bh=inserted.学号from insertedif not exists(select学号from Student where Student.学号=bh)delete SC where学号=bhend②创建一个UPDATE触发器tri_sc_upd,用来防止用户修改SC表的成绩。
create trigger tri_sc_upd on SCfor updateasif update(成绩)beginprint'修改失败。
'raiserror('不能修改SC表的成绩',16,10)rollback transactionend③创建一个级联修改触发器trigger_1,即当修改学生课程表Course中的某门课的课程号时,对应学生的选课表SC中的课程号也作修改create trigger trigger_1 on Coursefor updateasif update(课程号)begin update SCset课程号=(select课程号from inserted)from SC,deletedwhere SC.课程号=deleted.课程号end④建立一个级联删除触发器trigger_2,实现,即当删除表Student中的记录时,自动删除表sc中对应选课记录。