实验五存储过程
- 格式:doc
- 大小:42.00 KB
- 文档页数:5
第1篇一、实验背景随着互联网技术的快速发展,数据存储和传输已成为网络通信中的关键环节。
网络存储过程是数据库中的一种高级应用,它可以将多个SQL语句封装成一个存储过程,从而实现数据库的自动化管理和提高数据库的执行效率。
本实验旨在通过实践,掌握网络存储过程的创建、调用和优化方法。
二、实验目的1. 了解网络存储过程的基本概念和特点。
2. 掌握网络存储过程的创建方法。
3. 熟悉网络存储过程的调用和优化技巧。
4. 通过实验,提高数据库管理能力。
三、实验环境1. 操作系统:Windows 102. 数据库管理系统:MySQL 5.73. 实验工具:MySQL Workbench四、实验内容1. 创建网络存储过程(1)创建一个名为“select_user_info”的存储过程,用于查询用户信息。
```sqlDELIMITER //CREATE PROCEDURE select_user_info(IN user_id INT)BEGINSELECT FROM users WHERE id = user_id;END //DELIMITER ;```(2)创建一个名为“update_user_info”的存储过程,用于更新用户信息。
```sqlDELIMITER //CREATE PROCEDURE update_user_info(IN user_id INT, IN user_name VARCHAR(50), IN user_age INT)BEGINUPDATE users SET name = user_name, age = user_age WHERE id = user_id;END //DELIMITER ;```2. 调用网络存储过程(1)调用“select_user_info”存储过程,查询用户ID为1的用户信息。
```sqlCALL select_user_info(1);```(2)调用“update_user_info”存储过程,更新用户ID为1的用户信息。
实验五存储过程的创建与调用一.实验目的:了解存储过程的概念和作用,掌握创建存储过程的方法,为后继学习作准备。
二.实验属性:设计性。
三.实验仪器设备及器材:装有.NET和SQL Server的电脑。
四.实验要求程序的主界面图1.11、利用存储过程,给student表添加一条学生信息。
建立存储过程stu_insertUSE[sheng]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER PROCEDURE[dbo].[stu_insert]@Sno char(10)= 0,@Sname char(10)= 0,@Ssex char(10)= 0,@Sage smallint= 0,@Sdept char(10)=0ASBEGINSET NOCOUNT ON;insertinto Studentvalues(@Sno,@Sname,@Ssex,@Sage,@Sdept)END在添加Button上添加时间处理程序//SqlConnection sqlconn = new SqlConnection(conn);string sno,sname,ssex,sage,sdept;sno=textBox1.Text.ToString();sname=textBox2.Text.ToString();ssex=textBox3.Text.ToString();sage=textBox4.Text.ToString();sdept=textBox5.Text.ToString();SqlCommand cmd = new SqlCommand();cmd.Connection = conn;mandText = "stu_insert";mandType = CommandType.StoredProcedure;IDataParameter[] parameters = {new SqlParameter("@Sno", SqlDbType.Char,4),new SqlParameter("@Sname", SqlDbType.Char,4) ,new SqlParameter("@Ssex", SqlDbType.Char,10) ,new SqlParameter("@Sage", SqlDbType.Int,10) ,new SqlParameter("@Sdept", SqlDbType.Char,15) ,};conn.Open();cmd.Parameters.Add("@Sno", SqlDbType.VarChar).Value = sno;cmd.Parameters.Add("@Sname", SqlDbType.VarChar).Value = sname; cmd.Parameters.Add("@Ssex", SqlDbType.VarChar).Value = ssex; cmd.Parameters.Add("@Sage", SqlDbType.VarChar).Value = sage; cmd.Parameters.Add("@Sdept", SqlDbType.VarChar).Value = sdept; cmd.ExecuteNonQuery().ToString();conn.Close();执行结果图1.22、利用存储过程从student、course、sc表的连接中返回所有学生的学号、姓名、所选课程及成绩。
存储过程和触发器实验心得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开始,导致违反唯一约束条件,从而导致调用储存过程失败。
四、实验心得体会通过本次实验,学会了储存过程以及触发器和序列的使用方法,对存储过程有了一个直观的认识,对触发器的工作原理和作用有了更加深刻的认识,使用触发器可以在修改数据前后规范数据,使数据规范化和标准化。
数据库基础与实践实验报告实验五存储过程和触发器班级:惠普测试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='无此专业。
数据库存储过程实验报告一、实验目的理解存储过程的概念、建立和调用方法。
二、实验环境三、实验示例1、定义一个函数,按性别计算所有学生的平均年龄。
CREATE FUNCTION aver_age(@sex char(2)) RETURNS int ASBEGINDECLARE @aver intSELECT @aver=( SELECT avg(年龄)FROM sWHERE sex=@SEX)RETURN @averENDGO如下程序对上例定义的aver_age函数进行调用。
USE student /*用户函数在此数据库中已定义*//*定义局部变量*/DECLARE @sex char(2)DECLARE @aver1 int/*给局部变量赋值*/SELECT @sex = ‘女’SELECT @aver1=dbo.aver_age(@sex) /*调用用户函数,并将返回值赋给局部变量*//*显示局部变量的值*/SELECT @aver1 AS '男性学生的平均年龄'2、利用student数据库中的S、SC表,编写一无参存储过程用于查询每个学生的选课情况,然后调用该存储过程。
CREATE PROCEDURE xuanke_infoASSELECT S.#,sname,sex,age,c#,scoreFROM S INNER JOIN scON s.s#=sc.s#GO3、使用带参数的存储过程创建存储过程,根据student数据库的3个表查询指定学生的选课情况。
CREATE PROCEDURE stu_info @sname (8)ASSELECT S.#,sname,sex,age,c#,cname,scoreFROM S,SC,CWhere s.s#=sc.s# and sc.c#=c.c# and sname=@snameGOEXECUTE stu_info '张三'4、使用带OUTPUT参数的存储过程编写存储过程,根据给定的学生学号,计算该生的平均成绩Create procedure stuavg @sno char(4) @s_sum float output,@s_avg float outputAsSelect @s_sum=sum(score),s_avg=avg(score)From scWhere s#=@sno在调用存储过程stuavg时,存储过程定义时的形参名和调用时的变量名不一定要匹配,不过数据类型和参数位置必须匹配。
实验训练5:存储过程与函数的构建与使用一、存储过程与函数的概念存储过程和函数都是数据库中的可执行代码,可以被多次调用和重复使用。
存储过程是一组预定义的SQL语句集合,可以在数据库中定义和存储。
而函数是一个独立的代码块,它接收输入参数并返回一个值。
二、存储过程的构建与使用1. 创建存储过程在MySQL中,创建存储过程需要使用CREATE PROCEDURE语句。
例如:CREATE PROCEDURE myproc()BEGINSELECT * FROM mytable;END;这个例子创建了一个名为myproc的存储过程,它会查询mytable表中的所有数据。
2. 调用存储过程使用CALL语句可以调用已经创建好的存储过程。
例如:CALL myproc();这个语句会执行myproc存储过程中定义的SQL语句。
3. 存储过程参数我们可以给存储过程添加参数来使其更加灵活。
例如:CREATE PROCEDURE myproc(IN p1 INT, IN p2 VARCHAR(50)) BEGINSELECT * FROM mytable WHERE column1 = p1 AND column2 = p2;END;这个例子创建了一个带有两个输入参数p1和p2的存储过程,它会查询mytable表中column1等于p1并且column2等于p2的数据。
4. 存储过程变量除了参数之外,存储过程还可以使用变量来存储中间结果。
例如:CREATE PROCEDURE myproc(IN p1 INT)BEGINDECLARE v1 INT;SET v1 = p1 * 2;SELECT * FROM mytable WHERE column1 = v1;END;这个例子创建了一个带有一个输入参数p1和一个变量v1的存储过程,它会将p1乘以2并将结果存储在v1变量中,然后查询mytable表中column1等于v1的数据。
实验报告5课程数据库原理与应用实验名称存储过程专业班级学号姓名实验日期:年月日评分一、实验目的1.掌握编写存储过程和用户自定义函数的SQL语法;2.掌握存储过程调用方法,以及参数的传递与返回值。
3.掌握局部变量的声明、赋值和使用。
4.掌握流程控制,if语句、case语句的使用。
5.掌握游标的使用方法。
二、实验内容1.创建存储过程,指定输入参数、输出参数、返回值等。
2.调用存储过程,验证结果。
3.修改、删除存储过程。
4.设计和应用游标进行查询记录的处理。
三、实验环境(1)硬件:PC机(2)软件:Windows 操作系统、MySQL或SQL Server四、实验步骤(描述实验步骤及中间的结果或现象。
在实验中做了什么事情,怎么做的,发生的现象和中间结果)1.创建并执行存储过程。
(1)根据学生表,创建存储过程,根据学号(输入参数)能从学生表中查询学生的姓名、性别和出生年份(调用系统函数year()和now()(选做));CREATE PROCEDURE a_stu(IN iSno char(10))BEGINSELECT Sno,sname,ssex FROM studentwhere Sno=iSno;END;call a_stu(‘200215121’);⏹(2)根据学生表,创建一存储过程,能向学生表中插入一名新学生的记录,学生的学号、姓名、性别……等信息以参数形式给出。
⏹(3)创建一存储过程,根据学生的学号和课程名检索该生该课程的成绩,要求将成绩设计为输出参数的形式;2.设计和应用游标,要求能实现:⏹(1)使用游标,统计每门课程的选修人数,并将结果存入表tb_AvgGrade(该表包括课程号、课程名、选修人数3个属性),没有人选修的课程选修人数设为0。
3.创建用户自定义函数,要求能实现:⏹(1)根据输入的课程号,统计该课程平均成绩,并返回该值。
五、实验结果与讨论(描述最终得到的结果,并进行分析说明,可能的误差原因)六、总结(说明实验过程中遇到的问题及解决办法;新发现或个人的收获;未解决/需进一步研讨的问题或建议新实验方法等)。
数据库技术与应用实验报告七班级:机械因材学号: 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、了解存储过程的基本概念和类型。
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、.对学生课程数据库,编写三个存储过程,分别完成下面功能:
--1)统计某一门课的成绩分布情况,即按照各分数段统计人数。
use StuDB
go
create procedure tongji
as
select cno,count(case when grade<60 then 1 end)不及格,
count(case when
grade<70 and grade>=60 then1 end)及格,
count(case when
grade<80 and grade>=70 then1 end)中,
count(case when
grade<90 and grade>=80 then1 end)良,
count(case when
grade<=100 and grade>=90 then 1 end)优
from sc
group by cno
go
exec tongji
go
--2)将学生选课成绩从百分制改为等级制(即A、B、C、D、E五级)。
create procedure dengji
as
select sc.*,等级评价=
case
when grade<60 then'E'
when grade>=60 and grade<70 then'D'
when grade>=70 and grade<80 then'C'
when grade>=80 and grade<90 then'B'
when grade>=90 and grade<=100 then'A'
end
from sc
go
exec dengji
go
--2、对SPJ数据库,创建一个存储过程
ins_s_count,功能为根据提供的供应商号,供应商名,供应商所在地等信息,
--往S表中插入数据,并返回插入该记录之
后,S表中的记录数。
--调用该存储过程实现往S表中插入一条记录(‘S6’,’天盛’,‘’‘福州’),并显示插入该记录之后,S表中的记录数。
use spj
go
alter procedure ins_s_count
@sno varchar(20),@sname
varchar(40),@status int,@city varchar(20)
as
select*
from s
insert
into
s(sno,sname,status,city)
values(@sno,@sname,@status,@cit y)
select count(sno)
from s
go
exec ins_s_count 'S6','天盛',40,'福州'
--3、查看存储过程的定义和内容
exec sp_helptext ins_s_count
--4、调用存储过程
--(二)用户自定义函数
--1. 创建一个返回标量值的用户定义函数RectangleArea:
--输入矩形的长和宽就能计算矩形的面积。
自选种实例调用该函数。
create function
RectangleArea(@long int,@wide int)
returns int
begin
return @long*@wide
end
select dbo.RectangleArea(5,2) --2. 创建一个用户自定义函数,功能为产生一张有关学生成绩统计的报表。
--该报表显示每一门课程的课程号、课程名、选修人数、本门最高分、最低分和平均分。
--调用这个函数,生成相应的报表并给用户浏览。
create function baobiao() returns table
as
return(select o 课程号,cname 课程名,count(o)选修人数,max(grade)最高
分,min(grade)最低分,
avg(grade)平均分
from sc,course
where o=o
group by o,cname) select*
from baobiao()。