首页 > 数据库 >MySQL存储过程

MySQL存储过程

时间:2024-12-20 20:20:36浏览次数:4  
标签:存储 -- 0.00 MySQL sec mysql 过程 select

MySQL存储过程

MySQL 存储过程(Stored Procedure)是一组预编译的 SQL 语句,它们存储在数据库中并且可以被重复调用。存储过程帮助简化复杂的 SQL 查询和提高代码复用性,也可以提升性能,因为数据库服务器可以优化存储过程中的 SQL 语句执行。

查看存储过程

mysql> select * from mysql.proc\G

创建存储过程

DELIMITER $$

CREATE PROCEDURE procedure_name (param1 datatype, param2 datatype, ...)
BEGIN
    -- SQL 语句
    SELECT * FROM table_name WHERE column_name = param1;
    -- 更多 SQL 语句
END $$

DELIMITER ;

DELIMITER $$DELIMITER ; 是为了更改 MySQL 命令分隔符,通常默认是 ;,为了能够在存储过程中使用 ; 作为 SQL 语句的结尾,需要临时更改命令分隔符。

CREATE PROCEDURE 用于创建存储过程

procedure_name存储过程的名称

(param1 datatype, param2 datatype, ...)存储过程的参数,参数可以是输入、输出或输入输出类型。

BEGIN ... END 之间是存储过程的 SQL 语句。

MySQL 存储过程支持三种类型的参数,即输入参数、输出参数和输入/输出参数,分别用 IN、OUT 和 INOUT 三个关键字标识。参数的取名不要与数据表的列名相同,否则尽管不会返回出错信息,但是存储过程的 SQL 语句会将参数名看作列名,从而引发不可预知的结果。

无参数的存储过程

mysql> create procedure test()
    -> begin
    -> select * from mysql.user;
    -> end$
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

调用无参数存储过程

mysql> call test();

In参数(传入参数)创建存储过程

输入参数是读取外部变量值,传递给存储过程,在存储过程中修改该参数的值不能被返回。

定义一个存储过程 getOneBook,当输入某书籍 id 后,可以调出对应书籍记录

mysql> delimiter $
mysql> create procedure getbook(in bookid int)
    -> begin
    -> select bid,bname,price from books.books where bid=bookid;
    -> end $
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> call getbook(1);
+-----+-----------------------+-------+
| bid | bname                 | price |
+-----+-----------------------+-------+
|   1 | 网站制作直通车        |    34 |
+-----+-----------------------+-------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Out参数(传出参数)创建存储过程

可以在存储过程中更改OUT参数的值,并将其更改后的新值传递回调用程序。不接受外部传入的数据,仅返回计算之后的值。

out示例:

mysql> create procedure out123(out a int) 
begin 
select a;
set a = (select price from books.books where bid=1); 
select a; 
select * from books.books where price = a; 
end$
Query OK, 0 rows affected (0.00 sec)

mysql> call out123(@a)
    -> $
+------+
| a    |
+------+
| NULL |
+------+
1 row in set (0.00 sec)

+------+
| a    |
+------+
|   34 |
+------+
1 row in set (0.00 sec)

+-----+-----------------------+---------+--------------------------+-------+------------+--------+------------+
| bId | bName                 | bTypeId | publishing               | price | pubDate    | author | ISBN       |
+-----+-----------------------+---------+--------------------------+-------+------------+--------+------------+
|   1 | 网站制作直通车        | 2       | 电脑爱好者杂志社         |    34 | 2004-10-01 | 苗壮   | 7505380796 |
+-----+-----------------------+---------+--------------------------+-------+------------+--------+------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

in+out示例:

 mysql> delimiter %
 mysql> create procedure get_bname(in book_id int,out out_id varchar(255))
     -> begin
     -> select bname into out_id from books where bid=book_id;
     #使用“select  into 变量”的形式对out 参数进行赋值
     -> end %
 mysql> delimiter ;
 mysql> call get_bname(4,@out_id);
 mysql> select @out_id;

inout参数(传入传出参数)创建存储过程

需要数据传入存储过程经过调用计算后,再传出返回值。可当做传入转出参数

定义变量

mysql> set @tto=123;
Query OK, 0 rows affected (0.00 sec)

mysql> select @tto;
+------+
| @tto |
+------+
|  123 |
+------+
1 row in set (0.00 sec)

存储过程变量的使用

局部变量(Local Variables)

局部变量是仅在存储过程或函数内部有效的变量。它们在存储过程的开始部分定义,通常用于存储计算中间结果。

DECLARE variable_name datatype [DEFAULT value];

variable_name:变量名。

