1. 存储过程总结

存储过程是一种存储在数据库中的程序。它可以包含多个 SQL 语句,并提供许多过程语言的功能,例如变量定义、条件控制语句、循环语句、游标以及异常处理等。

1.1 存储过程优点

  • 实现代码的重用和管理性。存储过程创建后可以在被重复调用,不同的应用可以共享相同的存储过程;
  • 实现业务的封装和隔离。应用程序通过接口访问存储过程,而不关系具体实现;当业务发生变化时,只需要修改存储过程的逻辑,但对应用程序源代码却毫无影响
  • 提高应用的执行效率。存储过程经过编译之后存储在数据库中,执行时可以进行缓存,可以提高执行的速度;
  • 减少了应用与数据库之间的网络流量。调用存储过程时,只需要传递参数,在一定程度上可以减轻网络负担;
  • 存储过程可以提高安全性。应用程序通过存储过程进行数据访问,而不需要直接访问数据表,保证数据的安全。

1.2 存储过程缺点

  • 不同数据库的实现不同。Oracle 中称为 PL/SQL,MySQL 中称为 PSM,其他数据库也都有各自的语法实现;
  • 存储过程需要占用数据库服务器的资源,包括 CPU、内存等,而数据库的扩展性不如应用程序;
  • 存储过程的开发和维护需要专业的技能,存储过程的调试不如其他编程语言方便。

2. 创建存储过程

2.1 默认分隔符

默认的 MySQL 语句分隔符为 ;
mysql 命令行实用程序也使用 ; 作为语句分隔符。如果命令行实用程序要解释存储过程自身内的 ; 字符,则它们最终不会成为存储过程的成分,这会使存储过程中的SQL 出现句法错误。

解决办法是临时更改命令行实用程序的语句分隔符,如下所示:

DELIMITER  //
....
DELIMITER  ;

其中,DELIMITER // 告诉命令行实用程序使用 // 作为新的语句结束分隔符,可以看到标志存储过程结束的 END 定义为 END // 而不是 END;。这样,存储过程体内的 ; 仍然保持不动,并且正确地传递给数据库引擎。最后,为恢复为原来的语句分隔符,可使用 DELIMITER ;

\ 符号外,任何字符都可以用作语句分隔符

2.2 创建存储过程

mysql> CREATE PROCEDURE productpricing()-> BEGIN->  SELECT AVG(prod_price) AS price_average->  FROM products;-> END;
Query OK, 0 rows affected

此存储过程名为 productpricing,用 CREATE PROCEDURE productpricing() 语句定义。如果存储过程接受参数,它们将在 () 中列举出来。此存储过程没有参数,但后跟的 () 仍然需要。BEGINEND 语句用来限定存储过程体。

3. 调用过程

SQL 使用 CALL 命令调用存储过程,大部分数据库遵循该标准。

mysql> CALL productpricing();
+---------------+
| price_average |
+---------------+
| 16.133571     |
+---------------+
1 row in set

4. 删除存储过程

使用 DROP PROCEDURE 语句可以从数据库中删除存储过程。存储过程在创建之后,被保存在服务器上以供使用,直至被删除。

mysql> DROP PROCEDURE IF EXISTS productpricing;
Query OK, 0 rows affectedmysql> CALL productpricing();
1305 - PROCEDURE aaa.productpricing does not exist

5. 带参数的存储过程创建和调用

5.1 创建存储过程

productpricing 只是一个简单的存储过程,它简单地显示 SELECT 语句的结果。一般,存储过程并不显示结果,而是把结果返回给你指定的变量。

变量(variable)内存中一个特定的位置,用来临时存储数据。

mysql> CREATE PROCEDURE productpricing(->      OUT min_price DECIMAL(8,2),->        OUT max_price DECIMAL(8,2),->        OUT avg_price DECIMAL(8,2)-> )-> BEGIN->       SELECT min(prod_price) INTO min_price FROM products;->       SELECT max(prod_price) INTO max_price FROM products;->       SELECT avg(prod_price) INTO avg_price FROM products;-> END;
Query OK, 0 rows affected

