首页 > 数据库 >MySQL中的存储过程(详解)

MySQL中的存储过程(详解)

时间:2024-09-17 22:51:28浏览次数:9  
标签:语句 存储 变量 详解 参数 MySQL 过程 name

前言:

在数据库开发中,MySQL 存储过程是一种非常强大的工具,可以提高数据库的性能、可维护性和安全性。本文将介绍 MySQL 存储过程的基本概念、语法和使用方法,并通过一些实际的例子来说明其在数据库开发中的应用。

首先要知道我们为什么要学这个存储过程,因为当我们的SQL语句较为麻烦,而且我们需要根据不同的条件去实现这个逻辑,其他的地方也需要多次使用这个逻辑,那我们在去重复的写就较为麻烦,代码较为冗余,存储过程就很好的解决了这个问题。

注:如果你学过其他语言可能会比较好理解

一、什么是MySQL存储过程?

MySQL存储过程是由一组预先编好的SQL语句,像方法一样可以被重复调用,存储过程可以接收参数,执行复杂的逻辑操作,可以返回结果,是多条sql语句的集合

二、存储过程的语法

MySQL语法如下:

CREATE PROCEDURE proc_name (parameter_list)
BEGIN
    --SQL语句
END;

其中CREATE  PROCEDURE是创建存储过程的关键字,proc_name是我们为这个存储过程起的一个存储过程名称,parameter_list是一些参数,将所需要实现逻辑的SQL语句写在一对BEGINEND里面。

如果你是使用客户端:nacivat等

但是SQL中的语法规定每写完一条SQL语句就要以分号结束,而MySQL默认的也是以分号结束,那就会起冲突,你在存储过程中写完SQL语句之后以分号结束,这个时候就会报错,因为我们要写在一对begin和end中,SQL语句已经结束了,那end就没有执行了。

语法如下:先将默认的结束符号修改为$$或者//

DELIMITER $$
CREATE PROCEDURE proc_name (parameter_list)
BEGIN
    --SQL语句
END$$
DELIMITER ;

如果你使用命令符操作就没有这个问题

三、存储过程的参数

存储过程的参数:

参数也是分类型的,根据不同的需求有不同的参数类型,有输入参数,有输出参数,还有输入输出参数。

输入参数(in):用于向存储过程内传递参数,存储过程内可以使用该参数,但是存储过程内部不可以修改此 参数值,调用

输出参数(out):用于在存储过程中返回数据,在存储过程内部可以修改此参数,调用者可以接收该参数的值

输入输出参数(inout):即可以向存储过程内部传递参数,也可以返回数据,在存储过程可以读取和修改该参数的值

四、调用存储过程

可以使用CALL语句来调用存储过程,

语法:CALL  过程名;

以下是一个存储过程调用的示例:

#例:创建一个存储过程
CREATE PROCEDURE come(in 参数名 数据类型,out 参数名 数据类型)
BEGIN
    --SQL语句
END;

#调用存储过程
CALL come(参数列表);

注意:如果存储过程是带有参数的,声明参数的时候要声明是什么类型的参数,参数的数据类型是什么,在调用此存储过程的时候就必须要传递对应的参数。

五、变量

变量分为系统变量和自定义变量

系统变量:顾名思义就是系统自己的变量

如何查询系统变量呢?

#查看全部系统变量
SHOW variables;
#查看指定关键字的变量
SHOW variables like '%XXXX%';
#查看具体某一个系统的值
SELECT @@系统变量名;

自定义变量:就是我们自己定义的变量,自定义变量又分为会话变量局部变量。

会话变量:声明在连接中,存储过程外的变量叫做会话变量

声明会话变量:使用set关键字声明会话变量

声明
set @变量名 = 值;
set @变量名 := 值;

赋值
set @变量名 = 值;
set @变量名 := 值;

#​也可以使用SELECT INTO语句进行赋值:

#示例
SELECT column_name INTO @variable_name FROM table_name WHERE condition;

​

注意:= 赋值运算符也是用于在存储过程或函数中设置变量的,但在 MySQL 的上下文中,它不是用于直接声明变量,而是用于在 SQL 语句中赋值

我们说在MySQL中”=“有两种用法,即可以做比较运算符,也可以做赋值运算符

而":="只有一种用法就是赋值,这两个都可以赋值,看你想要使用哪个

局部变量:定义在存储过程内部的变量

#声明
declare 变量名 数据类型;
declare 变量名 数据类型 default 值;

#赋值
set 变量名 = 值;
set 变量名 := 值;
select 变量名 := 值;
select 字段名 into 变量名 from 表名;

注意:声明变量的语句必须是存储过程体中的第一行语句. 声明变量的语句必须是存储过程体中的第一行语句.

六、存储过程示例

假设我们要创建一个存储过程,该存储过程接受一个 user_id 参数,并返回该用户的名字和年龄。

DELIMITER //

CREATE PROCEDURE GetUserInfo(IN user_id INT, OUT user_name VARCHAR(100), OUT user_age INT)
BEGIN
    SELECT name, age INTO user_name, user_age
    FROM users
    WHERE id = user_id;
END //

DELIMITER ;