datatype:数据类型,如 INTVARCHARDATE 等。

DEFAULT value:可选,初始化变量的值。

局部变量例子

mysql> DELIMITER $$
mysql> create procedure test() 
begin declare id int;
set id = 1; 
select * from database_name.books where bid=id;
end$$
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> call test();
+-----+-----------------------+---------+--------------------------+-------+------------+--------+------------+
| bId | bName                 | bTypeId | publishing               | price | pubDate    | author | ISBN       |
+-----+-----------------------+---------+--------------------------+-------+------------+--------+------------+
|   1 | 网站制作直通车        | 2       | 电脑爱好者杂志社         |    34 | 2004-10-01 | 苗壮   | 7505380796 |
+-----+-----------------------+---------+--------------------------+-------+------------+--------+------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

2. 用户定义的变量(User-Defined Variables)

用户定义的变量是全局性的,可以在会话中使用。这些变量可以在 SQL 查询中跨多个语句传递和使用。它们不需要在存储过程中声明,也不需要使用 DECLARE 语句。

定义和使用用户定义的变量

SET @variable_name = value;
SELECT @variable_name;

在外面定义变量

mysql> set @id=1;
Query OK, 0 rows affected (0.00 sec)

mysql> select @id;l
+------+
| @id  |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

调用

mysql>  create procedure test() begin  select * from database_name.books where bid=@id; end$$
Query OK, 0 rows affected (0.00 sec)

mysql> call test();
+-----+-----------------------+---------+--------------------------+-------+------------+--------+------------+
| bId | bName                 | bTypeId | publishing               | price | pubDate    | author | ISBN       |
+-----+-----------------------+---------+--------------------------+-------+------------+--------+------------+
|   1 | 网站制作直通车        | 2       | 电脑爱好者杂志社         |    34 | 2004-10-01 | 苗壮   | 7505380796 |
+-----+-----------------------+---------+--------------------------+-------+------------+--------+------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

3. 系统变量

系统变量是 MySQL 服务器提供的变量,包含数据库服务器的配置信息和状态信息。你可以在存储过程中读取这些系统变量,但不能直接修改它们。系统变量通常以 @@ 开头。

mysql> select @@global.version
    -> ;
+------------------+
| @@global.version |
+------------------+
| 5.7.38           |
+------------------+
1 row in set (0.00 sec)

循环

1. WHILE 循环

WHILE 循环会在每次迭代前进行条件判断。只有当条件为真时,才会继续执行循环。

语法:
WHILE 条件 DO
    -- 循环体
END WHILE;
示例:使用 WHILE 循环输出 1 到 5 的数字
DELIMITER $$

CREATE PROCEDURE WHILEExample()
BEGIN
    DECLARE counter INT DEFAULT 1;  -- 声明并初始化计数器

    WHILE counter <= 5 DO  -- 当计数器小于等于5时继续循环
        SELECT counter;  -- 输出当前计数器值
        SET counter = counter + 1;  -- 增加计数器的值
    END WHILE;
END $$

DELIMITER ;

2. REPEAT 循环

REPEAT 循环与 WHILE 类似,但它首先执行循环体,然后检查条件。如果条件为真,则继续执行;如果为假,则退出循环。

语法:
REPEAT
    -- 循环体
UNTIL 条件
END REPEAT;
示例:使用 REPEAT 循环输出 1 到 5 的数字
DELIMITER $$

CREATE PROCEDURE REPEATExample()
BEGIN
    DECLARE counter INT DEFAULT 1;  -- 声明并初始化计数器

    REPEAT
        SELECT counter;  -- 输出当前计数器值
        SET counter = counter + 1;  -- 增加计数器的值
    UNTIL counter > 5  -- 当计数器大于5时退出循环
    END REPEAT;
END $$

DELIMITER ;

3.LOOP 循环

LOOP 是一个无限循环,必须在循环体内部手动使用 LEAVE 语句来退出循环。通常用于当你不清楚循环执行次数时使用。

语法:
[标签] LOOP
    -- 循环体
    IF 条件 THEN
        LEAVE 标签;  -- 跳出循环
    END IF;
END LOOP;
示例:使用 LOOP 循环输出 1 到 5 的数字
DELIMITER $$

CREATE PROCEDURE LOOPExample()
BEGIN
    DECLARE counter INT DEFAULT 1;  -- 声明并初始化计数器

    loop_label: LOOP  -- 标签可以帮助标识循环,方便使用 LEAVE 语句跳出循环
        SELECT counter;  -- 输出当前计数器值
        SET counter = counter + 1;  -- 增加计数器的值

        IF counter > 5 THEN  -- 如果计数器大于5,跳出循环
            LEAVE loop_label;
        END IF;
    END LOOP;
