下面是小编精心整理的存储过程同函数的区别,本文共10篇,仅供参考,大家一起来看看吧。

篇1:存储过程同函数的区别
SQL SERVER中:
本质上没区别,只是函数有如:只能返回一个变量的限制。而存储过程可以返回多个。而函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行。执行的本质都一样。
函数限制比较多,比如不能用临时表,只能用表变量。还有一些函数都不可用等等。而存储过程的限制相对就比较少
1. 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。
2. 对于存储过程来说可以返回参数,而函数只能返回值或者表对象。
3. 存储过程一般是作为一个独立的部分来执行(EXEC执行),而函数可以作为查询语句的一个部分来调用(SELECT调用),由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。
4. 当存储过程和函数被执行的时候,SQL Manager会到procedure cache中去取相应的查询语句,如果在procedure cache里没有相应的查询语句,SQL Manager就会对存储过程和函数进行编译,
Procedure cache中保存的是执行计划 (execution plan) ,当编译好之后就执行procedure cache中的execution plan,之后SQL SERVER会根据每个execution plan的实际情况来考虑是否要在cache中保存这个plan,评判的标准一个是这个execution plan可能被使用的频率;其次是生成这个plan的代价,也就是编译的耗时。保存在cache中的plan在下次执行时就不用再编译了。
sql server中总结的用法大部分适用于Oracle,在具体的使用过程中,还要看系统实现的复杂程度和实际情况。有经验的DBA对于这两者的运用应该已经了然于胸.
篇2:读书笔记MySQL存储过程存储函数
存储函数和存储过程不同的地方有以下几点:
1.函数的参数列表中模式只能为IN,
2.函数必须返回一个值,它的类型被定义于函数的头部
3.函数能被SQL语句所调用
4.函数可能不返回任何结果集
DELIMITER $$
DROP FUNCTION IF EXISTS discount_price$$
CREATE FUNCTION discount_price
normal_price NUMERIC(8, 2)
RETURN NUMERIC(8, 2)
DETERMINISTIC
BEGIN
DECLARE v_discount_price NUMERIC(8, 2);
IF (normal_price >500) THEN
SET discount_price = normal_price * .8;
ELSE IF (normal_price >1000) THEN
SET discount_price = normal_price * .9;
ELSE
SET discount_price = normal_price;
END IF;
RETURN (discount_price);
END$$
篇3:存储过程入门
这一篇要总结的是存储过程,包括存储过程有哪几种,如何创建,以及最后如何调用存储过程,所以分为以下几个方面进行总结。
1,不带参数的存储过程
2,带输入参数的存储过程
3,带输入和输出参数的存储过程
4,带返回值的存储过程
不带参数的存储过程
例如,以下存储过程返回Employees表中所有职员的记录,
存储过程代码:
USE TSQLFundamentals;GOIF OBJECT_ID('usp_ProcDemoNoParam','P') IS NOT NULL DROP PROC usp_ProcDemoNoParam;GO-- 1,不带参数CREATE PROC usp_ProcDemoNoParamASBEGIN SELECT * FROM HR.Employees;ENDGO
调用代码:
USE TSQLFundamentals2008;GO-- 1,不带参数存储过程的调用EXEC usp_ProcDemoNoParam;
结果:
篇4:浅谈触发器和存储过程
触发器: 基本表在被修改的时候通过事件触发而执行的存储过程。(被动)
作用是保证了由主键和外键所不能保证的参照完整性和数据完整行。
存储过程: 一种数据库对象,将负责不同功能的语句分类封装好,以便反复调用。(主动)
篇5:浅谈触发器和存储过程
触发器:
1:实现比约束更复杂的数据的完整性
2:返回自定义的错误信息
3:实现多张表的连级修改
存储过程:
1:语句封装,可多次调用,just like 面向对象
2:执行速度更快(存储过程第一次执行便被分析优化)
3:保证数据安全(系统管理员可对存储过程进行权限限制)
篇6:浅谈触发器和存储过程
1:触发器是一个被动的执行过程,更像是一个保护机制,当我的某个数据库的某条数据被修改的时候我预先写好的触发器就这样被触发了,然后他就会通过主外键约束来对其他表的数据进行合理修改以满足整个数据的完整性,
而存储过程却是一个十足的积极主动能手,主动把SQL语句分类封装,就像我们在机房收费的时候封装的方法,我写好了有类似的需求直接调用就可以了。
2:触发器和存储过程都是数据库这个层面上进行的操作和修改,可以说基本跟我们要实现的软件代码没半毛钱关系,这样也是符合分层思想的,而且有利于后期系统的维护和修改。如果哪个功能块需求变更我们可能只需要修改数据库里的存储过程或者触发器而不用打开大段的代码去修改SQL语句。
3:两者都从不同方面保护了数据,触发器可以保护数据的完整性,而存储过程则是通过权限管理维护数据的安全。
篇7:数据库面试题:存储过程
存储过程和函数的区别是什么?
答:存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其他对象的任务,用户可以调用存储过程。
而函数通常是数据库已经定义的方法,它接收参数并返回某种类型的值,并且不涉及特定用户表,例如聚集函数avg、max、count等,日期时间单数day、month等。
PL/SQL(Procedural Language/SQL, PL/SQL)是编写数据库存储过程的一种过程语言,它结合了SQL的数据操纵能力
和过程化语言的流程控制能力,是SQL的过程化扩展。
综上PL/SQL就是对数据的操纵过程化
存储过程的优点
它是由PL/SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,因此称它为存储过程,使用时只要调用即可。
1、由于存储过程不像解释执行的SQL语句那样在提出操作请求时才进行语法分析和优化工作,因而运行效率高,
它提供了在服务器端快速执行SQL语句的有效途径。
2、存储过程降低了客户机和服务器之间的通信量。客户机上的应用程序只要通过网络向服务器发出存储过程的名字和参数,就可以让RDBMS执行许多条的SQL语句,并执行数据处理。只有最终处理结果才返回客户端。
3、方便实施企业规则。可以把企业规则的运算程序写成存储过程放入数据库服务器中,由RDBMS管理,既有利于集中控制,又能方便地进行维护。当用户规则发生变化时,只需要修改存储过程,无需修改其他应用程序。
[数据库面试题:存储过程]
篇8:sybase存储过程问题
问:SYBASE存储过程,为什么执行到这一句就不执行了
select @nSerialNo = serialno from schedule where phonenum= @strPhoneNum and type = @nTypeif @@rowcount = 0
begin
...
end
else
begin
...
end
上面的select结果是空记录集,存储过程一执行到空记录集,就会返回?
答:if exists(select @nSerialNo = serialno from schedule where phonenum= @strPhoneNum and type = @nType)这个语句的逻辑有点问题?
if exists 一般是用来确定是否存在类似的记录?你现在又要将存在的结果赋值?其实还不如写 if exists(select 1 from schedule where phonenum= @strPhoneNum and type = @nType)
确定是否存在这样的记录,在执行相应的处理,
sybase存储过程问题
,
篇9:SQL存储过程返回值
SQL存储过程返回值
先靠一下自己,
当我做多了ORACLE时,我就忘了SQL的储存过程可以返回数据集这个事实了。
。。。。。。。。。。。。。。。。
Create procedure test
@t1 int,
@t2 nvarchar(200) out
as
set t2='这个是输出参数';
go
调用
declare @out_t2 nvarchar(200);
exec test 1,@out_t2;
select @out_t2;
输出:
这个是输出参数
-----
也可以定义一个接收参数,接收存储过程的成功与否的默认返回值(这会是一个整数,0 是无错误执行,其它数为错误代码!)
declare @val int;
declare @out_t2 nvarchar(200);
exec @val = test 1,@out_t2;
select @out_t2,@val;
除了这些简单参数,存储过程还可以直接返回一个数据集
create table table_2( i_key int,i_value varchar(20));
declare @d int;
set @d=1;
WHILE @d<10
begin
insert into table_2 select @d+1,cast(@d as varchar(50))+'S';
set @d = @d+1;
end;
Create procedure test
@t1 int
as
select * from table_2;
go
执行:
exec test 1;
结果,就是table_2表的集合.
作者 akuoma
篇10:初识PostgreSQL存储过程
这篇文章主要介绍了初识PostgreSQL存储过程,本文讲解了PostgreSQL中存储过程的语法,并给出了一个操作实例,需要的朋友可以参考下
什么是存储过程, 百度百科是这么定义的:存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它,存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
Postgresql的存储过程语法结构如下:
代码如下:
CREATE OR REPLACE FUNCTION 函数名(参数1,[整型 int4, 整型数组 _int4, …])
RETURNS 返回值类型 AS
$BODY$
DECLARE
变量声明
BEGIN
函数体
END;
$BODY$
LANGUAGE ‘plpgsql‘ VOLATILE;
下面的例子是要调用一个存储过程自动创建对应的一系列表:
代码如下:
CREATE OR REPLACE FUNCTION create_table_for_client(id int)
RETURNS integer AS
$BODY$
DECLARE
num int4 := 0;
sql “varchar”;
BEGIN
sql := ‘create table _‘ || id || ‘_company(id int, name text)‘;
EXECUTE sql;
sql := ‘create table _‘ || id || ‘_employee(id int, name text)‘;EXECUTE sql;
sql := ‘create table _‘ || id || ‘_sale_bill(id int, name text)‘;EXECUTE sql;
.......
return num;
END;
$BODY$ LANGUAGE plpgsql VOLATILE
★函数课件
文档为doc格式