说明:

  • DELIMITER // 和 DELIMITER ; 用于更改和恢复默认的语句分隔符,以允许存储过程中的多行语句。
  • IN user_id INT 是输入参数,用于传递 user_id
  • OUT user_name VARCHAR(100) 和 OUT user_age INT 是输出参数,用于返回用户的信息。
  • SELECT ... INTO 用于将查询结果存储到输出参数中。
    -- 声明用于接收输出的变量
    SET @name = '';
    SET @age = 0;
    
    -- 调用存储过程
    CALL GetUserInfo(1, @name, @age);
    
    -- 查看输出结果
    SELECT @name AS UserName, @age AS UserAge;

七、使用存储过程的好处:

  1. 提高性能:存储过程在数据库服务器上预先编译好,执行时不需要再次编译,因此可以提高执行效率。
  2. 可维护性:存储过程可以将复杂的业务逻辑封装在一个独立的单元中,便于维护和修改。
  3. 安全性:存储过程可以限制用户对数据库的直接访问,提高数据库的安全性。
  4. 代码复用:存储过程可以被多个应用程序调用,提高代码的复用性。

总结:

MySQL 存储过程是一种非常强大的数据库编程工具,可以提高数据库的性能、可维护性和安全性。本文介绍了 MySQL 存储过程的基本概念、语法和使用方法,并通过一些实际的例子来说明其在数据库开发中的应用。在实际应用中,可以根据具体的需求来选择是否使用存储过程,并合理地设计存储过程的结构和功能,以提高数据库的性能和可维护性。

标签:语句,存储,变量,详解,参数,MySQL,过程,name
From: https://blog.csdn.net/2401_85419489/article/details/142304271

相关文章

  • [MySQL]编码转换
    在MySQL中,存储的编码格式与读取的编码格式是可以不同的。如果你的表中存储的是UTF-8编码的数据,但客户端想要以GBK编码来读取数据,可以通过调整MySQL的字符集设置来实现。以下是几种常见的解决方案:1.设置客户端连接的字符集MySQL提供了在客户端和服务器之间指定字符集的......
  • [官翻]mysqlbackup的乐观备份
    乐观备份可以用来提升备份和恢复体量比较大的数据库(只有少量的表经常变更)的性能。2)在大型数据库的热备份过程中(例如,以TB为单位),当备份进行时,可能会在服务器上生成巨大的重做日志文件。由于重做日志文件的增长速度快于mysqlbackup处理的速度,因此当mysqlbackup无法赶上重做日志周期,并......
  • 存储论——经济订货批量模型精解
    运筹学中的存储问题主要研究如何通过优化库存管理,确保在满足需求的同时,尽可能降低与库存相关的成本。这一问题在生产制造、物流运输、仓储等各个领域具有重要应用。核心目标是通过合理规划进货、存货和出货策略,实现成本最小化和资源的高效利用。在实际应用中,由于需求的不确定性、......
  • [MySQL]深分页优化
    limit深分页为什么会变慢?先看下表结构:CREATE TABLE account (  id int(11) NOT NULL AUTO_INCREMENT COMMENT '主键Id',  name varchar(255) DEFAULT NULL COMMENT '账户名',  balance int(11) DEFAULT NULL COMMENT '余额',  create_time date......
  • php开启pdo与pdo_mysql扩展模块的方法
    在Windows服务器中启用PHP的PDO(PHPDataObjects)和PDO_MySQL扩展模块的方法如下:步骤1:定位 php.ini 文件找到 php.ini 文件:通常,php.ini 文件位于PHP安装目录中,例如 C:\xampp\php(如果是XAMPP环境)或者其他PHP安装路径下。如果不确定 php.ini 文件的位置,可以在PHP脚本......
  • 安装php的mysqli扩展
    安装和启用PHP的mysqli扩展通常取决于你的操作系统和PHP环境。下面分别介绍在不同环境下的操作方法:Windows环境找到 php.ini 文件:通常 php.ini 文件位于PHP安装目录中,例如 C:\xampp\php(如果是XAMPP环境)或者其他PHP安装路径下。如果不确定 php.ini 文件的位置,可以在......
  • SQLSTATE[HY000] [2013] Lost connection to MySQL server at 'reading initial commu
    错误信息 SQLSTATE[HY000][2013]LostconnectiontoMySQLserverat'readinginitialcommunicationpacket',systemerror:111 翻译成中文为:在读取初始化数据包时失去到MySQL服务器的连接,系统错误111。通讯包初始化失败,估计是不允许连接访问引起的。解决办法以下是......
  • 基于SpringBoot+Vue+MySQL的网上租赁系统
    系统展示用户前台界面管理员后台界面系统背景  在当前共享经济蓬勃发展的背景下,网上租赁系统作为连接租赁双方的重要平台,正逐步改变着人们的消费观念和生活方式。通过构建一个基于SpringBoot、Vue.js与MySQL的网上租赁系统,我们旨在为用户提供便捷、高效、安......
  • 基于SpringBoot+Vue+MySQL的在线视频教育平台
    系统展示用户前台界面管理员后台界面系统背景  随着信息技术的飞速发展和互联网普及率的不断提高,传统教育模式正面临深刻变革。在线视频教育平台作为数字化教育的重要载体,以其灵活性强、资源丰富、覆盖广泛等优势,逐渐成为人们获取知识、提升技能的新途径。......
  • [C/C++]图的存储
    一、图的存储方式   图的存储主要分为五类:邻接矩阵、边集数组、邻接表、链式邻接表、链式前向星。1.邻接矩阵    用二维数组w[u][v]表示从u到v的边权    时间复杂度:O(n^2)    空间复杂度:O(n^2)1.模板//图的存储for(inti=1;i<=m;++i){......