6实验六 存储过程
- 格式:doc
- 大小:1.24 MB
- 文档页数:13
实训六:存储过程1.实训目的1)通过对常用系统存储过程的使用,了解存储过程的类型;2)通过创建和执行存储过程,了解存储过程的基本概念,掌握使用存储过程的操作技巧和方法;3)通过对已创建的存储过程的改变,掌握修改存储过程的操作技巧和方法;2.实训工具SQL Server2005SQL Server Management Studio。
3 实训内容(保存操作过程程序设计语句和结果)1、使用sp_helptext查看byroyalty存储过程的文本,该存储过程在数据库pubs中。
2、在学生库中创建存储过程proc_8_t1,要求实现如下功能:产生学分为’4’的课程学生选课情况列表,其中包括课程号、课程名、学分、学号、姓名、系别、性别等。
并调用此存储过程,显示执行结果。
3、在学生库中创建存储过程proc_8_t2,要求实现如下功能:输入系号,产生该系学生的选课情况列表,其中包括系号、学号、姓名、课程号、课程名、成绩、学分等。
并调用此存储过程,显示信息系号为‘20’的所有学生的选课情况列表。
4、在学生库中创建存储过程proc_8_t3,要求实现如下功能:输入学生学号,根据该学生所选课程的总学分显示提示信息,如果总学分<9,则显示“此学生学分不足!”,否则显示“此学生学分已足!”。
并调用此存储过程,显示“1002”学生的总学分情况。
对学生库中已创建的存储过程proc_8_t1进行修改,要求在显示列表中增加教师字段,即产生学分为’4’的课程学生选课情况列表,其中包括课程号、课程名、授课教师号(TNO)、学分、学号、姓名、系别、专业、性别等。
5、对学生库中已创建的存储过程proc_8_t2进行修改,要求实现如下功能:输入课程名称,产生选修该课程所有男生的选课情况列表,其中包括学号、姓名、性别、课程号、课程名、成绩、学分等。
并调用修改后的存储过程,显示选修“离散数学”男生的选课情况列表。
6、对学生成绩库中已创建的存储过程proc_8_t3进行修改,要求实现如下功能:输入学生学号,根据该学生所选课程的总学分显示提示信息,如果总学分<9,则显示“此学生所选总学分为XXX,学分不足!”,否则显示“此学生所选总学分为XXX,学分已足!”。
实验六MySql存储过程一、实验目的1、熟悉MySql的存储过程二、实验内容1、建立一张学生表,属性有学号、姓名、年龄三个字段。
2、建立一个存储过程,实现学生的全查询3、分别用IN 和OUT实现姓名的调用4、声明一个变量,把变量加1,再把变量加入到学生表的学号字段中。
5、建立一个存储过程,外部调用这个存储过程,当外部传入的值是0时,则在学生表中插入一个学号是17的学生,如果是1时,则在学生表中插入一个学号是18的学生,如果都不是,则在学生表中插入一个学号是19的学生.6、建立一个存储过程,做一个循环语句,循环插入5个学生。
(至少用三种循环的存储过程方法)三、试验结果截图1.建立一张学生表,属性有学号、姓名、年龄三个字段。
2.建立一个存储过程,实现学生的全查询3.分别用IN 和OUT实现姓名的调用4.声明一个变量,把变量加1,再把变量加入到学生表的学号字段中。
5.建立一个存储过程,外部调用这个存储过程,当外部传入的值是0时,则在学生表中插入一个学号是17的学生,如果是1时,则在学生表中插入一个学号是18的学生,如果都不是,则在学生表中插入一个学号是19的学生.6建立一个存储过程,做一个循环语句,循环插入5个学生。
(至少用三种循环的存储过程方法)所有代码:1.create table stu(stuno int,stuna varchar(20),stuage int);insert into stu values(001,'zhangsan',22);insert into stu values(002,'lisi',23);insert into stu values(003,'wangwu',23);insert into stu values(004,'maliu',24);insert into stu values(005,'zhaoqi',25);insert into stu values(006,'gaoba',23);insert into stu values(007,'ddddd',22);insert into stu values(008,'ttttt',21);2.create procedure select_all()select * from stu;3.delimiter //create procedure searchno(in no int,out na varchar(20),out age int)beginselect stuna from stu where stuno=no into na;select stuage from stu where stuno=no into age; end //delimiter ;call searchno(n,@na,@age);select @na,@age;4.delimiter //create procedure noupdate(in n int)beginupdate stu set stuno=stuno+n;end //delimiter ;5.delimiter //create procedure addstu(in sno int)begincase snowhen 0 then insert into stu values(17,'no17',20); when 1 then insert into stu values(18,'no18',20); else insert into stu values(19,'no19',20);end case;end //delimiter ;6.(1).delimiter //create procedure add5stu1()begindeclare num1 int;set num1=0;loop_label:loopinsert into stu values (111,'111',20);set num1=num1+1;if num1>=5 then leave loop_label;end if;end loop;end //delimiter ;(2).delimiter //create procedure add5stu2()begindeclare num2 int;set num2=0;while num2<5 doinsert into stu values (222,'222',20);set num2=num2+1;end while;end //delimiter ;(3).delimiter //create procedure add5stu3()begindeclare num3 int;set num3=0;repeatinsert into stu values (333,'333',20);set num3=num3+1;until num3>=5end repeat;end //delimiter ;四、实验小结本次试验让我好好补习了下前段时间落下的课程,让我对数据库有了新的体会和认识,试验中碰到了一些问题,但都已解决和理解。
实验:存储过程实验学时:2个学时实验类型:(验证、综合、设计)一、内容概述:1、存储过程简介存储过程是存储于数据库中的一组T-SQL语句。
有了存储过程之后,与数据库的交互就没有必要在程序中写一堆的SQL语句,而只需用一条语句调用适当的存储过程来完成就可以了。
另外,由于代码是存储在数据库中,我们也可以在不同的应用程序或查询窗口中不断的重复利用那些代码。
存储过程功能的优点①预编译执行程序。
SQL Server只需要对每一个存储过程进行一次编译,然后就可以重复使用执行计划。
这个特点通过重复调用存储程序极大地提高了程序的性能。
②缩短客户端/服务器之间的信息传输量。
如果你的工作环境带宽有限,那么存储过程技术肯定能够满足你,因为它能够把需要传输的长的SQL查询缩短成一行。
③有效重复使用代码和编程。
存储过程可以为多个用户所使用,也可以用于多个客户程序。
这样可以减少程序开发周期的时间。
④增强安全性控制。
可以允许用户单独执行存储过程,而不给于其访问表格的权限。
2、创建存储过程语法CREATE PROC[ EDURE ] [ owner. ] procedure_name [ ; number ][ { @parameter data_type }[ VARYING ] [ = default ] [ OUTPUT ]] [ ,...n ][ WITH{ RECOMPILE | ENC RYPTION | RECOMPILE , ENC RYPTION } ][ FOR REPLICATION ]AS sql_statement [ ...n ]示例:AjaxCity表ID CityName Short1 苏州市SZ2 无锡市WX3 常州市CZ⑴.选择表中所有内容并返回一个数据集CREATE PROCEDURE mysp_AllASselect * from AjaxCityGO执行结果⑵.根据传入的参数进行查询并返回一个数据集CREATE PROCEDURE mysp_para@CityName varchar(255),@Short varchar(255)ASselect * from AjaxCity where CityName=@CityName And Short=@ShortGO执行结果⑶.带有输出参数的存储过程(返回前两条记录的ID的和)CREATE PROCEDURE mysp_output@SUM int outputASselect @SUM=sum([ID]) from (select top 2 * from AjaxCity) as tmpTable GO执行结果二、实验报告实验报告课程名称网络数据库SQL Server2005实验名称存储过程实验时间________年____月____日成绩一、实验目的1、熟悉存储过程基本概念和类型。
实验六存储过程与触发器一、存储过程【创建存储过程】:CREATE PROCEDURE [OWNER].[PROCEDURE NAME]AS <SQL块>如:Use pubsGoCreate procedure author_informationAsselect au_lname,au_fname,title,pub_namefrom authors ajoin titleauthor taon a.au_id=ta.au_idjoin titles ton t.title_id=ta.title_idjoin publishers pon t.pub_id=p.pub_idGo【管理存储过程】:➢可以使用sp_helptext命令查看创建存储过程的文本信息。
Use pubsGoSp_helptext author_informationGo➢可以用sp_help查看存储过程的一般信息。
Use pubsGoSp_help author_informationGo➢可以使用系统存储过程sp_rename修改存储过程的名字。
Use pubsGoSp_rename author_information ,authors_informationGo➢也可以使用企业管理浏览存储过程的信息,具体方法是:✧从树型结构上选中存储过程所在的数据库节点,展开该节点;✧选中数据库节点下的〖存储过程〗节点,则右边的列表列出了数据库中目前所有的存储过程;✧选中存储过程,右击,执行〖属性〗命令,则系统将弹出如图所示对话框。
✧可以在对话框中修改存储过程内容,并保存修改。
✧如果想知道某个表被存储过程引用的情况,可以使用sp_depends,Sp_depends authors✧如果想知道某个存储过程引用表的情况,则可以使用Sp_depends procedure_name【执行存储过程】:对于存储过程的调用,应使用EXECUTE或EXEC关键字。
实验六存储过程和触发器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,查询指定班级指定课程的平均分。
一、实验目的1. 了解存储过程的基本概念和作用。
2. 掌握存储过程的创建、执行和修改方法。
3. 学会使用存储过程进行数据库操作,提高数据库操作效率。
二、实验环境1. 操作系统:Windows 102. 数据库管理系统:MySQL 5.73. 开发工具:MySQL Workbench三、实验内容1. 创建存储过程2. 执行存储过程3. 修改存储过程4. 删除存储过程四、实验步骤1. 创建存储过程(1)打开MySQL Workbench,连接到本地数据库。
(2)在查询窗口中输入以下SQL语句创建一个存储过程:DELIMITER //CREATE PROCEDURE SelectAllStudents()BEGINSELECT FROM students;END //DELIMITER ;(3)执行以上SQL语句,成功创建存储过程。
2. 执行存储过程(1)在查询窗口中输入以下SQL语句执行存储过程:CALL SelectAllStudents();(2)观察查询结果,确认存储过程执行成功。
3. 修改存储过程(1)打开查询窗口,输入以下SQL语句修改存储过程:DELIMITER //CREATE PROCEDURE SelectAllStudents()BEGINSELECT id, name, age FROM students;END //DELIMITER ;(2)执行以上SQL语句,成功修改存储过程。
4. 删除存储过程(1)在查询窗口中输入以下SQL语句删除存储过程:DROP PROCEDURE IF EXISTS SelectAllStudents;(2)执行以上SQL语句,成功删除存储过程。
五、实验总结1. 通过本次实验,我们了解了存储过程的基本概念和作用,学会了创建、执行、修改和删除存储过程的方法。
2. 存储过程可以提高数据库操作效率,降低代码重复性,提高代码可维护性。
3. 在实际开发过程中,合理使用存储过程可以简化数据库操作,提高应用程序的性能。
实验六存储过程创建与应用一、实验目的使学生理解存储过程的概念,掌握创建存储过程的使用、执行存储过程和查看、修改、删除存储过程的方法。
二、实验内容(1)创建存储过程student_grade,要求实现如下功能:查询“学生-课程”数据库中每个学生各门功课的成绩,其中包括每个学生的sno,sname,cname,grade。
(2)利用查询分析器创建名为proc_exp的存储过程,要求实现如下功能:从sc表中查询某一学生考试平均成绩。
(3)修改存储过程proc_exp,要求实现如下功能:输入学生学号,根据该学生所选课程的平均成绩显示提示信息,即如果平均成绩在60分以上,显示“此学生综合成绩合格,成绩为XX分”,否则显示“此学生总和成绩不合格,成绩为XX分”。
(4)创建名为proc_add的存储过程,要求实现如下功能:向sc表中添加学生成绩记录。
调用proc_add,向sc表中添加学生成绩记录。
(5)调用存储过程proc_exp,输入学生学号,显示学生综合成绩是否合格。
(6)删除刚刚创建的proc_add和proc_exp两个存储过程。
三、实验过程(1)创建存储过程student_grade:查询每个学生各门功课的成绩(部分查询结果):(2)创建存储过程proc_exp:查询某一学生考试平均成绩(部分结果):(3)修改存储过程proc_exp调用存储过程proc_exp,输入学生学号,显示学生综合成绩是否合格(4)创建名为proc_add的存储过程:添加学生记录:(5)删除刚刚创建的proc_add和proc_exp两个存储过程。
四、实验总结在创建proc_exp存储过程时,需要添加group by语句对结果进行分组,不然会出现错误。
当调用存储过程proc_exp,输入学号查询学生综合成绩是否合格时,出现错误:“Conversion failed when converting the varchar value '77.500000' to data type int.”看到该错误时自己清楚是数据类型不匹配导致,经过仔细分析之后终于明白是自己更改pro_exp存储结构中的if @avg>=60语句不正确,因为在创建表的时候,定义的学生成绩的数据类型为decimal(5,2),即最大5位数字,其中2位小数,定义的变量avg类型为varchar(20),在将该语句修改为if @avg>=60.00后,查询成功。
实验六存储过程和触发器142208100149 陈聪1、目的与要求(1)掌握存储过程的使用方法。
(2)掌握触发器的使用方法。
2、实验准备(1)了解存储过程的使用方法。
(2)了解触发器的使用过程。
(3)了解inserted逻辑表和deleted逻辑表的使用。
(4)了解如何编写CRL存储过程与触发器。
3、实验内容。
(1)存储过程。
①创建存储过程,使用Employees表中的员工人数来初始化一个局部变量,并调用这个存储过程。
注:此段T-SQL命令,书上变量名书写错误,漏掉了下划线。
(@nu_MBER1和@nu MBER1区别)执行该存储过程,并查看结果。
②创建存储过程,比较两个员工的实际收入,若前者比后者高就输出0,否则输出1.执行该存储过程并查改结果。
③创建添加职员记录的存储过程EmployeeAdd。
执行该存储过程。
执行上面T-SQL命令,在结果栏中显示一行受影响,说明结果已经插入成功,在表Employees中也够看到结果已经存在。
④创建存储过程,使用游标确定一个员工的实际收入是否排在前3名。
结果为1表示是,结果为0表示否。
执行该存储过程,在结果栏中显示,命令已成功完成,并且在左侧对象资源管理器中进行刷新会显示刚刚创建的存储过程。
执行该存储过程:上面T-SQL结果中输出“1”,代表着员工“108991”的实际收入排在前三名。
【思考与练习】A、创建存储过程,要求当一个员工的工作年份大于6年时,将其转到经理办公室工作。
创建这个存储过程时候,在存储过程的条件判断中我添加了一项,判断工作年份在6年以上的员工是否在经理办公室,只有不在经理办公室的时候才进行调整,这样更符合实际问题些。
然后执行上面的存储过程,并且查看结果:此时有可能会出现(我就出现了)这样的问题,在之前实验三中就出现了。
解决方法同样是解除规则的绑定。
查看表Employees中员工“000001”的DepartmentID已经修改为“3”(经理办公室)。
实验六存储过程一、实验目的(1)掌握T-SQL流控制语句。
(2)掌握创建存储过程的方法。
(3)掌握存储过程的执行方法。
(4)掌握存储过程的管理和维护。
二、实验内容1、创建简单存储过程(1)创建一个名为stu_pr的存储过程,该存储过程能查询出051班学生的所有资料,包括学生的基本信息、学生的选课信息(含未选课同学的信息)。
要求在创建存储过程前请判断该存储过程是否已创建,若已创建则先删除,并给出“已删除!”信息,否则就给出“不存在,可创建!”的信息。
if exists(select*from sysobjects where name='stu_pr'and type='P') begindrop procedure stu_prprint'已删除!'endelseprint'不存在,可创建!'create procedure stu_prasselect distinct*from Student sleft join SC on s.Sno=SC.Snoleft join Course c on o=owhere Classno='051'执行:exec stu_pr2、创建带参数的存储过程(1)创建一个名为stu_proc1的存储过程,查询某系、某姓名的学生的学号、姓名、年龄,选修课程名、成绩。
系名和姓名在调用该存储过程时输入,其默认值分别为“%”与“林%”。
执行该存储过程,用多种参数加以测试。
if exists(select*from sysobjects where name='stu_proc1'and type='P') begindrop procedure stu_proc1print'已删除!'endelseprint'不存在,可创建!'create procedure stu_proc1@sdept varchar(10)='%',@sname varchar(10)='林%'asselect Sname,s.Sno,YEAR(getdate())-YEAR(Birth)Age,Cname,Grade from Student s,Course c,SCwhere s.Sno=sc.Sno and o=oand s.Sname like@sname and s.Sdept like@sdept执行:①、exec stu_proc1②、exec stu_proc1@sdept='%',@sname='林%'(2)创建一个名为Student_sc的存储过程,可查询出某段学号的同学的学号、姓名、总成绩。
(学号起始号与终止号在调用时输入,可设默认值)。
执行该存储过程。
if exists(select name from sysobjects where name='Student_sc'and type='P')drop procedure Student_scgocreate procedure Student_sc@sno_begin varchar(10)='20110001',@sno_end varchar(10)='20110103' asselect s.Sno,Sname,SUM(grade)total_gradefrom Student s,SCwhere s.Sno=sc.Sno and s.Sno between@sno_begin and@sno_endgroup by s.Sno,Sname执行:exec Student_sc3、创建带输出参数的存储过程(1)创建一个名为Course_sum的存储过程,可查询某门课程考试的总成绩。
总成绩可以输出,以便进一步调用。
if exists(select name from sysobjects where name='Course_sum'and type='P')drop procedure Course_sumcreate procedure Course_sum@cname varchar(10)='%'asselect SUM(grade)total_grade,COUNT(sno)snofrom Course c,SCwhere o=o and Cname like@cname执行:exec Course_sum'高数'(2)创建一执行该存储过程的批处理,要求当总成绩小于100时,显示信息为:“XX课程的总成绩为:XX,其总分未达100分”。
超过100时,显示信息为:“XX课程的总成绩为:XX”。
create procedure sum_grade2@cname varchar(10),@@sum smallint outputasselect@@sum=sum(grade)from Course c,SCwhere o=o and Cname like@cnamedeclare@@sumgrade smallintexec sum_grade2'高数',@@sumgrade outputif@@sumgrade<100beginprint'高数的总成绩为:'+CAST(@@sumgrade AS varchar(20))+',其总分未达到分。
'endelseprint'高数的总成绩为:'+CAST(@@sumgrade AS varchar(20))+'。
'4、创建带重编译及加密选项的存储过程创建一个名为update_sc、并带重编译及加密选项的存储过程,可更新指定学号、指定课程号的学生的课程成绩。
(学号、课程号由调用时输入)if exists(select name from sysobjects where name='update_sc'andtype='P')drop procedure update_sccreate procedure update_sc@cno varchar(10),@sno varchar(10),@grade intwith recompile,encryption--重编译,加密asupdate SCset grade=@gradewhere o=@cno and SC.Sno=@snoexec update_sc'001','20110001','80'5、使用T-SQL语句管理和维护存储过程(1)使用sp_helptext查看存储过程Student_sc的定义脚本sp_helptext Student_sc(2)使用select语句查看Student_sc存储过程的定义脚本(提示:通过查询表sysobjects 和表syscomments)select o.id,c.textfrom sysobjects o inner join syscomments con o.id=c.idwhere o.type='p'and ='Student_sc'(3)将存储过程stu_pr改为查询学号为2011001的学生的详细资料。
alter procedure stu_pr@sno varchar(10)asselect distinct*from Studentwhere Sno='20110001'exec stu_pr@sno='2011001'(4)删除存储过程stu_pr。
drop procedure stu_pr6、使用SQL Server Management Studio管理存储过程(1)在SQL Server Management Studio中重新创建刚删除的存储过程stu_pr选择数据库Student_info→可编程性→存储过程,右击“存储过程”→新建存储过程出现如下画面:修改存储过程的名称为stu_pr修改SQL语句,使之成为完整的存储过程CREATE PROCEDURE stu_pr-- Add the parameters for the stored procedure hereASBEGIN-- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements.SET NOCOUNT ON;-- Insert statements for procedure hereSELECT distinct*from Student sleft join SC on s.Sno=SC.Snoleft join Course c on o=owhere Classno='051'END(2)查看存储过程stu_pr,并将该过程修改为查询051班女生的所有资料。
可编程性→存储过程→stu_pr,右击stu_pr→修改出现如下画面:修改SQL语句,使之能查询051班所有女生的资料的存储过程ALTER PROCEDURE[dbo].[stu_pr]-- Add the parameters for the stored procedure hereASBEGIN-- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements.SET NOCOUNT ON;-- Insert statements for procedure hereSELECT distinct*from Student sleft join SC on s.Sno=SC.Snoleft join Course c on o=owhere Classno='051'and Sex='女'END(3)删除存储过程stu_pr选择存储过程stu_pr,右击,选择“删除”。