实验11 存储过程和用户自定义函数_图
- 格式:doc
- 大小:211.00 KB
- 文档页数:10
导言:数据库,比如Microsoft‟s SQL Server 2005使用Transact-Structured Query Language (T-SQL)来插入、修改、检索数据.绝大多数数据库系统都包含constructs来对一系列的SQL statements进行分组,这些statements可以作为单独的单元来执行.存储过程就是一个例子,另一个例子是用户自定义函数(UDFs), 我们将在第9步进行详细的探讨.SQL是设计来处理一系列数据的. SELECT,UPDATE,和DELETE statements适用于相应表的所有记录,且通过WHERE字句来进行筛选.也有很多的特性被设计来一次处理一条记录,或操作标量数据(scalar data).比如CURSORs允许一次遍历所有的记录.字符串操作功能,比如LEFT, CHARINDEX, 以及PATINDEX用来处理标量数据.SQL也包含了控制流声明,比如IF和WHILE.在Microsoft SQL Server 2005之前,存储过程和用户自定义函数UDFs只能当做一个T-SQL statements集来创建,而SQL Server 2005设计时包含Common Language Runtime (CLR)。
因此,对一个SQL Server 2005数据库里的存储过程和用户定义方法,我们可以用managed code来进行创建。
那就也说你可以在一个C#类里创建一个存储过程或用户定义函数.这样一来我们就可以在.NET Framework或你自己定义的类里面使用这些存储过程或方法.在本文我们将考察如何创建存储过程和用户定义函数,以及如何将它们整合进数据库Northwind.让我们开始吧。
注意:管理数据库对象(Managed database objects)与SQL数据库里包含的相对应的数据库对象比较起来有一些优势,主要体现在:使用的语言更丰富、熟悉;可以使用现有的代码和逻辑.但是在处理那些并不包含很多逻辑的一系列数据时,其效率可能要低一些.关与managed code相较T-SQL而言的优势,请参阅文章《Advantages of Using Managed Code to Create Database Objects》(/en-us/library/k2e1fb36(VS.80).aspx)第一步:将Northwind数据库移出App_Data文件夹本教程到目前为止使用的是放在App_Data文件夹里的Microsoft SQL Server 2005 Express版本的数据库.然而在本教程,我们将Northwind数据库移出App_Data文件夹,再使用一个被注册为SQL Server 2005 Express版本数据库的实例。
实验报告课程名称:数据库系统概论实验时间:2012.5.10学号:姓名:班级:一、实验题目:存储过程与用户自定义函数二、实验目的:1)掌握SQLServer中存储过程的使用方法。
2)掌握SQLServer中用户自定义函数的使用方法。
三、实验内容:(记录每个实验步骤内容、命令、截屏结果)(一存储过程1、对学生课程数据库,编写2个存储过程,分别完成下面功能:1)统计某一门课的成绩分布情况,即按照各分数段统计人数,要求使用游标。
create proc TotalByCnoNum(@cno varchar(6asbegindeclare @num1 int,@num2 int, @num3 int,@num4 int,@num5 int,@grade int,@cname char(20select @num1=0,@num2=0,@num3=0,@num4=0,@num5=0declare cur_cno cursor for select grade from sc where cno=@cnoopen cur_cnofetch next from cur_cno into @gradewhile@@fetch_status=0beginif @grade between 90 and 100set @num1=@num1+1else if @grade between 80 and 89set @num2=@num2+1else if @grade between 70 and 79set @num3=@num3+1else if @grade between 60 and 69set @num4=@num4+1elseset @num5=@num5+1fetch next from cur_cno into @gradeendclose cur_cnodeallocate cur_cnoselect @cname=cname from course where cno=@cno print'课程:'+@cnameprint'分数段人数统计'print'=========================='print' 90-100 : '+convert(varchar(3,@num1print' 80-89 : '+convert(varchar(3,@num2print' 70-79 : '+convert(varchar(3,@num3print' 60-69 : '+convert(varchar(3,@num4print' 不及格: '+convert(varchar(3,@num5print'=========================='end执行以下语句,显示课程号为3的成绩情况:exec TotalByCnoNum '3'运行结果如下:2)将学生选课成绩从百分制改为等级制(即A、B、C、D、E五级)。
存储过程、触发器和用户自定义函数实验实验内容一练习教材中存储过程、触发器和用户自定义函数的例子。
教材中的BookSales数据库,在群共享中,文件名为BookSales.bak。
实验内容二针对附件1中的教学活动数据库,完成下面的实验内容。
1、存储过程(1)创建一个存储过程,该存储过程统计“高等数学”的成绩分布情况,即按照各分数段统计人数。
CREATE Proc MATH_NUM @MATH CHAR(20)='高等数学'ASSELECT @MATH as canme,count(case when score>=90 then 1 end)as[90以上],count(case when score>=80 and score<90 then 1 end)as[80-90],count(case when score>=70 and score<80 then 1 end)as[70-80],count(case when score>=60 and score<70 then 1 end)as[60-70],count(case when score<60 then 1 end)as[60以下] FROM study,course WHERE o=o and ame=@MATHGROUP BY ame(2)创建一个存储过程,该存储过程有一个参数用来接收课程号,该存储过程统计给定课程的平均成绩。
CREATE Proc AVG_SCORE @cno CHAR(20)ASSELECT @cno as 课程号,ame as 课程名,STR(AVG(score),5,2) as 平均成绩FROM study,courseWHERE o=o and o=@cno GROUP BY ame(3)创建一个存储过程,该存储过程将学生选课成绩从百分制改为等级制(即A、B、C、D、E)。
存储过程和用户自定义函数一:存储过程的简单创建,修改与删除1.创建简单的存储过程use AdventureWorksgocreate proc spEmployeeasselect*from HumanResources.Employee执行上面的代码就创建了一个存储过程如果想运行这个存储过程可以直接执行exec spEmployee这个语句2.更改存储过程ALTER proc[dbo].[spEmployee]asselect top13*from HumanResources.Employee3.删除存储过程drop proc dbo.spEmployee二:存储过程的输入参数和输出参数1.有输入参数的存储过程use AdventureWorksgocreate proc spEmployee@LastName nvarchar(50) =nullasif@LastName is nullselect top13*from HumanResources.Employee elseselect top10*from HumanResources.Employee查看该存储过程的结果可以用exec spEmployee '123'或直接exec spEmployee存储过程的重载...2.有输出参数的存储过程use AdventureWorksgoalter proc spEmployee@LastName nvarchar(50) =null outputasif@LastName is nullbeginprint'null'return'123'endelsebeginprint@LastNamereturn'456'end看第一个测试该存储过程的语句declare@myval nvarchar(50)exec@myval= spEmployee @myval outputprint@myval输出null 123第二个测试该存储过程的语句declare@myval nvarchar(50)set@myval='xland'exec@myval= spEmployee @myval outputprint@myval输出xland 456三:用户定义函数1.返回标量值的用户定义函数先做一个简单的日期处理函数把长日期缩短成短日期Create function dbo.DayOnly(@date datetime)returns varchar(12)asbeginreturn convert(varchar(12),@date,101)end为了测试上面的函数先做个脚本use Accountingdeclare@counter intset@counter=1while@counter<=10begininsert into Orders values(1,dateadd(mi,@counter,getdate()),1)set@counter=@counter+1end然后检索这个脚本新插入的数据记录use Accountingselect*from orders where dbo.DayOnly(date1) = dbo.DayOnly(getdate()) 2.返回表的用户定义函数先看例子use AdventureWorksgocreate function dbo.fnContactSearch(@LastName nvarchar(50))returns tableasreturn (select*from Person.Contact where LastName like@LastName+'%') 执行这个例子use AdventureWorksselect*from fnContactSearch('Ad')3.综合例子:返回表,有输入参数use xlandgocreate function dbo.funGetMytable(@id as int)returns@allrows table(id int not null,title nvarchar(max) null)asbegininsert into@allrows select id,title from mytable where id =@id returnendgo执行这个例子select*from funGetMytable(1)。
数据库系统原理实验报告实验名称:__用户定义数据类型与自定义函数_ 指导教师:_叶晓鸣刘国芳_____ 专业:_计算机科学与技术_ 班级:__2010级计科班_ 姓名:_文科_____学号: 100510107 完成日期:_2012年11月10日_成绩: ___ ___一、实验目的:(1)学习和掌握用户定义数据类型的概念、创建及使用方法。
(2)学习和掌握用户定义函数的概念、创建及使用方法。
二、实验内容及要求:实验 11.1 创建和使用用户自定义数据类型内容:(1)用SQL语句创建一个用户定义的数据类型Idnum。
(2)交互式创建一个用户定义的数据类型Nameperson。
要求:(1)掌握创建用户定义数据类型的方法。
(2)掌握用户定义数据类型的使用。
实验 11.2 删除用户定义数据类型内容:(1)使用系统存储过程删除用户定义的数据类型Namperson。
(2)交互式删除用户定义的数据类型Idnum。
要求:(1)掌握使用系统存储过程删除用户定义的数据类型。
(2)掌握交互式删除用户定义的数据类型。
实验 11.3 创建和使用用户自定义的函数内容:(1)创建一个标量函数Score_FUN,根据学生姓名和课程名查询成绩。
(2)创建一个内嵌表值函数S_Score_FUN,根据学生姓名查询该生所有选课的成绩。
(3)创建一个多语句表值函数ALL_Score_FUN,根据课程名查询所有选择该课程学生的成绩信息。
要求:(1)掌握创建标量值函数的方法。
(2)掌握创建内嵌表值函数的方法。
(3)掌握创建多语句表值函数的方法。
实验 11.4 修改用户定义的函数内容:(1)交互式修改函数Score_FUN,将成绩转换为等级输出。
(2)用SQL修改函数S_Score_FUN,要求增加一输出列定义的成绩的等级。
要求:(1)掌握交互式修改用户定义函数的方法。
(2)掌握使用SQL修改用户定义函数的方法。
实验 11.5 输出用户定义的函数内容:(1)交互式删除函数Score_FUN。
第7 章存储过程、触发器和用户自定义函数(6课时)主要内容:1 存储过程(概述、创建与执行、修改与删除)2 触发器(概述、DML触发器、DDL触发器)3 用户自定义函数(概述、标量函数的建立与调用、内嵌表值函数的建立与调用、多语名表值函数的建立与调用)存储过程是一个可重用的代码模块,可以高效率地完成指定的操作。
触发器是一种特殊类型的存储过程,可以实现自动化的操作。
用户定义函数是由用户根据应用程序的需要而定义的可以完成特定操作的函数。
这三种数据库对象都可以通过两种方法来定义:●SQL Server Management Studio工具●命令这里只讨论通过命令的方式定义相应对象。
7.1 存储过程7.1.1 存储过程概述当使用SQL Server创建应用时,TRANSACT-SQL语言是应用程序与SQL Server数据库之间的主要编程接口。
使用TRANSACT-SQL语言进行程序设计时,有两种方式:一种方式是在应用程序中直接使用T-SQL语句向SQL Server发送命令;另一种方式就是使用存储过程。
存储过程是一种数据库对象,由一组预编译的T-SQL语句组成,这些语句在一个名称下存储,并作为一个单元进行处理。
存储过程类似于其他编程语言中的函数或过程:能够使用传递给它的参数,能够调用其它存储过程甚至本身,能够返回一个状态码来表示是否成功执行。
在SQL Server 2008系统中,除了可以使用Transact-SQL语言编写存储过程外,也可以使用CLR方式编写存储过程。
【CLR,公用语言运行时(Commen Language Runtime),.NET 提供了一个运行时环境,它负责资源管理(内存分配和垃圾收集),并保证应用和底层操作之间必要的分离。
是一种多语言执行环境,支持众多的数据类型和语言特性。
他管理着代码的执行,并使开发过程变得更加简单。
】SQL Server中有三类存储过程:系统存储过程(sp_为前缀)、用户自定义存储过程和扩展存储过程(xp_为前缀,扩展了SQL Server的功能,使得用户能调用外部例程(自已编写的程序或系统提供的命令),从SQL Server2005版本开始,将逐步删除扩展存储过程类型,因为使用CLR存储过程可以可靠和安全地替代扩展存储过程的功能)。
存储过程和存储函数实验报告实验目的通过本次实验,掌握存储过程和存储函数的基本概念、使用方法以及相应的应用场景。
实验环境- 操作系统:Windows 10- 数据库管理系统:MySQL 8.0- 开发工具:MySQL Workbench 8.0实验内容1. 创建存储过程和存储函数存储过程和存储函数可以使用MySQL Workbench 8.0自带的编辑器进行创建和编辑,也可以在MySQL命令行中使用SQL 语句进行创建。
创建存储过程的SQL语句如下:```mysqlCREATE PROCEDURE 存储过程名([参数列表])BEGIN存储过程的主体(SQL语句)END;```创建存储函数的SQL语句如下:```mysqlCREATE FUNCTION 存储函数名([参数列表]) RETURNS 返回值类型BEGIN存储函数的主体(SQL语句)RETURN 返回值;END;```其中,参数列表和返回值类型可以不设置,存储过程和存储函数的主体可以包含任意的SQL语句。
以下是一个简单的存储过程和存储函数的创建示例:```mysqlCREATE PROCEDURE add(a INT, b INT)BEGININSERT INTO table1 VALUES (a+b);END;CREATE FUNCTION multiply(a INT, b INT) RETURNS INT BEGINDECLARE c INT;SET c = a*b;RETURN c;END;```2. 调用存储过程和存储函数存储过程和存储函数可以在MySQL命令行中使用CALL语句进行调用,也可以在MySQL Workbench的SQL编辑窗口中编写调用语句执行。
调用存储过程的CALL语句如下:```mysqlCALL 存储过程名(参数列表);```调用存储函数的SELECT语句如下:```mysqlSELECT 存储函数名(参数列表);```例如,使用上述示例中的存储过程和存储函数进行调用的示例如下:```mysqlCALL add(3, 5);SELECT multiply(3, 5);```3. 存储过程和存储函数的应用场景存储过程和存储函数在数据库开发中有着重要的应用场景,主要体现在以下几个方面:3.1 封装复杂的业务逻辑存储过程和存储函数可以将复杂的业务逻辑封装起来,提高系统的稳定性和安全性。
实验11 存储过程和用户自定义函数
实验目的
1.掌握通过企业管理器创建、修改、删除存储过程和用户自定义函数的方法
2.学会编写存储过程和用户自定义函数
3.掌握存储过程的执行方法
4.学会编写、调用三类用户自定义函数
实验准备
1.学习存储过程和用户自定义函数相关知识。
2.已掌握常程序控制流语句。
3.熟练使用T-SQL完成数据查询和程序设计。
4.还原studentdb数据库
实验内容和步骤
1.打开企业管理器,展开studentdb子目录,选中“存储过程”,单击鼠标右键,弹出
快捷菜单,选择【新建存储过程(S)…】,打开新建存储过程窗口,如图11- 1。
图11- 1 新建存储过程
2.新建并执行存储过程“字母打印”。
(1)在新建存储过程窗口输入以下代码。
CREATE PROCEDURE 字母打印AS
注解:该存储过程是将26个小写英文字母按a~z的顺序输出,其中ascii()函
数——返回字符对应ASCII码,char()函数——把ASCII码转换成对应字符。
(2)输入完成后,单击【检查语法】按钮,确认输入内容正确后,单击【确认】按
钮完成存储过程的创建。
(3)打开查询分析器,输入:
exec 字母打印
(4)执行,查看运行结果。
3.修改存储过程“字母打印”并执行。
(1)在企业管理器存储过程列表窗格中,选中存储过程“字母打印”,弹出快捷菜
单,选择【属性(R)】,或直接双击该存储过程,打开属性窗口,如图11- 2。
图11- 2 存储过程“字母打印”属性窗口
(2)修改代码内容,将“print char(ascii('a')+@count)”改为“print
char(ascii('A')+@count)”。
(3)单击【确认】按钮,完成存储过程的修改。
(4)重新在查询分析器执行该存储过程,查看运行结果。
4.新建并执行带输入参数的存储过程。
(1)在企业管理器中新建存储过程“成绩查询”,代码如下:
(2)在查询分析器窗口中,选择studentdb数据库。
要求:通过存储过程“成绩查
询”查看学号为“2007224117”的成绩。
●方法一:输入exec 成绩查询‘2007224117’,并执行。
●方法二:输入
执行,查看该同学的成绩。
注:以上是执行含输入参数存储过程的常用方法,参数可以直接通过值传递,
也可以通过变量传递。
5.练习:请新建存储过程“学生信息”,输入参数仍为学号,返回学号对应的“学生”
表信息,并通过该存储过程查看学号为“2007224117”的个人信息。
6.新建带返回参数的存储过程并执行。
(1)在企业管理器中新建存储过程“学生平均成绩”,代码如下:
(2)在查询分析器窗口中,选择studentdb数据库,输入代码:
执行,查看运行结果。
注:执行带有返回参数的存储过程时,必须先定义变量(存返回值),exec语
句须加output关键字。
7.练习:请新建存储过程“班级平均成绩”,输入参数为专业、年级、班序号,输出
对应的平均总评成绩。
并使用该存储过程查询专业为1009,年级为2008,班序号为1的平均总评成绩。
8.新建存储过程“学生成绩分析”,输入参数“学号”,判断该学号对应平均考试成绩
若在90分及以上,认为优秀,60分以下为差,其他情况为一般,并把结果存在“学生考试评价”表中。
(1)在查询分析器中输入以下代码,生成【学生考试评价】表。
CREATE TABLE [dbo].[学生考试评价] (
[学号] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[平均成绩] [int] NULL ,
[考试评价] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ) ON [PRIMARY]
GO
ALTER TABLE [dbo].[学生考试评价] ADD
CONSTRAINT [PK_学生考试评价] PRIMARY KEY CLUSTERED
(
[学号]
) ON [PRIMARY]
GO
(2)录入存储过程代码
注:IF的嵌套也可以通过CASE语句完成。
参考:
set @评价=(case when @平均分>=85 then '优秀'
when @平均分>=60 and @平均分<85 then '一般'
when @平均分<60 then '差' end)
insert into 学生考试评价(学号,平均成绩,考试评价)
values(@学号,@平均分,@评价)
或者:
insert into 学生考试评价(学号,平均成绩,考试评价)
values(@学号,@平均分,(case when @平均分>=85 then '优秀'
when @平均分>=60 and @平均分<85 then '一般'
when @平均分<60 then '差' end))
(3)运行存储过程。
9.新建用户自定义函数“DateToQuarter”并调用该函数。
(1)在企业管理器中展开studentdb子目录,选中“用户定义的函数”,单击鼠标右
键,弹出快捷菜单,选择【新建用户定义的函数(U)…】,打开新建用户自
定义函数窗口,如图11- 3。
图11- 3 新建用户自定义函数窗口
(2)在新建用户自定义函数窗口文本区域输入代码:
注:该函数的功能是将输入的日期数据转换为该日期对应的季度值。
如输入
‘2006-8-5’,返回‘3Q2006’,表示2006年3季度。
(3)调用该函数,返回当前日期对应的季度值。
在查询分析器中输入:
select dbo. DateToQuarter(getdate())
执行并查看运行结果,学会标量函数的调用方法。
10.新建并应用数字转换中文大写函数“NumToStr”
(1)在企业管理器打开新建用户自定义函数窗口,输入代码:
(2)在查询分析器中,调用该函数,测试是否正确。
(3)使用该函数,编写程序,完成0~99的数字大写转换,代码如下:
(4)设置@num值为30,查看结果,修改程序,完善该程序;能否编写程序完成
任意数字的中文大写转换。
11.新建并执行表值函数“stuInfo”,输入学号,返回对应学生信息
(1)仍在企业管理器打开新建用户自定义函数窗口,代码如下:
(2)调用该函数,查看学号为“2007224117”的个人信息,在查询分析器中输入:
select * from dbo.stuInfo('2007224117'),执行并查看运行结果,学会表值函数的
调用方法。
注:当调用标量值函数时,必须加上‚所有者‛,通常是dbo(但不是绝对,可以在企业管理器中的‚用户定义函数‛中查看所有者),调用表值函数时,可以只使用函数名。
12.新建并执行多语句表值函数“stuScore”,输入学号、课程号,返回对应学生姓名、
课程名和成绩。
(1)仍在企业管理器打开新建用户自定义函数窗口,代码如下:
(2)调用该函数,查看学号’2007122310’课程代码1239的成绩。
select * from stuScore('2007122310',1239)
13.删除自定义函数“xDelay”。
(1)在企业管理器用户定义的函数窗格中,选中“xDelay”。
(2)按DEL键或单击鼠标右键,弹出快捷菜单,选择【删除(D)】,打开“除去
对象”对话框。
(3)单击【全部除去】按钮,完成删除。
实验思考
1.请修改存储过程“字母打印”,要求按Z~A的顺序输出26个大写英文字母。
2.调用存储过程和用户自定义函数的方法是否全部掌握?
3.在执行带输出参数存储过程时,须先定义变量来传递输出参数,请问如何确定变量
的数据类型?
4.对比存储过程与用户自定义函数在使用上的不同。