END $$

DELIMITER ;

循环控制语句:

  • LEAVE 标签;:跳出循环,结束循环。
  • ITERATE 标签;:跳过当前循环的剩余部分,进入下一次循环。

标签:存储,--,0.00,MySQL,sec,mysql,过程,select
From: https://www.cnblogs.com/cloudwangsa/p/18619922

相关文章

  • MySQL触发器和事务
    MySQL触发器和事务触发器(Trigger)触发器是一种自动化的数据库对象,它在执行特定的SQL操作(如INSERT、UPDATE或DELETE)时被自动触发。它可以在表上定义,并在特定事件发生时执行自定义的SQL语句。触发器的种类和时机在实际使用中,MySQL所支持的触发器有三种:INSERT触发器、UPD......
  • 如何在电脑上安装MYSQL数据库,软件Navicat
    1.电脑上如何按装MYSQL数据库(8.0.40版本)(以windows系统和MYSQL数据库8.0.40版本为例)首先,为了电脑安全的问题,我们可以在Google以及其他浏览器上,进行百度搜索“mysql”以及mysql数据库的官网网址(https://www.mysql.com/)进入界面之后,哇都是英文哈哈,不过没有关系,跟上我的脚步,在页面......
  • Windows Server 2025 中部署云桌面(尤其是涉及到 GPU-P 和 vGPU 技术的配置),以下是详细
    WindowsServer2025中部署云桌面(尤其是涉及到GPU-P和vGPU技术的配置),以下是详细的步骤说明,涵盖了硬件要求、服务配置、以及具体的服务器安装与角色部署过程。1.硬件要求:在部署GPU-P(GPU分配)技术和vGPU技术的Hyper-V环境云桌面时,硬件要求如下:64位处理器,支持以下其......
  • Linux搭建NAS服务器结合海康录像存储
    NAS是NetworkAttachedStorage的缩写,也就是网络附属存储,是一种专门用于提供文件级数据存储服务的设备或系统。以下是NAS的主要特点:独立设备:NAS通常是连接到网络的独立硬件设备,内置硬盘驱动器,可以方便地扩展存储容量。文件共享:它通过网络协议(如SMB、NFS等)为多个客户端提供......
  • 聊一聊坑人的 C# MySql.Data SDK
    聊一聊坑人的C#MySql.DataSDK 一:背景1.讲故事为什么说这东西比较坑人呢?是因为最近一个月接到了两个dump,都反应程序卡死无响应,最后分析下来是因为线程饥饿导致,那什么原因导致的线程饥饿呢?进一步分析发现罪魁祸首是 MySql.Data,这就让人无语了,并且反馈都是升级了MySql.Da......
  • Mysql(三)--事务 & 隔离级别 & MVCC
    什么是数据库事务?数据库事务就是一组数据库操作,要么全部成功要么全部失败。特性事务有四个特性(ACID),并且四个特性都必须要满足:(特性其实也就是特点)原子性(Atomicity):一组操作,要么全部成功、要么全部失败。一致性(Consistency):事务执行前与执行后数据完整性是一致的,没有收到破坏。......
  • mysql批量更新数据库内全部表某个字符串为另外一个字符串
    示例:把指定数据库minex-pms所有表中的project_depart_name字段重庆项目部更改为渝北项目部,不存在project_depart_name字段的表排除掉,使用临时表和sql脚本的方式实现sql脚本:--1.创建实体表来存储需要更新的表名CREATETABLEIFNOTEXISTStables_to_update(table_nam......
  • MySQL 数据插入慢
    问题背景使用MybatiPlus批量插入数据,497条数据居然花费了16264毫秒,完全不可接受!  解决方案 核心mybatis-plus批量插入需要添加rewriteBatchedStatements配置mybatis-plus批量插入的性能受事务的影响  方案一MySQLJDBC驱动在默认情况下会忽视executeBatch......
  • 操作系统-存储管理-C语言
    一、实验内容        主存储器空间的分配和回收。二、实验目的        一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一......
  • Easy Sysprep 是一个专门设计来简化 Sysprep 过程的工具。对于普通用户或管理员来说,Sy
    EasySysprep是一个用来简化Windows操作系统Sysprep(系统准备工具)过程的第三方工具。Sysprep是Microsoft提供的一款工具,通常用于创建可部署的Windows映像,尤其是在进行批量安装或迁移时。EasySysprep通过提供一个更友好的界面,使用户能够更轻松地使用Sysprep功能,尤其是......