此存储过程接受 3 个参数:min_price 存储产品最低价格,max_price 存储产品最高价格,avg_price 存储产品平均价格。每个参数必须具有指定的类型,这里使用十进制值。

关键字 OUT 指出相应的参数用来从存储过程传出一个值(返回给调用者)。

MySQL 支持 IN(传递给存储过程)、OUT(从存储过程传出,如这里所用)和INOUT(对存储过程传入和传出)类型的参数。存储过程的代码位于 BEGINEND 语句内,如前所见,它们是一系列 SELECT 语句,用来检索值,然后保存到相应的变量(通过指 INTO 关键字)。

5.2 调用存储过程

mysql> CALL productpricing(@price_min, @price_max, @price_avg);
Query OK, 1 row affected

由于此存储过程要求 3 个参数,因此必须正好传递 3 个参数,不多也不少。所以,这条 CALL 语句给出 3 个参数。它们是存储过程将保存结果的 3 个变量的名字。

变量名 所有 MySQL 变量都必须以 @开始。

在调用时,这条语句并不显示任何数据。它返回以后可以显示(或在其他处理中使用)的变量。

5.3 显示存储过程结果

mysql> SELECT @price_min, @price_max, @price_avg;
+------------+------------+------------+
| @price_min | @price_max | @price_avg |
+------------+------------+------------+
| 2.50       | 55.00      | 16.13      |
+------------+------------+------------+
1 row in setmysql>

6. 同时携带 IN 和 OUT 参数的存储过程

6.1 创建存储过程

mysql> CREATE PROCEDURE ordertotal(->      IN  order_number INT,->      OUT total_price DECIMAL(8,2)-> )-> BEGIN->         SELECT sum(item_price * quantity) FROM orderitems WHERE order_num = order_number INTO total_price;-> END;
Query OK, 0 rows affectedmysql>

order_number 定义为 IN,因为订单号被传入存储过程。
total_price 定义为 OUT,因为要从存储过程返回合计。
SELECT 语句使用这两个参数,WHERE 子句使用 order_number 选择正确的行,INTO 使用 total_price 存储计算出来的合计。

6.2 调用存储过程

必须给 ordertotal 传递两个参数;第一个参数为订单号,第二个参数为包含计算出来的合计的变量名。

mysql> CALL ordertotal(20005, @total_price);
Query OK, 1 row affectedmysql> SELECT @total_price;
+--------------+
| @total_price |
+--------------+
| 149.87       |
+--------------+
1 row in setmysql>

查询另外一个订单

mysql> CALL ordertotal(20006, @total_price);SELECT @total_price;
Query OK, 1 row affected+--------------+
| @total_price |
+--------------+
| 55.00        |
+--------------+
1 row in setmysql>

7. 检查存储过程

为显示用来创建一个存储过程的 CREATE 语句,使用 SHOW CREATE PROCEDURE 语句:

