mysql这就是存储

什么是存储

存储过程(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语句每次运行都需要编译和连接服务器,而存储过程是预编译的,只需要在创建时编译和连接服务器一次,所以速度快一些。
  • 系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,使得存储过程更安全。

猜你喜欢

转载自blog.csdn.net/weixin_43705953/article/details/107550164