存储过程:一组实现特定功能的SQL语句集合,可以有入参和返回值,通过过程名调用某个过程,一次编译永久有效。

读完这个定义,很好奇,这和函数有什么区别啊?但是,只听说招聘单位说要求会存储过程,好像还没听说过有哪家公司说要求会函数的,两者差在哪呢?

 

还是有一些差别的,函数的限制比较多,不如存储过程灵活强大,总结存储过程和函数的区别如下:

1. 返回值的区别:

  函数有且只有一个返回值,而存储过程则可以返回0个或多个;

  函数只能返回值或者表对象,不能返回结果集,存储过程则可以返回参数和结果集。

2. 使用上的区别:

  所有函数不能使用临时表,而且部分表不能使用临时变量,存储过程则没有这个限制;

  函数可以再查询语句中调用,存储过程只能单独调用,由于函数可以返回表对象,所以可以把函数写在from后面。

 

存储过程的优点:

1. 安全性:使用之前已经编译好了,入参被看作是纯参数,不会发生SQL注入;调用者直接调用封装好的过程即可,看不到存储过程的业务逻辑,也无法通过存储过程得到表的信息。

2. 复用性:复杂代码可以封装到一个存储过程中,下次使用直接调用即可,不用再写一遍。

3. 节省网络传输:存储过程存与数据库服务器上,存储过程访问数据库和表,不需要跨设备,减少网络流量。

4. 效率:存储过程只需要编译一次,而普通的SQL语句每次执行都要编译。而且,传输过程中,SQL语句是一长串,而存储过程则只传输存储过程名就好了。所以存储过程可提高数据库执行速度。

存储过程的缺点:

1. 调试困难

2. 可移植性查差

3. 维护成本大

 

存储过程的相关语法

-- 创建存储过程
delimiter //
drop procedure if exists p_firstproc; # 创建之前先删掉之前的,表面重复而报错
create procedure p_firstproc(in id int,in yon boolean,out result int)
begin
-- 声明局部变量
declare s int;
declare c int default 0;
if yon=true then 
    set s = 1;
    set c = 3;
else
    set s = 0;
end if;

-- 将查询语句结果赋值给变量
select score from course where uid=id limit 1
into result;

while c>0 do
    set result = result+1;
    set c = c-1;
end while;

repeat 
    set result = result + 1;
    set c = c+1;
    until c>3 end repeat;
    
lp:loop
    select \'hello proc\';
    set c = c-1;
    if c<0 then
        leave lp;
    end if;
end loop;

end
//

-- 调用过程并查询结果
call p_firstproc(1,true,@result);
select @result;

这个存储过程没有实际意义,只是把各种涉及到语法罗列进去了。

注意:①delimiter // … //中,delimiter 和 // 之间要有空格,否则报错。

   ②每个语句结束都要加 “;” 否则报错。

 

版权声明:本文为tiny-me原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/tiny-me/p/11779043.html