mysql> SHOW CREATE PROCEDURE ORDERTOTAL;
+------------+----------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| Procedure  | sql_mode                                                       | Create Procedure                                                                                                                                                                                                           | character_set_client | collation_connection | Database Collation |
+------------+----------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| ordertotal | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` PROCEDURE `ordertotal`(IN  order_number INT,OUT total_price DECIMAL(8,2))
BEGINSELECT sum(item_price * quantity) FROM orderitems WHERE order_num = order_number INTO total_price;END | utf8                 | utf8_general_ci      | utf8_general_ci    |
+------------+----------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
1 row in setmysql>

MySQL 学习笔记(6)— 存储过程创建、调用、删除以及带参数的存储过程相关推荐

  1. mysql 9.0创建数据库_PHP与MySQL学习笔记9:创建Web数据库

    1.在服务器上部署MySQL服务基本步骤合注意点 1)安装MySQL(命令安装.安装包安装等) 2)考虑是否需要一个独立的操作系统用户权限来运行MySQL程序. 3)路径的设置 4)root密码 (附 ...

  2. MySQL学习笔记——数据库的创建、修改与删除

    目录 一.数据库的创建和管理 1.基础知识 1.1 数据储存过程 1.2 标识符的命名规则 1.3 MySQL中的数据类型: 2.创建和管理数据库 2.1 创建数据库 2.2 管理数据库 2.3 修改 ...

  3. 小白终是踏上了这条不归路----小文的mysql学习笔记(22)--------函数

    ** 小白终是踏上了这条不归路----小文的mysql学习笔记(1) 小白终是踏上了这条不归路----小文的mysql学习笔记(2)----条件查询 小白终是踏上了这条不归路----小文的mysql学 ...

  4. MySQL学习笔记(2)——存储过程与存储函数

    MySQL学习笔记(2)--存储过程与存储函数 文章目录 MySQL学习笔记(2)--存储过程与存储函数 一.存储过程 1.概念:预先编译好的sql语句的集合,理解成批处理语句 2.好处: 3.语法: ...

  5. MySQL学习笔记 | 05 - 普通用户新增、删除、授权、撤销登录权限

    MySQL学习笔记 | 01-为什么要使用数据库 MySQL学习笔记 | 02 - MySQL在Windows下的安装.配置.服务启动/停止.用户登录.查看版本号 MySQL学习笔记 | 03 - M ...

  6. MySQL学习笔记 | 04 - MySQL数据库基本操作(增加、修改、删除、查看)

    MySQL学习笔记 | 01-为什么要使用数据库 MySQL学习笔记 | 02 - MySQL在Windows下的安装.配置.服务启动/停止.用户登录.查看版本号 MySQL学习笔记 | 03 - M ...

  7. MySQL 学习笔记②

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/BV1Kr4y1i7ru 资料链接 ...

  8. 献给入门小白的MySQL学习笔记+案例

    MySQL学习笔记 目录 MySQL学习笔记 1.SQL概述 1.1:数据库的好处 1.2:数据库管理系统 1.3:SQL语言概述 1.4:SQL语言的分类 2.安装与使用 2.1:MySql数据库产 ...

  9. 数据库MySQL学习笔记高级篇(周阳)

    数据库MySQL学习笔记高级篇 1. mysql的架构介绍 mysql简介 高级Mysql mysqlLinux版的安装 mysql配置文件 mysql逻辑架构介绍 mysql存储引擎 2. 索引优化 ...

最新文章

  1. NClay.MVC是MVP?
  2. PW Live 直播 | 清华大学王晓智:事件抽取的进展与挑战
  3. css画带边框三角形,纯CSS画三角形(带边框)
  4. Why Apache Spark is a Crossover Hit for Data Scientists [FWD]
  5. 远离ARP*** ARP防火墙新版发布
  6. Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(转)
  7. ADO 连接数据库的几种方式
  8. uni-app中text文本组件的基本使用
  9. swift4.1 系统学习十 函数
  10. http协议学习系列(转)
  11. java爬虫教程:模拟用户表单登录
  12. 电机驱动芯片——DRV8833、TB6612、A4950、L298N的详解与比较
  13. 在MinGW中构建GCC交叉编译器和GDB交叉调试器
  14. 纪念盘古工坊开发的一款手机游戏正式发布
  15. 神经网络中epoch、batch、batch_size、epoch、iteration理解
  16. 激活后服务器无限重启,服务器无限重启
  17. 学习笔记 | 演化简单的程序用于玩 Atari 游戏
  18. 【word使用】word文档查看字符统计
  19. 混杂模式就安全了?--只谈配置混杂模式
  20. web应用测试的具体流程(等保测评相关)

热门文章

  1. 快起床刷题去,别人把你offer拿走啦
  2. 兔子生兔子递归的理解
  3. Redis 笔记(11)— 文本协议 RESP(单行、多行字符串、整数、错误、数组、空值、空串格式、telnet 登录 redis)
  4. 2022-2028年中国金属薄膜行业市场深度监测及投资潜力研究报告
  5. OpenCV 笔记(06)— Mat 结构、像素值存储方法、创建 Mat 对象各种方法、Mat 对象的运算
  6. 从 SGD 到 Adam —— 深度学习优化算法概览 各种优化器 重点
  7. MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)
  8. 77GHz 和24GHz Radar性能解析
  9. 自监督学习(Self-Supervised Learning)多篇论文解读(上)
  10. CVPR目标检测与实例分割算法解析:FCOS(2019),Mask R-CNN(2019),PolarMask(2020)