实验5:存储过程和触发器
实验5:存储过程和触发器
云南大学软件学院实验报告课程:数据库原理与实用技术实验学期:2014-2015学年第二学期任课教师:薛岗、朱艳萍专业:学号:姓名:成绩:实验5 存储过程和触发器一、实验目的(1)理解存储过程的概念、了解存储过程的类型(2)掌握创建存储过程的方法(3)掌握执行存储过程的方法(4)理解触发器的功能及工作原理。
(5)掌握创建、更改、删除触发器的方法。
二、实验内容1、使用不带参数的存储过程(1)创建一个存储过程,查询person表中所有不重复的职称。
(2)执行存储过程。
2、带输入参数的存储过程(1)创建一个存储过程,按照姓名查询person表中的员工信息。
(2)执行存储过程,查询名为黎明的员工数据3、带输入/输出参数的存储过程(1)创建一个存储过程,使其能够根据员工姓名,查询员工工资。
(考虑到员工不存在时给出提示信息)(2)执行存储过程4、使用触发器(1)创建一个触发器trig_update,返回对person进行更新操作后,被更新的记录条数(2)执行触发器(3)修改触发器trig_update,除返回被更新的记录条数外,再返回学生的所有基本信息5、使用触发器的两个特殊表:插入表(inserted)和删除表(deleted)。
(1)在person上创建触发器ins_del_sample,在插入、删除或更新操作后,分别从inserted表和deleted表中查询员工所有信息。
(请同学们在做删除操作时,注意备份)(2)执行触发器。
思考执行插入、删除和更新操作后返回的表有什么区别?6、使用系统存储过程查看触发器(与存储过程的使用类似)(1)显示触发器trig_update的一般信息(2)显示触发器trig_update的源代码(3)显示person上所有的依赖关系(4)显示触发器trig_update所引用的对象。
存储过程和触发器实验心得
存储过程和触发器实验心得1、PLSQL创建储存过程编译出错不会给出错误提示,导致调用时提示储存过程处于无效状态。
解决方案:使用SQLPLUS,不过SQLPLUS只会提示编译错误,不会提示具体原因,还可以使用Navicat工具,Navicat会给出更加详细的错误原因。
2、创建储存过程时,设置变量参数类型时,指定了字符长度导致创建失败。
解决方案:直接设置变量数据类型,不设置其字符长度。
3、使用TO_DATE(SYSDATE,‘YYYY/MM/DD’)获取当前日期作为借阅日期导致调用借书储存过程失败,提示参数类型错误。
解决方案:因为TO_DATE()函数是将字符类型转换成日期类型,而SYSDATE本来就是日期类型,所以导致调用失败,使用TO_DATE(TO_CHAR(SYSDATE,‘YYYY/MM/DD’),‘YYYY/MM/DD ’)将SYSDATE转换成字符类型再转换成日期类型。
4、使用DBMS_OUTPUT.PUT_LINE()函数输出提示,没有反应。
解决方案:在SQLPLUS中需要先使用SET SERVEROUTPUT ON;打开输出模式才能看见输出,而在PLSQL中输出的内容在另一个Output窗口中,而不是没有反应。
5、创建自动递增借阅流水号的触发器时,使用NEW关键字改变借阅流水号,导致创建触发器失败,解决方案:使用NEW关键字时,需要在前面加一个“:”号,如“:NEW.借阅流水号”。
6、调用修改后的借书储存过程时,发送错误,提示违反唯一约束条件以及COMMIT;不能再触发器中使用。
解决方案:删除在触发器中的COMMIT;,然后删除序列“借阅流水号序列”,重新创建序列“借阅流水号序列”,并且设置初始值为8,因为借阅表中已经有借阅流水号1到7的数据了,然后创建序列时未指定初始值,序列默认从1开始,导致违反唯一约束条件,从而导致调用储存过程失败。
四、实验心得体会通过本次实验,学会了储存过程以及触发器和序列的使用方法,对存储过程有了一个直观的认识,对触发器的工作原理和作用有了更加深刻的认识,使用触发器可以在修改数据前后规范数据,使数据规范化和标准化。
存储过程和触发器(数据库实验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='无此专业。
数据库 存储过程和触发器 实验报告
实验报告课程名称:数据库原理与应用上机实验名称:存储过程和触发器专业班级:计算机科学与技术1103 指导教师:卫凡学生姓名:贾梦洁学期:2013-2014学年第一学期实验报告课程名称数据库原理与应用实验名称存储过程和触发器姓名贾梦洁学号 201107010330专业班级计1103实验日期2013年12月5日成绩指导教师卫凡一、实验目的1.加深和巩固对存储过程和触发器概念的理解。
2. 掌握触发器的简单应用。
3. 掌握存储过程的简单应用。
二、实验环境硬件环境:PC机软件环境:操作系统为Microsoft Windows 2000或以上版本。
数据库管理系统为Microsoft SQL Server 2000标准版或企业版。
三、实验内容1. 熟悉运用SQL Server企业管理器和查询分析器进行存储过程的创建和删除。
2. 熟悉运用SQL Server企业管理器和查询分析器进行触发器的创建和删除。
四、实验步骤1.建立存储过程class_info ,当执行该过程时,只要给出学生的姓名,就能查到他们的班级名称。
使用存储过程class_info查找学生“张强”的信息。
2.删除存储过程 class_info3.使用触发器实现S,SC表的级联删除删除前:删除后:4.在数据库中创建一个触发器,当向S表中插入一条记录时,检查该记录的学号在S表中是否存在,如果有则不允许插入。
5.创建基于学生表的插入触发器,当向学生表插入一条记录时,返回一条信息:“欢迎新同学”。
6.为S表创建触发器s_insert,当向S表中插入数据时,要求学号必须以"2002"开头,否则取消插入操作。
五、实验总结这次的实验总体来说较前两次简单,因为很多题目都是书上的例题。
不过通过这次实验,也把上课没有认真听讲的部分给补上了。
至少让我不要在见到这些题目的时候觉得陌生,我觉得对我的数据库期末考试是有一定帮助的。
虽然数据库对我来说真的好苦手,但是我相信只要努力了总能做到的。
实验五存储过程和触发器(计科)
实验五存储过程和触发器(计科)实验五:触发器和存储过程一、实验目的:理解触发器和存储过程的含义,掌握用SQL语句实现触发器和存储过程的编写,并初步掌握什么情况下使用事务。
二、预习要求:存储过程和触发器的相关概念,事务的相关概念,编写相应的SQL语句。
三、实验内容:有一个小型的图书管理数据库,包含的表为:bookstore(bookid,bookname,bookauthor,purchasedate,state);--图书库存表borrowcard(cardid,ownername);--借书证表borrowlog(cardid,bookid,borrowdate,returndate);--借书记录表写一个存储过程,实现借书操作,要求有事务处理。
(1)读者借书,要先设置书籍不在库标志state(借出),然后增加借书记录,在同一事务中完成。
(2)要求在事务执行过程中引入错误触发事件,以此体会事务的错误保护机制和事务编程的作用。
(3)要求用触发器实现表的完整性控制。
四、完成情况(附上设计的SQL语句)。
------触发器和存储过程------触发器和存储过程CREATE DATABASE BOOK1gouse BOOK1CREATE TABLE BOOKSTORE(Bookid nvarchar(10),Bookname nvarchar(10),Bookauthor nvarchar(10),purchasedate datetime,state Nvarchar(10),primary key(Bookid))Create table Borrowcard(Cardid int,ownernamenvarchar(10),primarykey(Cardid))Create table Borrowlog(Cardid int,Bookid nvarchar(10),borrowdate datetime,returndate datetime ,primary key(Cardid,Bookid))insert into Borrowcard values(12,'wyb')insert into Borrowcard values(123,'wyb')insert into Borrowcard values(1,'wyb')insert into Bookstore values(1,'数据库','王珊','2012-04-23','存在') insert into Bookstore values(2,'数据结构','珊','2012-11-23','存在') insert into Bookstore values(3,'数据结构','珊','2011-1-23','存在') insert into Bookstore values(11,'数据库','王珊','2009-10-23','存在') insert into Bookstore values(12,'数据结构','珊','2001-11-23','存在') insert into Bookstore values(13,'数据结构','珊','2013-12-23','存在')----借书存储过程create proc borrow1@bookid nvarchar(10),@cardid intasbegin transactioninsert into Borrowlog(Cardid,Bookid,borrowdate,returndate) values(@cardid,@bookid,getdate(),null)if exists(select*from bookstore,Borrowcard where bookid=@bookid and state='存在'and cardid=@cardid) beginupdate bookstore set state='不存在'where bookid=@bookid commit transactionendelsebeginif exists(select*from bookstore where bookid=@bookid and state='不存在')Print'不存在该书'if not exists(select*from borrowcard,bookstore where cardid=@cardid) Print'没有此用户'rollback transactionEndexec borrow1'3',12exec borrow1'3',123exec borrow1'2',123drop proc borrow1----删除存储过程Create trigger insert_borrowlogon Borrowlog after insertasdeclare@borrowdate datetime,@returndate datetimeselect@borrowdate=borrowdate,@returndate=returndate from insertedif(@borrowdate>@returndate)print'借书时间不可晚于还书时间'rollbackselect*from bookstoreinsert into Borrowlog values(12,'1','2013-06-06','2012-05-5')五、思考题:如何通过系统的设置实现类似的功能,而不需触发器?答:通过定义存储过程或者设置外键约束等方法。
实验五 存储过程和触发器的使用
实验五存储过程和触发器的使用【目的要求】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语句放在单个批处理中。
5 实验五 创建存储过程和触发器
实验五创建存储过程和触发器
一、实验目的
1.通过对常用系统存储过程的使用,了解存储过程的类型;通过创建和执行存储过程,了解存储过程的基本概念,掌握使用企业管理器及查询分析器执行T-SQL语句创建存储过程。
2.通过创建触发器,了解触发器的基本概念,理解触发器的功能,掌握使用企业管理器及查询分析器执行T-SQL语句创建触发器。
二、实验要求
1.实验前做好上机实验的准备,针对实验内容,认真复习与本次实验有关的知识,完成实验内容的预习准备工作;
2.能认真独立完成实验内容;
3.实验后做好实验总结,根据实验情况完成总结报告。
三、实验学时
2学时
四、实验内容
1、使用sp_helptext查看byroyalty存储过程的文本,该存储过程在数据库pubs中。
2、在实验二创建的factory数据库中执行以下操作:
(1)创建一个为worker表添加职工记录的存储过程addworker。
执行并验证存储过程的正确性。
最后删除该存储过程。
(2)在depart表上创建一个触发器depart_update,当更改部门号时同步更改worker 表中对应的部门号。
执行并验证触发器的正确性。
最后删除该触发器。
(3)在worker表上创建一个触发器worker_delete,当删除职工记录时同步删除salary表中对应职工的工资记录。
执行并验证触发器的正确性。
最后删除该触发器。
实验5:存储过程、触发器和视图
实验5:存储过程、触发器和视图第五周实验可编程对象(视图、存储过程和触发器)一.实验目的1.了解视图、存储过程和触发器的基本概念和使用方法。
2.学会用两种方法创建和维护视图、存储过程和触发器等数据库对象:一是在SQL Server Management Studio通过可视化操作实现,一是在查询窗口执行相关T-SQL语句实现。
二.实验环境●SQL Server Management Studio●BookStore数据库提示1:到“课程辅助材料”中下载BookStore数据库,在SQL Server中附加。
三.实验内容说明:标记为▲的是必做题目,其他为选作题目。
首先需要附加BookStore数据库。
1▲.创建视图。
(1)创建视图V_BookSell,使其包含图书销量情况。
要求显示图书代码(BookCode)、图书名称(BookName)、作者(Author)、出版社名称(Publisher)以及数量(Amount)。
(2)创建视图V_CustomerBookOrderDetail。
要求显示订单号(OrderCode)、客户名(Name)、客户等级(VIPClass)、书名(BookName)、单价(Price)、数量(Amount)、折扣(Discount)以及总价(TotalPrice=Price*Amount*Discount)。
(3)创建视图V_CustomerVIPABTotalOrder,汇总客户订单信息。
使其包含用户等级为“A”和“B”、且不姓“郭”和“刘”的客户订单信息,要求显示客户姓名(Name)以及所订图书总金额,并按所订图书总金额降序排列。
2.创建存储过程(1)▲创建存储过程proc_SearchBook,查询指定书名的图书信息。
(2)创建存储过程proc_FuzzySearchBook,实现按书名(全名或部分书名)模糊查询图书信息。
(3)创建存储过程proc_SearchCustomerMoney,查询指定客户在某一年之前的购书总金额(已知客户号和年份,输出总金额)。
实验五存储过程和触发器的定义和使用
实验五存储过程和触发器的定义和使用实验内容: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提供支持。
实验五 存储过程和触发器
实验五触发器、存储过程操作实验本实验需要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,触发动作是显示信息“已删除学生表中的数据”。
存储过程和触发器
第10章存储过程和触发器学习目标本章将要学习存储过程和触发器的基本概念、作用和基本操作;本章学习要点:◆存储过程的概念、作用、分类;◆存储过程的创建、查看、修改和执行;◆触发器的主要作用、类型;◆inserted表和deleted表的作用和使用;◆触发器的创建方法、查看、修改和执行;学习导航存储过程Store Procedure和触发器Trigger是SQL Server 数据库系统重要的数据库对象,在以SQL Server 2005 为后台数据库创建的应用程序中具有重要的应用价值;本章主要内容见图10-1所示的学习导航;图10-1 本章内容学习导航存储过程概述Transact-SQL语言是应用程序与SQL Server数据库之间的主要编程接口,大量的时间将花费在Transact-SQL语句和应用程序代码上;在很多情况下,许多代码被重复使用多次,每次都输入相同的代码不但繁琐,更由于在客户机上的大量命令语句逐条向SQL Server 发送,将降低系统运行效率;因此,SQL Server提供了一种方法,它将一些固定的操作集中起来由SQL Server数据库服务器来完成,应用程序只需调用它的名称,就可实现某个特定任务,这种方法就是存储过程;下面将详细介绍存储过程的概念、特点、创建、执行等内容;10.1.1 存储过程的概念SQL SERVER 中T-SQL语言为了实现特定任务而将一些需要多次调用的固定的操作编写成子程序并集中以一个存储单元的形式存储在服务器上,由SQL Server数据库服务器通过子程序名来调用它们,这些子程序就是存储过程;存储过程是一种数据库对象,存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行,具有很强的编程功能;存储过程可以使用EXECUTE语句来运行;在SQL Server中使用存储过程而不使用存储在客户端计算机本地的T-SQL程序有以下几个方面的好处;1加快系统运行速度;存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行依次就编译一次,所以使用存储过程可提高数据库执行速度;2封装复杂操作;当对数据库进行复杂操作时如对多个表进行Update Insert,Query,Delete时,可用存储过程将此复杂操作封装起来与数据库提供的事务处理结合一起使用;3实现代码重用;可以实现模块化程序设计,存储过程一旦创建,以后即可在程序中调用任意多次,这可以改进应用程序的可维护性,并允许应用程序统一访问数据库;4增强安全性;可设定特定用户具有对指定存储过程的执行权限而不具备直接对存储过程中引用的对象具有权限;可以强制应用程序的安全性;参数化存储过程有助于保护应用程序不受SQL注入式攻击;5减少网络流量;因为存储过程存储在服务器上,并在服务器上运行;一个需要数百行T-SQL代码的操作可以通过一条执行过程代码的语句来执行;而不需要在网络中发送数百行代码,这样就可以减少网络流量;10.1.2 存储过程的分类在SQL Server 2005中存储过程可以分为两类:系统存储过程和用户存储过程;1.系统存储过程系统存储过程是由SQL Server系统提供的存储过程,可以作为命令执行各种操作;系统存储过程主要用来从系统表中获取信息,为系统管理员管理SQL Server 提供帮助,为用户查看数据库对象提供方便;例如,执行sp_helptext系统存储过程可以显示规则、默认值、未加密的存储过程、用户函数、触发器或视图的文本信息;执行sp_depends系统存储过程可以显示有关数据库对象相关性的信息;执行sp_rename系统存储过程可以更改当前数据库中用户创建对象的名称;SQL Server中许多管理工作是通过执行系统存储过程来完成的,许多系统信息也可以通过执行系统存储过程而获得;系统存储过程定义在系统数据库master中,其前缀是sp_;在调用时不必在存储过程前加上数据库名;有关系统存储过程的详细介绍请参考SQL Server联机丛书;除了以sp_为前缀的系统存储过程,我们还常见到以xp_为前缀的存储过程,这种存储过程为扩展存储过程;扩展存储过程主要用于扩展SQL Server的功能;2.用户存储过程用户存储过程是指用户根据自身需要,为完成某一特定功能,在用户数据库中创建的存储过程;用户创建存储过程时,存储过程名的前面加上“”,是表示创建全局临时存储过程;在存储过程名的前面加上“”,是表示创建局部临时存储过程;局部临时存储过程只能在创建它的会话中可用,当前会话结束时除去;全局临时存储过程可以在所有会话中使用,即所有用户均可以访问该过程;它们都保存在tempdb数据库中;10.1.3存储过程的创建与管理在SQL Server 2005 中通常可以使用两种方法创建存储过程:一种是使用图形化管理工具SQL Server Management Studio 创建存储过程;另一种是使用T-SQL 语句创建存储过程;创建存储过程时,需要注意下列事项:●只能在当前数据库中创建存储过程;●创建存储过程时,应指定所有输入参数和向调用过程或批处理返回的输出参数、执行数据库操作的编程语句和返回至调用过程或批处理以表明成功或失败的状态值;●在用户存储过程的定义中不能使用下列对象创建语句:CREATE VIEW、CREATE DEFAULT、CREATERULE、CREATE PROCEDURE、CREATE TRIGGER;即在存储过程的创建中不能嵌套创建以上这些对象;存储过程创建后,可以使用EXECUTE语句来执行可以简写为EXEC,如果它是一个批处理中的第一条语句,则关键字EXECUTE或EXEC也可省略;10.1.4 使用SSMS创建和执行存储过程案例10-1执行系统存储过程sp_help查看教务管理数据库stu中class表的信息;程序清单:use stugoexec sp_help class运行以上程序,结果如图10-2所示;图10-2 执行系统存储过程sp_help查看class表信息案例10-2在数据库stu中,创建一个名称为“stu_softjs”的存储过程,通过该存储过程可查询出软件工程系所有教授的信息;操作步骤如下:1启动SQL Server Management Studio,在对象资源管理器窗口中,依次展开数据库→stu→可编程性节点;2右键单击存储过程节点,选择新建存储过程命令,打开创建存储过程模版文档窗口,如图10-3所示;3用户在模版文档窗口中根据相应提示输入存储过程名称和T-SQL语句;创建存储过程“stu_softjs”,如图10-4所示;4单击执行按钮,完成存储过程的创建;提示·在模板文档窗口中可以把不必要的参数去掉;·在第2步骤右键单击“存储过程”节点,选择“刷新”,即可看到刚刚创建好的存储过程;图10-3 创建存储过程模版文档窗口图10-4 创建存储过程“stu_softjs”案例10-3使用SSMS执行上面例子中创建的存储过程“stu_softjs”;⑴启动SQL Server Management Studio,在对象资源管理器中依次展开数据库→student→可编程性→存储过程节点;⑵右键单击stu_softjs存储过程,选择执行存储过程命令,如图10-5所示;⑶打开执行过程对话框,再单击确定按钮即可;图10-5 选择执行存储过程命令10.1.5 使用SSMS查看、修改和删除存储过程案例10-4使用SSMS,查看上例中创建的存储过程“stu_softjs”的属性;1在如图10-5所示的右键菜单中,选择属性菜单,打开存储过程属性对话框;2选择常规选项卡:可以查看到该存储过程属于哪个数据库、创建如期和属于男个数据库用户等信息;3选择权限选项卡:可以为该存储过程添加用户并授予其权限;4选择扩展属性选项卡:可以了解排序规则等扩展属性;提示在如图10-4所示的右键菜单中,选择“删除”菜单命令可以删除指定的存储过程;选择“修改”命令进入存储过程文本修改状态,可对存储过程进行修改;选择“重命名”可以实现存储过程的名称的更改;10.1.6 使用T-SQL语句创建和执行存储过程1.创建存储过程使用T-SQL语句CREATE PROC可以创建存储过程,其基本语句格式如下所示;CREATE PROCEDURE 存储过程名{参数1 数据类型}=默认值 OUTPUT, nWHTI ENCRYPTION│RECOMPILEASSQL语句参数含义:◆存储过程名:要符合标识符规则,少于128个字符;◆参数:过程中的参数;在CREATE PROCEDURE语句中可以声明一个或多个参数;◆OUTPUT:表明该参数是一个返回参数;◆AS:用于指定该存储过程要执行的操作;◆SQL语句:是存储过程中要包含的任意数目和类型的T-SQL语句;◆ENCRYPTION:用于加密存储过程文本;本加密的存储过程,其图标上有“加锁”标志,其定义内容不可修改,也不可通过系统存储过程sp_helptext查看;◆RECOMPILE:设置该选项后,存储过程将在运行时重新编译;案例10-5在“stu”数据库中,创建一个存储过程“stu_softxs”,通过该存储过程可以查询软件技术专业的学生信息;1 在“查询编辑器”窗口中输入如下代码:USE stuGOCREATE PROC stu_softxsASSelectFrom studentWhere s_classid inSELECT c_id FROM classWHERE sp_id inSELECT sp_idFROM specialityWHERE sp_name=’软件技术’GO2 单击“分析”按钮,进行语法检查;再单击“执行”按钮,创建存储过程;2.执行存储过程执行存储过程的基本语句格式:EXEC procedure_name Value_List参数含义:●procedure_name:要执行的存储过程的名称;●Value_List:输入参数值;案例10-6执行以上存储过程“stu_softxs”;代码如下:USE STUGOEXEC stu_softxsGO执行以上代码,结果如图10-6所示;图10-6 执行存储过程“stu_softxs”结果10.1.7 创建和执行带参数的存储过程带参数的存储过程可以扩展存储过程的功能;使用输入参数,可以将外部信息输入到存储过程;使用输出参数,可以将存储过程内的信息转到外部;创建带参数的存储过程时,参数可以是一个,也可以是多个,多个参数时,参数之间用逗号分隔;所有数据类型均可以作为存储过程的参数,一般情况下,参数的数据类型要与它相关的字段的数据类型一致;1.带有输入参数的存储过程案例10-7在“stu”数据库中,创建存储过程“stu_zymc”,该存储过程带有一个用于接收用户输入专业名称的输入参数;该存储过程要求被执行时,它将根据用户输入的专业名称列出该专业的所有班级信息;代码如下:CREATE PROC stu_zymc zymc varchar20/变量参数的数据类型与长度都要和表中相关字段的定义一致/ASSELECT FROM classWHERE sp_id inSELECT sp_idFROM specialityWHERE sp_name=zymcGO执行该存储过程“stu_zymc”,代码如下:Use stuGoEXEC stu_zymc 软件技术go执行结果如图10-7所示;提示执行带参数的存储过程,有两种方式;·按位置转递;在调用存储过程时,直接给出参数值;如果多于一个参数,给出的参数值要与定义的参数顺序一致;例如:EXEC stu_zymc 软件技术;·使用参数名称转递;在调用存储过程时,按“参数名=参数值”的形式给出参数值;采用此方式,参数如果多于一个时,给出的参数顺序可以与定义的参数的顺序不一致;例如:EXEC stu_zymc zymc=软件技术;图10-7 执行存储过程显示出相应专业的班级信息2.带有参数默认值的存储过程案例10-8如果要求上例中创建的存储过程stu_zymc在被执行时不给出参数值将默认显示软件技术专业的班级信息,则创建该存储过程的代码为:/变量参数的默认值是“软件技术”专业/CREATE PROC stu_zymc zymc varchar20 =’软件技术’ASSELECT FROM classWHERE sp_id inSELECT sp_idFROM specialityWHERE sp_name=zymcGO不带参数值执行该存储过程,代码:EXEC stu_zymc3.带有输出参数的存储过程输出参数用于在存储过程中返回值,使用OUTPUT声明输出参数;案例10-9在stu数据库中,创建一个带有输出参数的存储过程stu_xspjf,其中输出参数用于返回学号为02的学生的平均成绩;创建该存储过程代码:USE stuGO /输出参数的数据类型要与它接收的值的类型一致/create proc stu_xspjf xspjf tinyint outputasselect xspjf=avgsc_gradefrom stucoursewhere s_num='02'go执行该存储过程并输出显示的代码如下,执行结果如图10-8所示;use stugodeclare avg tinyintexec stu_xspjf avg outputprint '学号为02的同学的平均分为:'+ltrimstravg+'分'提示执行带有输出参数的存储过程时,需要声明变量来接收存储过程中由输出参数返回来的返回值;一般情况下,声明的变量的数据类型要与存储过程的输出参数的数据类型一致;在使用该变量时,还必须为它加上OUTPUT 声明;图10-8 执行带有输出参数的存储过程并输出显示信息10.1.8 使用T-SQL语句查看、修改和删除存储过程1 使用SSMS查看、修改和删除存储过程请参阅案例10-4、提示和图10-5;2.使用系统存储过程查看存储过程信息1使用sp_help 查看存储过程的一般信息,包含存储过程的名称、拥有者、类型和创建时间,其语法格式为:Exec Sp_help 存储过程名2使用sp_helptext查看存储过程的定义信息,其语法格式为:Exec Sp_helptext 存储过程名案例10-10分别使用系统存储过程sp_help和sp_helptext查看stu数据库中的存储过程“stu_xspjf”的定义、相关性及一般信息;代码如下,结果如图10-9所示;USE stuGOEXEC sp_help stu_xspjfEXEC sp_helptext stu_xspjfGO图10-9 使用系统存储过程查看存储过程信息3.使用语句修改存储过程使用ALTER PROCEDURE语句可以更改先前通过执行CREATE PROCEDURE语句创建的过程,ALTER PROCEDURE基本语句格式如下;ALTER PROCEDURE 存储过程名{参数1 数据类型}=默认值OUTPUT,…….{参数 n 数据类型}=默认值OUTPUTASSQL语句…….各参数含义与CREATE PROCDURE语句相同,只是把创建时的CREATE 改为了 ALTER;因为修改和创建时的过程方法一样,在这里不再另外举例说明;4.使用语句删除存储过程当存储过程没有存在的意义时,可以使用DROP PROCEDURE 语句将其删除;用于删除存储过程的基本语句格式:DROP PROCEDURE 存储过程名,…n案例10-11删除“stu”数据库中的存储过程“stu_xspjf”;代码如下:USE stuGODROP PROCEDURE stu_xspjfGO触发器概述10.2.1 触发器的概念1.触发器的作用触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效,实现表间的数据完整性和复杂的业务规则;与前面介绍过的存储过程不同,存储过程可以通过存储过程名字被直接调用,而触发器不能,触发器主要通过事件进行触发而自动执行的;当对某一表进行诸如INSERT、UPDATE或DELETE操作时,如果在这些操作上定义了触发器,SQL Server就会自动执行触发器执行触发器中所定义的SQL语句,从而确保对数据的处理必须符合由这些SQL语句所定义的规则;触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性,除此之外,触发器还有其他许多不同的功能;①强化约束:触发器能够实现比CHECK语句更为复杂的约束;CHECK约束不允许引用其他表中的列来完成检查工作,而触发器可以引用其他表中的列;②跟踪变化:触发器可以侦测数据库的操作,从而不允许数据库中未经许可的指定更新和变化;③级联运行:触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的相关内容;例如,某个表上的触发器中包含有对另外一个表的数据操作如插入、更新、删除,而该操作又导致该表上触发器被触发;2.触发器类型在SQL Server2005中,触发器分为DML触发器和DDL触发器两大类;当数据库中发生数据操作语言DML事件时将调用DML触发器,当服务器或数据库中发生数据定义语言DDL事件时将调用DDL触发器;DML触发器是当数据库服务器中发生数据库操作语言DML事件时要执行的操作;DML事件包括对表或视图发出的UPDATE、INSERT或DELETE 语句;DML触发器用于在数据库修改时强制执行业务规则,以及扩展SQL Server2005约束、默认值和规则的完整性检查逻辑;根据DML触发器被激活的时机不同又可以分为AFTER触发器和INSTEAD OF 触发器;①AFTER触发器又称为后触发器;在执行了INSERT、UPDATE 或DELETE语句操作之后执行AFTER触发器;指定AFTER触发器与指定FOR相同,它是Microsoft SQL Server早期版本中唯一可用的选项,但AFTER触发器只能在表上指定;②INSTEAD OF触发器又称为替代触发器;该类触发器代替触发器操作执行,即触发器在数据发生变动之前被触发,取代变动数据的操作INSERT、UPDATE或DELETE操作,执行触发器定义的操作;该类触发器既可在表上定义,也可在视图上定义;对于每个触发器操作INSERT、UPDATE和DELETE只能定义一个INSTEAD OF触发器;DDL触发器是SQL Server2005的新增功能;DDL触发器是一种特殊的触发器,它不会为响应针对表或视图的UPDATE、INSERT或DELETE语句而激发;相反,它在响应数据定义语言DDL语句时触发,这些语句主要是以CREATE、ALTER和DROP开头的语句;它们可以用于数据库中执行管理任务,例如,审核以及规范数据库操作;因为DDL触发器和DML触发器可以使用相似的SQL语法进行创建、修改和删除,它们还具有其他相似的行为;所以这里只介绍DML触发器的创建与使用;10.2.2 inserted表和deleted表系统为每个触发器创建两个特殊临时表:inserted表和deleted表;这两个表都是逻辑表,由系统管理存储在内存中,它们在结构上与该触发器作用的表相同;这两个表是只读,用户不能对其修改和写入内容,但可以在触发器执行过程中引用这两个表中的数据;当触发器工作完成后,与该触发器相关的这两个表也被删除;Inserted表用于存储INSERT和UPDATE语句所影响的行的副本;如果表存在INSERT 触发器,向表中插入数据时,系统将自动创建一个与触发器具有相同表结构的Inserted临时表,新的记录被添加到触发器表和Inserted表中;Inserted表就是用来存储向原表插入的纪录副本;Deleted表用于存储DELETE和UPDATE语句所影响的行的副本;在执行DELETE或UPDATE语句时,从触发器表中删除原记录,并把删除的记录的副本临时存放到daleted表中;这样做的目的是:一旦触发器遇到了强迫它中止的语句被执行时,删除的那些行可以从deleted表中得以恢复;提示修改表中的数据,相当于删除一条旧的记录,添加一条新的记录;其中,被删除的记录放在Deleted表中,添加的新的记录放在Inserted表中;10.2.3 创建与管理触发器1.使用T-SQL创建与管理触发器T-SQL语言使用CREATE TRIGGER命令创建触发器;创建DML触发器的基本语句格式:CREATE TRIGGER 触发器名ON 表| 视图FOR|AFTER|INSTEAD OFINSERT|UPDATE|DELETEASDML语句案例10-12在stu数据库的学生表student中创建一个触发器tr_scxs,当学生表student有记录被删除时,显示“XXX同学信息已被你成功删除”;创建该触发器代码如下:CREATE TRIGGER tr_scxsON studentFOR DELETEASBEGINDECLARE xsxx CHAR10SELECT xsxx=s_name FROM DELETEDPRINT xsxx +‘同学信息已被你成功删除’END创建触发器后,删除一条记录,验证该触发器,代码如下:Use stuGoDelete student where s_num='01'执行以上删除记录语句后,结果如图10-10所示;图10-10 删除记录激活触发器返回信息提示·虽然DML触发器可以引用临时表,但不能对临时表或系统表创建DML触发器;·对含有用DELETE或UPDATE操作定义的外键的表,不能定义INSTEAD OF DELETE和INSTEAD OF UPDATE触发器;·TRUNCATE TABLB 语句不会触发DELETE触发器,因为TRUNCATE TABLB语句没有执行记录;案例10-13在stu数据库中创建一个删除触发器tr_delxs,当表student中的记录要被删除时,激活该触发器,显示“不能删除本表中的数据请与管理员联系”的提示信息;创建该触发器代码如下:USE stuGOCREATE TRIGGER tr_delxsON studentINSTEAD OF DELETEASPRINT ‘不能删除本表中的数据请与管理员联系’GO创建该触发器后,删除一条记录,验证触发器,代码如下:Use stuGoDelete student where s_num='02'执行以上删除记录语句后,结果如图10-11所示;再重新打开student表时发现学号为02的学生记录还在,没有被删除;图10-11 要删除记录时激活触发器并返回信息2.使用SSMS创建触发器案例10-14为“stu”数据库的stucourse表创建一个更新触发器tr_upsc,当更新了该表中的X 条记录信息时,显示“你已经成功更新的记录信息有X条”;操作步骤如下:1启动SQL Server Management Studio,在对象资源管理器中依次展开数据库→stu→表节点;2展开stucourse表,右键单击触发器,选择新建触发器,如图10-12所示;3打开新建触发器模板文档窗口,根据相应提示输入创建触发器的文本,创建代码如下;4执行创建触发器的语句,语句成功执行后,则创建好触发器;创建该触发器代码如下:USE stuGOCREATE TRIGGER tr_upscON stucourseAFTER UPDATEASBEGINdeclare num tinyintselect num=count from insertedprint /你已经成功更新的记录信息有'+ltrimstrnum+'条/ENDGO使用UPDATE语句更新表stucourse中学号为03的学生成绩,每门成绩都减少5分,验证该触发器的功能,如图10-13所示;图10-12 选择新建触发器图10-13 更新信息激发触发器返回信息10.2.4 查看触发器信息1.使用系统存储过程查看触发器使用系统存储过程sp_helptrigger和sp_helptext可以查看触发器,但作用有所差异:使用sp_helptrigger返回的是触发器的类型,而使用sp_helptext则显示触发器的定义文本;使用系统存储过程sp_helptrigger查看触发器的基本语句格式如下:sp_helptrigger 表名 ,触发器类型使用系统存储过程sp_helptext查看触发器的基本语句格式如下:sp_helptext 触发器名案例10-15查看student表中所有触发器的相关信息,同时也显示触发器tr_delxs的定义文本;代码如下:Use stugosp_helptrigger studentGOsp_helptext tr_delxsGO2 使用SSMS查看触发器信息使用SSMS查看触发器的相关信息的步骤如下;1 启动SQL Server Management Studio,在对象资源管理器窗口中,依次展开数据库→stu→表如student表→触发器节点;2 在触发器节点中,右击需要查看的触发器,在快捷菜单中选择查看依赖关系命令,在对象依赖关系对话框中,可以查看该触发器和相关表的依赖关系;在快捷菜单中选择修改命令,可以查看触发器的定义文本信息;提示在第2步骤的右键快捷菜单中选择“修改”命令,也可以对触发器重新修改定义;选择“删除”命令可以删除该触发器;10.2.5 修改触发器1. 使用T-SQL语言修改触发器T-SQL语言使用ALTER TRIGGER命令修改DML触发器,基本语句格式如下;ALTER TRIGGER 触发器名ON 表| 视图FOR | AFTER |INSTEAD OF INSERT |UPDATE |DELETEASSQL语句修改触发器与创建触发器的语法基本相同,只是将创建触发器的CREATE关键字换成了ALTER关键字而已,在这里不再举例说明它的用法;2. 使用SSMS修改触发器请参阅“使用SSMS查看触发器信息”部分;10.2.6 禁用、启用和删除触发器1.使用T-SQL语句禁用、启用和删除触发器1禁用触发器可以使用DLSABLE TRIGGER命令禁用DML触发器,基本语句格式如下:DISABLE TRIGGER 触发器名,…n|ALLON 对象名 |数据库 | 服务器案例10-17禁用student表上的触发器tr_delxs;代码如下:Use stuGoDISABLE TRIGGER tr_delxs ON student提示·禁用触发器不会删除该触发器,该触发器仍然作为对象存在于当前数据库中;·禁用触发器后,执行相应的T-SQL语句时,不会引发触发器;2启用触发器可以使用ENABLE TRIGGER命令启用DML触发器,基本语句格式如下:ENABLE TRIGGER 触发器名,…n|ALLON 对象名 |数据库 | 服务器ENABLE TRIGGER 的基本使用同DISABLE TRIGGER,但作用相反;3删除触发器可以使用DROP TRIGGER命令删除DML触发器,基本语句格式如下:DROP TRIGGER 触发器,…n案例10-18删除student表中的tr_delxs触发器;DROP TRIGGER tr_delxsGO提示:仅当所有触发器均使用相同的ON 子句创建时,才能使用一个DROP TRIGGER 语句删除多个DDL触发器;2.使用SSMS禁用、启用和删除触发器使用SQL Server Management Studio禁用、启用和删除触发器的步骤如下:1启动SQL Server Management Studio,在对象资源管理器中依次展开数据库节点、触发器所在的数据库节点和表节点、触发器节点;2右键单击相应的触发器,弹出右键快捷菜单;3选择禁用命令,即可禁用选定的触发器;选择启用命令,即可恢复触发器为活动应用状态;选择删除命令,即刻删除所选的触发器;案例应用提示在各题案例中,在创建存储过程或触发器之前,可以先使用如下代码检测是否已存在该对象,如果存在则先删除再创建,这里各题案例都是假设之前不存在的情况;删除语法如下:IF EXISTSSELECT NAME FROM SYSOBJECTS WHERE NAME = ‘对象名’AND TYPE = ‘类型’DROP PROCEDURE│TRIGGER 对象名对象名:创建的存储过程名或触发器名;类型:存储过程是P,触发器是TR;一、存储过程综合案例案例10-19在stu数据库中,创建一个加密的存储过程Sc_xs,通过该存储过程查询选修课成绩都及格的学生的信息;Use stuGoCreate proc sc_xsWith EncryptionAsSelectFrom student where s_num not in /成绩及格的学生/Select s_numFrom stucourse where sc_grade <60 /子查询中是成绩不资格的学号/Go执行以下代码,验证存储过程;Exec sc_xs /执行该存储过程/。
数据库实验-存储过程、触发器
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`为存储过程的主体代码,即存储过程执行的逻辑。
实验6 大数据库实验——存储过程和触发器
实验6 存储过程和触发器一、实验目的1、加深和巩固对存储过程和触发器概念的理解。
2、掌握触发器的简单应用。
3、掌握存储过程的简单应用。
二、实验容一)存储过程:1. 创建一存储过程,求l+2+3+…+n,并打印结果。
CREATE PROCEDURE addresultASDECLARE n int=10,/*最后一个数*/i int=0,result int=0 /*结果*/BEGINWHILE(i<=n)BEGINSET result=result+iSET i=i+1ENDPRINT'1+2+3+...+n的结果是:'PRINT resultRETURN(result)ENDGO2.调用上面的addresult存储过程,打印l十2+3+…+10的结果。
EXEC addresult3. 修改上述存储过程为addresult1,使得n为输入参数,其具体值由用户调用此存储过程时指定。
CREATE PROCEDURE addresult1n int=10 /*最后一个数*/ASDECLARE i int=0,result int=0 /*结果*/BEGINWHILE(i<=n)BEGINSET result=result+iSET i=i+1ENDPRINT'1+2+3+...+n的结果是:'PRINT resultRETURN(result)ENDGO4. 调用上面修改后的addresult1存储过程,打印l+2+3+…+100的结果。
EXEC addresult1 1005.修改上述存储过程为addresult2,将n参数设定默认值为10,并改设sum为输出参数,让主程序能够接收计算结果。
CREATE PROCEDURE addresult2n int=10,/*最后一个数*/sum int out/*结果*/ASDECLARE i int=0BEGINset sum=0WHILE(i<=n)BEGINSET sum=sum+iSET i=i+1ENDENDGO6.调用上面修改后的addresult2存储过程,设置变量s接收计算l+2+3+…+10的结果。
SQL数据库实验五 存储过程和触发器
实验五存储过程和触发器
一、实验目的:
了解存储过程和触发器的组成结构及作用
熟悉存储过程和触发器的创建及使用
三、实验内容及要求
1. 2.
3.
4.CREATE PROCEDURE Stu_proc1 @SCLASS INT
AS SELECT奖学金=奖学金*1.1 FROM Student where奖学金<@JXJ
7.CREATE PROCEDURE Stu_proc4
@banj INT,@AVG decimal OUTPUT,@RS INT OUTPUT
AS SELECT @AVG=AVG(grade),@RS=COUNT(Student.Sno)
9.CREATE PROCEDURE Stu_proc6 @KCM Co,Student.sname,Elective.Grade from ElectiveSTUDENT INNER JOIN Elective ON Student.Sno=Elective.Sno WHERE o=@KCM
FROM STUDENT INNER JOIN ELECTIVE ON STUDENT.SNO=ELECTIVE.SNO
WHERE class=@banj
8.CREATE PROCEDURE Stu_proc5 @XM CHAR
AS SELECT o,Elective.grade from Elective STUDENT INNER JOIN Elective ON tudent.Sno=Elective.Sno WHERE Student.sname=@XM
AS SELECT * FROM Student WHERE CLASS=@SCLASS
数据库实验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调用存储过程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验5 存储过程和触发器
一、实验目的
1理解存储过程的概念、了解存储过程的类型
2掌握创建存储过程的方法
3掌握执行存储过程的方法
4理解触发器的功能及工作原理。
5掌握创建、更改、删除触发器的方法。
二、实验内容
1、使用不带参数的存储过程
(1)创建一个存储过程,查询person表中所有不重复的职称。
语句:
Create proc person_name
As
Select distinct prof
from person;
结果:
(2)执行存储过程
语句:
exec person_name
结果:
2、带输入参数的存储过程
(1)创建一个存储过程,按照姓名查询person表中的员工信息。
语句:
Create proc name_person
@pname varchar(10)
As
Select *from person
where pname=@pname
结果:
(2)执行存储过程,查询名为黎明的员工数据
语句:
Exec name_person'黎明'
结果:
3、带输入/输出参数的存储过程
(1)创建一个存储过程,使其能够根据员工姓名,查询员工工资。
(考虑到员工不存在时给出提示信息)
Create proc name_psalary
@pname varchar(10)
As
If EXISTS
(
Select pname from person
Where person.pname=@pname)
Begin
Select distinct pname,fact from person,salary
Where person.pname=@pname
And person.pno=salary.pno
End
else
Print'无此员工!'
(2)执行存储过程
存在时:
语句:exec name_psalary
不存在时:
4、使用触发器
(1)创建一个触发器trig_update,返回对person进行更新操作后,被更新的记录条数
语句:
create trigger trig_update
on person
after update
as
print 'Trigger Output' + convert(varchar(5),@@rowcount) + 'rows were updated.'结果:
(2)执行触发器
语句:
update person
set deptno='003' where pname='王辉'
结果:
(3)修改触发器trig_update,除返回被更新的记录条数外,再返回学生的所有基本信息
语句:
alter trigger trig_update on person
after update
as
print 'Trigger Output' + convert(varchar(5),@@rowcount) + 'rows were updated.' select * from person
Return
结果:
5、使用触发器的两个特殊表:插入表(inserted)和删除表(deleted)。
(1)在person上创建触发器ins_del_sample,在插入、删除或更新操作后,分别从inserted表和deleted表中查询员工所有信息。
create trigger ins_del_sample on person
after insert,update,delete
as
select * from inserted
select * from deleted
Return
结果:
操作1插入
语句:
insert into person values('000010','周杰伦','男','1982-4-7','高级','001');
结果:
操作2删除
语句:
delete from person where Pno='000004' 结果:
操作3更新:
语句:
update person set deptno='002' where pname='王琳' 结果:
(2)执行触发器。
思考执行插入、删除和更新操作后返回的表有什么区别?
答:
进行插入操作后,inserted返回的是增加的行的内容,deleted返回的是空内容
进行更新操作后,inserted返回的是更新行的新内容,deleted返回的是更新行之前的内容进行删除操作后,inserted返回的是空内容,deleted返回的是删除的行的内容
6、使用系统存储过程查看触发器(与存储过程的使用类似)
(1)显示触发器trig_update的一般信息
语句:exec sp_help trig_update
结果:
(2)显示触发器trig_update的源代码
语句:exec sp_helptext trig_update
结果:
(3)显示person上所有的依赖关系
语句:exec sp_depends person
结果:
(4)显示触发器trig_update所引用的对象语句:exec sp_depends trig_update
结果:。