存储过程与用户自定义函数
- 格式:doc
- 大小:86.00 KB
- 文档页数:5
存储过程和函数的区别 存储过程和函数的区别你想知道吗?下⾯是店铺给⼤家整理的存储过程和函数的区别,供⼤家参阅! 存储过程和函数的区别 存储过程和函数的不同之处在于: 函数必须有⼀个且必须只有⼀个返回值,并且还要制定返回值的数值类型。
存储过程可以有返回值,也可以没有返回值,甚⾄可以有多个返回值,所有的返回值必须由输⼊IN或者是输出OUT参数进⾏指定。
两者赋值的⽅式不同: 函数可以采⽤select ...into ...⽅式和set值得⽅式进⾏赋值,只能⽤return返回结果集。
过程可以使⽤select的⽅式进⾏返回结果集。
使⽤⽅法不同: 函数可以直接⽤在sql语句当中,可以⽤来拓展标准的sql语句。
存储过程,需要使⽤call进⾏单独调⽤,不可以嵌⼊sql语句当中。
函数中函数体的限制较多,不能使⽤显式或隐式⽅式打开transaction、commit、rollback、set autocommit=0等。
但是存储过程可以使⽤⼏乎所有的失sql语句。
存储过程种类 1系统存储过程 以sp_开头,⽤来进⾏系统的各项设定.取得信息.相关管理⼯作。
2本地存储过程 ⽤户创建的存储过程是由⽤户创建并完成某⼀特定功能的存储过程,事实上⼀般所说的存储过程就是指本地存储过程。
3临时存储过程 分为两种存储过程: ⼀是本地临时存储过程,以井字号(#)作为其名称的第⼀个字符,则该存储过程将成为⼀个存放在tempdb数据库中的本地临时存储过程,且只有创建它的⽤户才能执⾏它; ⼆是全局临时存储过程,以两个井字号(##)号开始,则该存储过程将成为⼀个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程⼀旦创建,以后连接到服务器的任意⽤户都可以执⾏它,⽽且不需要特定的权限。
4远程存储过程 在SQL Server2005中,远程存储过程(Remote Stored Procedures)是位于远程服务器上的存储过程,通常可以使⽤分布式查询和EXECUTE命令执⾏⼀个远程存储过程。
DB2常⽤sql语句转DB2 提供了关连式资料库的查询语⾔sql(structured query language),是⼀种⾮常⼝语化、既易学⼜易懂的语法。
此⼀语⾔⼏乎是每个资料库系统都必须提供的,⽤以表⽰关连式的操作,包含了资料的定义(ddl)以及资料的处理(dml)。
sql原来拼成sequel,这语⾔的原型以"系统 r"的名字在 ibm 圣荷西实验室完成,经过ibm内部及其他的许多使⽤性及效率测试,其结果相当令⼈满意,并决定在系统r 的技术基础发展出来 ibm 的产品。
⽽且美国国家标准学会(ansi)及国际标准化组织(iso)在1987遵循⼀个⼏乎是以 ibm sql 为基础的标准关连式资料语⾔定义。
⼀、资料定义 DDL(data definition language)资料定语⾔是指对资料的格式和形态下定义的语⾔,他是每个资料库要建⽴时候时⾸先要⾯对的,举凡资料分哪些表格关系、表格内的有什麽栏位主键、表格和表格之间互相参考的关系等等,都是在开始的时候所必须规划好的。
1、建表格:create table table_name(column1 datatype [not null] [not null primary key],column2 datatype [not null],...)说明:datatype --是资料的格式,详见表。
nut null --可不可以允许资料有空的(尚未有资料填⼊)。
primary key --是本表的主键。
2、更改表格 alter table table_nameadd column column_name datatype说明:增加⼀个栏位(没有删除某个栏位的语法。
alter table table_nameadd primary key (column_name)说明:更改表得的定义把某个栏位设为主键。
alter table table_namedrop primary key (column_name)说明:把主键的定义删除。
sql 存储过程中调用自定义函数自定义函数在SQL存储过程中的调用SQL存储过程是一段预定义的SQL代码集合,可以在数据库中进行重复使用。
而自定义函数是一段可重用的SQL代码,用于执行特定功能并返回一个值。
在SQL存储过程中,我们可以调用自定义函数来实现更加复杂的逻辑和计算。
我们需要创建一个自定义函数。
在SQL中,可以使用CREATE FUNCTION语句来定义一个函数,指定函数的名称、参数和返回值的数据类型,以及函数的主体逻辑。
例如,我们可以创建一个自定义函数来计算两个数的和:```CREATE FUNCTION calculate_sum(a INT, b INT)RETURNS INTBEGINDECLARE result INT;SET result = a + b;RETURN result;END;```在上述代码中,我们定义了一个名为calculate_sum的函数,它接受两个整数参数a和b,并返回一个整数类型的结果。
函数的主体逻辑是将a和b相加,并将结果赋值给变量result,然后通过RETURN语句返回结果。
接下来,我们可以在SQL存储过程中调用这个自定义函数。
在存储过程中,可以使用SELECT语句来调用函数并获取返回值。
例如,我们可以创建一个存储过程来计算两个数的和并输出结果:```CREATE PROCEDURE calculate_and_output_sum(a INT, b INT) BEGINDECLARE sum_result INT;SET sum_result = (SELECT calculate_sum(a, b));SELECT 'The sum of ' || a || ' and ' || b || ' is ' || sum_result; END;```在上述代码中,我们定义了一个名为calculate_and_output_sum 的存储过程,它接受两个整数参数a和b。
触发器、存储过程和函数三者有何区别四什么时候用存储过程?存储过程就是程序,它是经过语法检查和编译的SQL语句,所以运行特别快。
触发器是特殊的存储过程,存储过程需要程序调用,而触发器会自动执行;你所说的函数是自定义函数吧,函数是根据输入产生输出,自定义只不过输入输出的关系由用户来定义。
在什么时候用触发器?要求系统根据某些操作自动完成相关任务,比如,根据买掉的产品的输入数量自动扣除该产品的库存量。
什么时候用存储过程?存储过程就是程序,它是经过语法检查和编译的SQL语句,所以运行特别快。
存储过程和用户自定义函数具体的区别先看定义:存储过程存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。
存储过程是SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。
存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。
存储过程可包含程序流、逻辑以及对数据库的查询。
它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。
可以出于任何使用SQL 语句的目的来使用存储过程,它具有以下优点:·可以在单个存储过程中执行一系列SQL 语句。
·可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
·存储过程在创建时即在服务器上进行编译,所以执行起来比单个SQL 语句快。
用户定义函数函数是由一个或多个Transact-SQL 语句组成的子程序,可用于封装代码以便重新使用。
Microsoft? SQL Server? 2000 并不将用户限制在定义为Transact-SQL 语言一部分的内置函数上,而是允许用户创建自己的用户定义函数。
可使用CREATE FUNCTION 语句创建、使用ALTER FUNCTION 语句修改、以及使用DROP FUNCTION 语句除去用户定义函数。
每个完全合法的用户定义函数名(database_name.owner_name.function_name) 必须唯一。
实验报告
课程名称:数据库系统概论实验时间:2012.5.10
学号:姓名:班级:
一、实验题目:存储过程与用户自定义函数
二、实验目的:
1)掌握SQLServer中存储过程的使用方法。
2)掌握SQLServer中用户自定义函数的使用方法。
三、实验内容:(记录每个实验步骤内容、命令、截屏结果)
(一)存储过程
1、对学生课程数据库,编写2个存储过程,分别完成下面功能:
1)统计某一门课的成绩分布情况,即按照各分数段统计人数,要求使用游标。
create proc TotalByCnoNum
(
@cno varchar(6)
)
as
begin
declare @num1 int,@num2 int, @num3 int,@num4 int,@num5 int,@grade
int,@cname char(20)
select @num1=0,@num2=0,@num3=0,@num4=0,@num5=0
declare cur_cno cursor for select grade from sc where cno=@cno
open cur_cno
fetch next from cur_cno into @grade
while@@fetch_status=0
begin
if @grade between 90 and 100
set @num1=@num1+1
else if @grade between 80 and 89
set @num2=@num2+1
else if @grade between 70 and 79
set @num3=@num3+1
else if @grade between 60 and 69
set @num4=@num4+1
else
set @num5=@num5+1
fetch next from cur_cno into @grade
end
close cur_cno
deallocate cur_cno
select @cname=cname from course where cno=@cno
print'课程:'+@cname
print'分数段人数统计'
print'=========================='
print' 90-100 : '+convert(varchar(3),@num1)
print' 80-89 : '+convert(varchar(3),@num2)
print' 70-79 : '+convert(varchar(3),@num3)
print' 60-69 : '+convert(varchar(3),@num4)
print' 不及格: '+convert(varchar(3),@num5)
print'=========================='
end
执行以下语句,显示课程号为3的成绩情况:
exec TotalByCnoNum '3'
运行结果如下:
2)将学生选课成绩从百分制改为等级制(即A、B、C、D、E五级)。
create proc ChangeGrade
as
begin
declare @dj char(1),@cname char(20),@cno char(6),@sno char(9), @grade int
declare cur_cno cursor for select grade,cno,sno from sc
open cur_cno
fetch next from cur_cno into @grade,@cno,@sno
print'学号课程号等级'
print'=========================='
while@@fetch_status=0
begin
if @grade between 90 and 100
set @dj='A'
else if @grade between 80 and 89
set @dj='B'
else if @grade between 70 and 79
set @dj='C'
else if @grade between 60 and 69
set @dj='D'
else
set @dj='E'
print @sno+' '+@cno+' '+@dj
print'--------------------------'
fetch next from cur_cno into @grade,@cno,@sno
end
print'========================='
close cur_cno
deallocate cur_cno
end
执行:
exec ChangeGrade
运行结果为:
2、对SPJ数据库,
1)创建一个存储过程ins_s_count,功能为根据提供的供应商号,供应商名,供应商所在地等信息,往S表中插入数据,并返回插入该记录之后,S表中的记录数。
create proc ins_s_count
(
@sno char(6),
@sname char(20),
@status char(10),
@city char(20)
)
as
begin
declare @num int
i nsert into s (sno,sname,status,city)values(@sno,@sname,@status,@city)
print'你添加的记录是:'
print'=================================================='
print'供应商号供应商名状态供应商所在地'
print' '+@sno+@sname+@status+@city
select @num=count(*)from s
print''
print'=================================================='
print'共有'+convert(varchar,@num)+'条记录'
end
在s表中添加如下数据:
exec ins_s_count 'S7','一建','120','杭州'
结果为:
2)调用该存储过程实现往S表中插入一条记录(‘S6’,’天盛’,‘40’‘福州’),并显示
插入该记录之后,S表中的记录数。
数据库脚本如第(1)题:
exec ins_s_count 'S6','天盛','40','福州'
(二)用户自定义函数
1.创建一个返回标量值的用户定义函数RectangleArea:输入矩形的长和宽就能计算矩形的面积。
调用该函数。
create function RectangleArea
(
@width int,
@length int
)
returns int
as
begin
return@width*@length
end
测试语句:
select dbo.RectangleArea (5,7)'面积'
2.创建一个用户自定义函数,功能为产生一张有关学生成绩统计的报表。
该报表
显示每一门课程的课程号、课程名、选修人数、本门最高分、最低分和平均分。
调用这个函数,生成相应的报表并给用户浏览。
create function totalC()
returns table
as
return
(
select o,ame,aa.num,aa.maxgrade,aa.mingrade,aa.avggrade from (
select cno,count(*)'num',max(grade)'maxgrade',min(grade)'mingrade',avg(grade) 'avggrade'
from sc group by cno
)aa,course
where o=o
)
执行:
select*from dbo.totalC()
四、实验报告书写要求
实验内容的脚本。
五、实验总结
本次实验主要巩固了存储过程的使用方法和用户自定义函数的使用方法,尤其是对游标的使用。