自学内容网 自学内容网

在MySQL中使用存储过程

目录

1、存储过程概述

(1)概述

(2)优点

(3)缺点

2、MySQL中存储过程的定义(创建)

3、使用MySQL的存储过程

(1)定义存储过程(函数)

(2)执行存储过程(函数) 

4、存储过程的管理

(1)显示存储过程

(2)显示特定数据库的存储过程

(3)显示特定模式的存储过程

(4)显示存储过从的源码

(5)删除存储过程

5、小结


博主用的是mysql8 DBMS,附上示例资料:

百度网盘链接: https://pan.baidu.com/s/1XaWi3Y7hpXbs_uHq2cPI6Q

提取码: fpnx

1、存储过程概述

(1)概述

由MySQL5.0 版本开始支持存储过程。

如果在实现用户的某些需求时,需要编写一组复杂的SQL语句才能实现的时候,那么我们就可以将这组复杂的SQL语句集提前编写在数据库中,由DBMS调用来执行这组SQL语句。编写在数据库中的SQL语句集称为存储过程。

存储过程:(PROCEDURE)

是事先经过编译并存储在数据库中的一段SQL语句的集合。调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是很有好处的。就是数据库 SQL 语言层面的代码封装与重用。

存储过程就类似于Java中的方法,需要先定义,使用时需要调用。存储过程可以定义参数,参数分为IN、OUT、INOUT三种类型。

  • IN类型的参数表示接受调用者传入的数据;
  • OUT类型的参数表示向调用者返回数据;
  • INOUT类型的参数即可以接受调用者传入的参数,也可以向调用者返回数据

(2)优点

  1. 存储过程是通过处理封装在容易使用的单元中,简化了复杂的操作。
  2. 简化对变动的管理。如果表名、列名、或业务逻辑有了变化。只需要更改存储过程的代码。使用它的人不用更改自己的代码。
  3. 通常存储过程都是有助于提高应用程序的性能。当创建的存储过程被编译之后,就存储在数据库中。但是,MySQL实现的存储过程略有所不同。MySQL存储过程是按需编译。在编译存储过程之后,MySQL将其放入缓存中。MySQL为每个连接维护自己的存储过程高速缓存如果应用程序在单个连接中多次使用存储过程,则使用编译版本,否则存储过程的工作方式类似于查询
  4. 存储过程有助于减少应用程序和数据库服务器之间的流量。因为应运程序不必发送多个冗长的SQL语句,只用发送存储过程中的名称和参数即可。
  5. 存储过程度任何应用程序都是可重用的和透明的。存储过程将数据库接口暴露给所有的应用程序,以方便开发人员不必开发存储过程中已支持的功能。
  6. 存储的程序是安全的。数据库管理员是可以向访问数据库中存储过程的应用程序授予适当的权限,而不是向基础数据库表提供任何权限。

(3)缺点

  1. 如果使用大量的存储过程,那么使用这些存储过程的每个连接的内存使用量将大大增加。此外,如果在存储过程中过度使用大量的逻辑操作,那么CPU的使用率也在增加,因为MySQL数据库最初的设计就侧重于高效的查询,而不是逻辑运算。
  2. 存储过程的构造使得开发具有了复杂的业务逻辑的存储过程变得困难。
  3. 很难调试存储过程。只有少数数据库管理系统允许调试存储过程。不幸的是,MySQL不提供调试存储过程的功能。
  4. 开发和维护存储过程都不容易。开发和维护存储过程通常需要一个不是所有应用程序开发人员拥有的专业技能。这可能导致应用程序开发和维护阶段的问题
  5. 对数据库依赖程度较高,移值性差。

2、MySQL中存储过程的定义(创建)

DELIMITER //

CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    PROCEDURE 数据库名.存储过程名([in变量名 类型,out 参数 2,...])
    /*LANGUAGE SQL
    | [NOT] DETERMINISTIC
    | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    | SQL SECURITY { DEFINER | INVOKER }
    | COMMENT 'string'*/
BEGIN
[DECLARE 变量名 类型 [DEFAULT 值];]
存储过程的语句块;
END //

DELIMITER ;
  • DELIMITER //:将语句结束符从分号 ; 更改为 //,因为在存储过程中可能包含多个语句,每个语句默认以分号结束,这会导致存储过程在创建过程中提前结束。使用 DELIMITER // 可以让 MySQL 知道存储过程的结束位置是 //

  • CREATE PROCEDURE XXXX(OUT XX INT):创建一个名为 XXXX的存储过程,它有一个输出参数 XX,类型为 INT。参数可有多个,类型可为IN, OUT, INOUT中的一个

  • BEGIN:存储过程的开始。

  • DECLARE XX INT;:声明一个局部变量 XX,类型为 INT,可指定默认值;DECLARE用于声明变量,SET XX = 用于变量赋值

  • END //:存储过程的结束。

  • DELIMITER ;:将语句结束符恢复为分号。

3、使用MySQL的存储过程

 对邮件发送清单中具有邮件地址的顾客进行计数

(1)定义存储过程(函数)

--  对邮件发送清单中具有邮件地址的顾客进行计数
DELIMITER //
CREATE 
PROCEDURE MailingListCount(OUT ListCount INT)
BEGIN
DECLARE v_rows INT;

SELECT COUNT(*) INTO v_rows
FROM customers
WHERE cust_email IS NOT NULL;

SET ListCount = v_rows;
END //
DELIMITER ;

(2)执行存储过程(函数) 

CALL MailingListCount(@ListCount);
SELECT @ListCount AS ListCount;

4、存储过程的管理

(1)显示存储过程

SHOW PROCEDURE STATUS;

 

(2)显示特定数据库的存储过程

使用where子句过滤,这里过滤数据库名或者存储过程名

SHOW PROCEDURE STATUS 
WHERE db = 'sql-learn'
 OR NAME = 'MailingListCount';

(3)显示特定模式的存储过程

SHOW PROCEDURE STATUS 
WHERE NAME LIKE '%Ma%';

(4)显示存储过从的源码

SHOW CREATE PROCEDURE MailingListCount;

(5)删除存储过程

DROP PROCEDURE MailingListCount;

5、小结

  1. 存储过程就是数据库SQL语言层面的代码封装和重用,其实就是SQL语言中的函数
  2. 存储过程接收三种类型的参数:IN, OUT, INOUT
  3. 详细介绍了创建存储过程的语法,执行存储过程的语法
  4. DBMS支持对存储过程的增删改查的管理
  5. 未介绍存储过程中的条件控制和循环,遇到再现学吧
  6. 后端也可调用存储过程

原文地址:https://blog.csdn.net/i_cant_qiao_chu/article/details/145200457

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!