MySQL 存储过程原理理解以及存储过程的优点缺点

一、存储过程的介绍

MySQL数据库存储过程是一组为了完成特定功能的SQL语句的集合。

存储过程这个功能是从5.0版本才开始支持的,它可以加快数据库的处理速度,增强数据库在实际应用中的灵活性。

存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。

当需要使用该存储过程时,只需要调用它即可。

操作数据库的传统SQL语句在执行时需要先编译,然后再去执行,跟存储过程一对比,明显存储过程在执行上速度更快,效率更高。

存储过程就像是将提前编译好的函数放到后端服务器上,后端服务器只需要知道每个存储过程是做什么用的,该如何调用,如何传参,传参的类型是什么类型,将前端传来的参数按指定的类型填到存储过程中去就可以了,大大提高数据的传输速率和安全性。

二、存储过程的优点和缺点

1、存储过程的优点

1)存储过程执行一次后,生成的二进制代码就驻留在缓冲区,之后如果再次调用的话,将直接调用二进制代码,使得存储过程的执行效率和性能得到大幅提升
2)存储过程是 SQL语句加上控制语句的集合,有很强的灵活性,可以完成复杂的运算。
3)存储过程存储在服务器端,客户端调用时,直接在服务器端执行,客户端只是传输的调用语句,从而可以降低网络负载
4)存储过程被创建后,可以多次重复调用,它将多条SQL封装到了一起,可随时针对SQL语句进行修改,不影响调用它的客户端
5)存储过程可以完成所有的数据库操作,也可以通过编程的方式控制数据库的信息访问权限

2、存储过程的缺点

1)存储过程直接在数据库运行,可能对数据库服务器的性能有一定的要求。
2)不同厂商的数据库,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程
3)存储过程的性能,受限于各种数据库系统
4)可移植性差,调优麻烦。

三、存储过程创建和调用

1、存储过程创建的格式
  • DELIMITER ??

将语句的结束符号从分号;临时改为两个??(可以是自定义)

默认情况下,存储过程和默认数据库相关联,如果想指定存储过程创建在某个特定的数据库下,那么在过程名前面加数据库名做前缀。

在定义过程时,使用 DELIMITER ?? 命令将语句的结束符号从分号 ; 临时改为两个 ??,使得过程体中使用的分号被直接传递到服务器,而不会被 MySQL 解释。

  • CREATE PROCEDURE 或 FUNCTION 函数名()

创建一个存储过程或者存储过程函数,函数名字可以自己定义但是后面要有(),()里可以用来传参。

  • BEGIN … END

存储过程开始和结束符号,以begin开始,以end结束(可嵌套)。存储过程体包含了在过程调用时必须执行的语句。
注意:每个嵌套块及其中的每条语句,必须以分号结束,表示过程体结束的begin-end块(又叫做复合语句compound statement),则不需要分号。

  • ??

表示存储过程创建完毕,自定义得符号。

  • DELIMITER ;

将语句的结束符号恢复为分号,分号前面有一个空格不能省略。

2、创建一个简单存储过程

使用存储过程输出一个数

mysql> delimiter ??
mysql> create procedure jia()
    -> begin
    -> select 55;
    -> end
    -> ??
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
3、使用一个存储过程
  • 使用存储过程语法结构
    CALL 存储过程名();
    用call和你过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数。
mysql> call jia();
+----+
| 55 |
+----+
| 55 |
+----+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
4、查询创建得存储过程
  • 查看存储过程语法结构
    SHOW PROCEDURE STATUS

MySQL5.6只会显示自己创建的存储过程

mysql> show procedure status;

+--------+--------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db     | Name   | Type      | Definer        | Modified            | Created             | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+--------+--------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| shcool | in_ta  | PROCEDURE | root@localhost | 2020-10-16 10:57:47 | 2020-10-16 10:57:47 | DEFINER       |         | utf8                 | utf8_general_ci      | utf8_general_ci    |
| shcool | jia    | PROCEDURE | root@localhost | 2020-10-20 15:10:50 | 2020-10-20 15:10:50 | DEFINER       |         | utf8                 | utf8_general_ci      | utf8_general_ci    |
| shcool | shuchu | PROCEDURE | root@localhost | 2020-10-20 15:08:54 | 2020-10-20 15:08:54 | DEFINER       |         | utf8                 | utf8_general_ci      | utf8_general_ci    |
+--------+--------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
3 rows in set (0.00 sec)

MySQL5.7会显示系统所有的存储过程

mysql> show procedure status;
......省略部分信息
mysql> CREATE TEMPORARY TABLE t1 (id INT PRIMARY KEY);
 Query OK, 0 rows affected (0.00 sec)
 
 mysql> CALL sys.table_exists('db1', 't1', @exists); SELECT @exists;
 Query OK, 0 rows affected (0.00 sec)
 
 +------------+
 | @exists    |
 +------------+
 | TEMPORARY  |
 +------------+
 1 row in set (0.00 sec)
......省略部分信息
  • 查看某一个存储过程语法结构
    SHOW CREATE PROCEDURE|FUNCTION 存储过程名
    直接使用存储过程得名字就可以
mysql> show create procedure jia;
+-----------+--------------------------------------------+--------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| Procedure | sql_mode                                   | Create Procedure                                                         | character_set_client | collation_connection | Database Collation |
+-----------+--------------------------------------------+------------------------------------------------------+----------------------+----------------------+--------------------+
| jia       | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` PROCEDURE `jia`()
begin
select 55;
end | utf8                 | utf8_general_ci      | utf8_general_ci    |
+-----------+--------------------------------------------+--------------------------------------------------------------------------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)
  • 查询某个库的存储过程语法结构

SHOW PROCEDURE STATUS WHERE DB=‘数据库名’;

mysql> show procedure status where db='shcool';
+--------+--------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db     | Name   | Type      | Definer        | Modified            | Created             | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+--------+--------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| shcool | in_ta  | PROCEDURE | root@localhost | 2020-10-16 10:57:47 | 2020-10-16 10:57:47 | DEFINER       |         | utf8                 | utf8_general_ci      | utf8_general_ci    |
| shcool | jia    | PROCEDURE | root@localhost | 2020-10-20 15:10:50 | 2020-10-20 15:10:50 | DEFINER       |         | utf8                 | utf8_general_ci      | utf8_general_ci    |
| shcool | shuchu | PROCEDURE | root@localhost | 2020-10-20 15:08:54 | 2020-10-20 15:08:54 | DEFINER       |         | utf8                 | utf8_general_ci      | utf8_general_ci    |
+--------+--------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
3 rows in set (0.00 sec)

猜你喜欢

转载自blog.csdn.net/wulimingde/article/details/109109573