什么是存储
存储过程(Stored Procedure)是一种在数据库中存储多条语句,以便调用的一种数据库对象。存储过程可以完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
简单来说,当我们需要完成同样的任务反复调用一组语句时,就可以把这组语句封装成一个存储过程,后续调用方便快捷,功能类似于函数。
如何创建以及调用存储
既然存储类似函数,必定涉及参数,存储的参数有三种,
IN 输入参数
OUT 输出参数
INOUT 输入输出都可以的参数
用一个简单的student表举例:
mysql> SELECT * FROM student;
+-------+--------+-------+
| s_num | s_name | s_sex |
+-------+--------+-------+
| 101 | Tom | M |
| 102 | Sam | M |
+-------+--------+-------+
为了区别存储过程的终止, 和储存内语句的终止,需要设定一个终止符,语法是DELIMITER $
创建存储的语法的如下
1 不含参数类型的存储
mysql> CREATE PROCEDURE test1( ) --创建一个无参数存储
-> BEGIN
-> SELECT * FROM student WHERE s_sex = 'M';
-> SELECT * FROM student WHERE s_name = 'Tom';
-> END$
Query OK, 0 rows affected (0.04 sec)
调用存储过程语法为 CALL Procedure_Name()
mysql> CALL test1()$
+-------+--------+-------+
| s_num | s_name | s_sex |
+-------+--------+-------+
| 101 | Tom | M |
| 102 | Sam | M |
+-------+--------+-------+
2 rows in set (0.00 sec)
+-------+--------+-------+
| s_num | s_name | s_sex |
+-------+--------+-------+
| 101 | Tom | M |
+-------+--------+-------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
2包含IN 类型参数的存储(IN 是参数默认类型)
mysql> CREATE PROCEDURE test2( IN num INT(4), IN name VARCHAR(20) , IN sex VARCHAR(20) )--创建一个插入数据的存储--
-> BEGIN
-> INSERT INTO student VALUES( num, name , sex );
-> END $
Query OK, 0 rows affected (0.08 sec)
mysql> CALL test2(103, 'Jack', 'M')$ --调用test2 添加数据--
Query OK, 1 row affected (0.07 sec)
mysql> SELECT * FROM student$ --查看执行结果--
+-------+--------+-------+
| s_num | s_name | s_sex |
+-------+--------+-------+
| 101 | Tom | M |
| 102 | Sam | M |
| 103 | Jack | M |
+-------+--------+-------+
3 rows in set (0.00 sec)
创建含有OUT参数的存储
mysql> CREATE PROCEDURE test3(IN name VARCHAR(20), OUT num INT(4)) --输出学生姓名, 返回学生学号--
-> BEGIN
-> SELECT s_num INTO num FROM student WHERE s_name = name ;
-> END $
Query OK, 0 rows affected (0.06 sec)
mysql> CALL test3('Jack', @num) $ -- 调用test3, 查询 Jack 的学号,放在用户变量 num 中--
Query OK, 1 row affected (0.00 sec)
mysql> SELECT @num $
+------+
| @num |
+------+
| 103 |
+------+
1 row in set (0.00 sec)
创建含有INOUT参数的存储
mysql> CREATE PROCEDURE test4( INOUT a INT(4) ) -- 输入输出都是参数a--
-> BEGIN
-> SET a = a * 2; -- 让变量a 扩大两倍--
-> END $
Query OK, 0 rows affected (0.09 sec)
mysql> SET @a = 4$ --创建一个用户变量a
Query OK, 0 rows affected (0.00 sec)
mysql> CALL test4( @a) $ -- 调用test4 处理a --
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @a $ -- 查看结果
+------+
| @a |
+------+
| 8 |
+------+
1 row in set (0.00 sec)
如何删除储存
mysql> DROP PROCEDURE test1$ --为了数据安全考虑, 每次只能删除一个存储--
Query OK, 0 rows affected (0.11 sec)
存储不提供修改 , 需要修改可以删除再重新创建一个存储
存储的优点
- 储存可以反复调用, 不用重复敲代码, 效率高
- 批处理的SQL语句每次运行都需要编译和连接服务器,而存储过程是预编译的,只需要在创建时编译和连接服务器一次,所以速度快一些。
- 系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,使得存储过程更安全。