存储过程的好处
存储过程是一组预编译好的 sql 语句, 用来执行某个特定的功能. 这样可以省去 sql 解析, 编译, 优化的过程, 提高了执行效率, 同时, 在调用的时候只传一个存储过程的名称, 而不用传一大堆 sql 语句, 减少了网络传输. 也间接提高了执行效率.
存储过程与自定义函数的区别
存储过程是一组 sql 语句, 为了实现某个独立的功能, 一般独立执行. 而自定义函数更多的作为其它 sql 语句的组成部分出现.
自定义函数只能有一个返回值, 而存储过程可以有多个返回值.
存储过程功能复杂, 函数针对性更强
存储过程定义
存储过程是 sql 语句和控制语句的预编译集合, 以一个名称存储并作为一个单元处理.
创建语法
- create
- [definer = {user|current_user}]
- procedure proc_name ([参数 [,....]])
some body code....
参数:
[in | out | inout] 参数名 类型
in 传入的参数
out 返回的参数
inout 传入 改变 并且返回的参数
调用语法
call proc_name(参数);
如果没有参数, 括号可以省略;
示例
创建没有参数的存储过程
- create procedure ver()
- select version();
调用
call ver(); 或 call ver;
当然这里把一个函数放进一个存储过程没有什么意义. 只是单纯为了举例.
创建一个 in 参数的存储过程
我们经常查询 id 为某值的用户, 所以我们把它写成一个存储过程.
- delimiter //
- create procedure findUserById(in userId int unsigned)
- begin
- select * from user where id = userId;
- end //
- delimiter ;
注意: 参数名不要和数据表中的字段名相同, 否则会出现意想不到的后果.
调用
call findUserById(1);
创建一个 in 一个 out 参数的存储过程
删除一个用户并且返回剩余用户数量
- delimiter //
- create procedure delUserByIdAndReturnNums(in userId int unsigned,out nums int unsigned )
- begin
- delete from user where id=userId;
- select count(id) from user into nums;
- end //
- delimiter ;
调用:
call delUserByIdAndReturnNums(1,@nums);br/> 调用过后我们就可以查看 @nums 的值了.
select @nums; mailto:br/>调用过后我们就可以查看@nums的值了。
创建一个 in 多个 out 参数的存储过程
删除一个用户并返回剩余用户总数 和 被删除用户的姓名
- delimiter //
- create procedure delUser(in userId int ,out nums int,out username varchar(20))
- begin
- select name from user where id = userId into username;
- delete from user where id = userId;
- select count(id) from user into nums;
- end //
- delimiter ;
调用
call delUser(3,@nums,@username);
调用过后可以查看两个变量的值.
- select @nums;
- select @username;
创建带有 inout 参数的存储过程
定义一个存储过程, 传入一个整数得到其平方值.
- delimiter //
- create procedure square(inout num int)
- begin
- set num=num*num;
- end //
- delimiter ;
调用:
由于其参数是 inout 类型, 所以我们需要传入一个赋值过的变量, 以便在存储过程内部对其修改后返回.
- set @num=3;
- call square(@num);
- select @num;
其结果如下:
- mysql> set @num=3;
- Query OK, 0 rows affected (0.00 sec)
- mysql> call square(@num);
- Query OK, 0 rows affected (0.02 sec)
- mysql> select @num;
- +------+
- | @num |
- +------+
- | 9 |
- +------+
- 1 row in set (0.00 sec)
- mailto:br/%3E%E8%B0%83%E7%94%A8%E8%BF%87%E5%90%8E%E6%88%91%E4%BB%AC%E5%B0%B1%E5%8F%AF%E4%BB%A5%E6%9F%A5%E7%9C%8B@nums%E7%9A%84%E5%80%BC%E4%BA%86%E3%80%82%3Cbr/
mailto:br/>调用过后我们就可以查看@nums的值了。
来源: http://www.bubuko.com/infodetail-2654247.html