一、简介

从 5.0 版本才开始支持,是一组为了完成特定功能的SQL语句集合(封装),比传统SQL速度更快、执行效率更高。

存储过程的优点

1、执行一次后,会将生成的二进制代码驻留缓冲区(便于下次执行),提高执行效率

2、SQL语句加上控制语句的集合,灵活性高

3、在服务器端存储,客户端调用时,降低网络负载

4、可多次重复被调用,可随时修改,不影响客户端调用

5、 可完成所有的数据库操作,也可控制数据库的信息访问权限

为什么要用存储过程?

1.减轻网络负载;2.增加安全性

二、创建存储过程

2.1 创建基本过程

使用create procedure语句创建存储过程

存储过程的主体部分,被称为过程体;以begin开始,以end$$结束

#声明语句结束符,可以自定义:delimiter $$#声明存储过程create procedure 存储过程名(in 参数名 参数类型)begin#定义变量declare 变量名 变量类型#变量赋值set 变量名 = 值 sql 语句1; sql 语句2; ...end$$#恢复为原来的语句结束符delimiter ;(有空格)
mysql> delimiter $$mysql> create procedure text() -> begin -> select * from stu.a_player; -> end $$Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;
call 存储过程名(实际参数);mysql> call text;+----+----------+-------+| id | name  | score |+----+----------+-------+| 1 | zhangsan | 88 || 2 | lisi  | 89 || 3 | wangwu | 67 || 4 | zhaoliu | 90 || 5 | xuli  | 80 || 6 | keke  | 75 |+----+----------+-------+6 rows in set (0.00 sec)
mysql> drop procedure text;

MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:

CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])

IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)

OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)

INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)

传递参数实例:

IN

mysql> create procedure test1(in in_id int(2)) -> begin -> select * from stu.a_player where id=in_id; -> end $$Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;#将4传递给in_id变量,执行事务mysql> call test1(4); +----+---------+-------+| id | name | score |+----+---------+-------+| 4 | zhaoliu | 90 |+----+---------+-------+1 row in set (0.00 sec)#将6传递给in_id变量,执行事务mysql> call test1(6);+----+------+-------+| id | name | score |+----+------+-------+| 6 | keke | 75 |+----+------+-------+1 row in set (0.00 sec)
mysql> delimiter $$mysql> create procedure test2(out aa int)  -> begin -> select aa; -> set aa=2; -> select aa; -> end $$Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;#将@aa变量传递给test2 事务mysql> call test2(@aa);+------+| aa |+------+| NULL |+------+#out向调用者输出参数,不接收输入的参数,所以aa为null1 row in set (0.00 sec)+------+| aa |+------+| 2 |+------+事务将aa变量设置为2(设置的是全局),则可进行输出1 row in set (0.00 sec)Query OK, 0 rows affected (0.00 sec)mysql> select @aa;+------+| @aa |+------+| 2 |+------+1 row in set (0.00 sec)#事务外查询变量,已经被修改
mysql> delimiter //mysql> create procedure test3(in num1 int,out num2 int,inout num3 int) -> begin -> select num1,num2,num3; -> set num1=10,num2=20,num3=30; -> select num1,num2,num3; -> end //Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;mysql> call test3(@num1,@num2,@num3);+------+------+------+| num1 | num2 | num3 |+------+------+------+| 1 | NULL | 3 |+------+------+------+1 row in set (0.00 sec)+------+------+------+| num1 | num2 | num3 |+------+------+------+| 10 | 20 | 30 |+------+------+------+1 row in set (0.00 sec)Query OK, 0 rows affected (0.00 sec)
mysql> select @num1,@num2,@num3;+-------+-------+-------+| @num1 | @num2 | @num3 |+-------+-------+-------+|  1 | 20 | 30 |+-------+-------+-------+1 row in set (0.00 sec)

in参数赋值类型可以是变量还有定值,而out和inout参数赋值类型必须为变量。

总结

更多相关文章

  1. 深入Gradle插件开发
  2. [Innost]Android深入浅出之Binder机制
  3. Android深入浅出之Binder机制
  4. 从零开始--系统深入学习android(实践-让我们开始写代码-Android框
  5. android资源合集
  6. 【Android】Android蓝牙开发深入解析
  7. 推荐--《Android深入浅出》
  8. Service深入分析
  9. Android之——AIDL深入

随机推荐

  1. android之wifi体系架构源码流程分析
  2. Android 混淆打包
  3. android中获取当前程序路径
  4. Android中ListView中显示图片和文本
  5. android doc 国内镜像
  6. [每天学点Android开发]Building Web Apps
  7. Android P SystemUI之StatusBar加载流程
  8. android > 禁止横竖屏切换
  9. Android中丰富多彩的onTouch事件
  10. [Android]解决控件重叠、覆盖的问题