存储过程
存储过程:一组实现特定功能的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 和 // 之间要有空格,否则报错。
②每个语句结束都要加 “;” 否则报错。