【Mysql实战】存储过程详解

news2024/11/28 18:44:07

快速入门

创建存储过程

CREATE PROCEDURE p1()

BEGIN
	-- SQL语句
	SELECT count(*) FROM user;
END;

调用存储过程

CALL p1();

查看存储过程

SHOW CREATE PROCEDURE 存储过程名称

删除存储过程

DROP PROCEDURE [ IF EXISTS ] 存储过程名称 ;

入参出参

  • IN:该类参数作为输入,也就是需要调用时传入值

  • OUT:该类参数作为输出,也就是该参数可以作为返回值

  • INOUT:既可以作为输入参数,也可以作为输出参数

创建存储过程

create procedure p4(in score int,out result varchar(12))

BEGIN

	if score >= 85 then
		set result := '优秀';
	elseif score >= 60 then
		set result := '及格';
	else
		set result := '不及格';

	end if;

END;

执行存储过程

call p4(90,@result);

select @result;

构造数据

工具表

create table user
(
    id          bigint unsigned auto_increment comment 'ID'
        primary key,
    code        varchar(64) default '' not null comment '用户编码',
    name        varchar(64) default '' not null comment '用户信息',
    create_time datetime               null comment '创建时间'
) comment '用户表';

存储过程

CREATE PROCEDURE `make_data`()
BEGIN
    DECLARE userId varchar(100);
    DECLARE userName varchar(100);
    DECLARE taskType INTEGER;
    declare taskTypeName varchar(20);
    declare createTime datetime;
    declare startTime datetime;
    declare endTime datetime;
    declare finishTime datetime;
    declare enumVal INTEGER;
    declare enumName varchar(20);
    declare qrcode varchar(20);
    declare num INTEGER;
    declare startIndex INTEGER;
    declare uid INTEGER;
    set createTime = now();
    set startTime = date_sub(now(), interval floor(rand() * 24) hour);
    set endTime = date_add(now(), interval floor(rand() * 24) hour);
    set finishTime = date_add(now(), interval floor(rand() * 12) hour);
    START TRANSACTION;
    SELECT id, name FROM user ORDER BY RAND() LIMIT 1 into userId,userName;
    set taskType = floor(rand() * 10);
    set enumVal = floor(rand() * 3);
    if (taskType < 3) then
        set taskTypeName = 'aaa';
    elseif (taskType < 7) then
        set taskTypeName = 'bbb';
    elseif (taskType < 10) then
        set taskTypeName = 'ccc';
    end if;
    case enumVal
        when 0 then set enumName = 'AA';
        when 1 then set enumName = 'BB';
        when 2 then set enumName = 'CC';
        end case;
    set qrcode = (SELECT LPAD(now(), 10, 0) AS TIME);
    set num = (select count(1) from user where name = qrcode);
    if (num = 0) THEN
        INSERT INTO user (name, code, create_time) VALUES (enumVal, qrcode, now());
        select max(id) from user into uid;
        -- 插入关联表数据
    ELSE
        SET startIndex = startIndex + 1;
    END IF;
    select userId,
           userName,
           taskType,
           taskTypeName,
           createTime,
           startTime,
           endTime,
           finishTime;
END;
  • 通过使用if函数和rand(),taskTypeName可以随机从aaabbbccc中获取;
  • 通过使用case函数和rand()enumVal的取值也是随机的。
  • num存储执行mysql语句的执行结果,可以根据查询到的结果判断是否需要新增数据操作。
  • uid存储了插入user表的主键,可以进行插入关联表的数据
  • 使用SELECT id, name FROM user ORDER BY RAND() LIMIT 1,可以随机查询到user表的任意一条数据。
  • endTimefinishTime是随机的时间段,endTime在当前时间的0-24小时内随机,finishTime在当前时间的0-12小时内随机。

批量插入数据

工具表

-- auto-generated definition
create table app_task
(
    id           bigint auto_increment comment '主键'
        primary key,
    user_id      int               null comment '当前执行人',
    user_name    varchar(24)       null comment '当前执行人名字',
    arrival_time datetime          null comment '到达时间',
    start_time   datetime          null comment '开始时间',
    finish_time  datetime          null comment '完成时间',
    expect_time  datetime          null comment '预计时间',
    create_time  datetime          null comment '创建时间',
    is_delete    tinyint default 0 null comment '0-生效,1-失效'
)
    comment '任务表';

存储过程

CREATE PROCEDURE `batch_insert_data`(
    IN count INTEGER, -- record参数用来传需要插入数据的条数
    IN dt timestamp -- dt参数用来传入时间戳,开始插入的第一条数据的时间(格式为:'2023-05-14 14:31:44')
)
BEGIN
    DECLARE number INTEGER; -- 声明一个number,用来控制循环的次数
    set number = 1; -- 将number的值赋值为1,代表循环从1开始
    START TRANSACTION;
    WHILE number <= count
        DO
            -- 使用while进行循环,满足条件进入循环
            select date_add(dt, interval 1 second) into dt;
            -- 使用date_add()函数将时间进行转换为秒数,并赋值给dt参数
-- 插入数据
            INSERT INTO app_task -- 库名.表名
-- 由于id是自动增长,不需要额外赋值,所以需要将剩余的其他字段全部列出进行一一对应赋值插入
            (user_id,
             user_name,
             arrival_time,
             start_time,
             finish_time,
             expect_time,
             create_time,
             is_delete)
            VALUES (FLOOR(RAND() * 10),
                    2,
                    now(),
                    DATE_FORMAT(CURDATE(),'%Y-%m-%d %H:%i:%s'),
                    DATE_ADD(CURDATE(), INTERVAL 23 HOUR),
                    dt,
                    now(),
                    0);
-- number参数进行自增
            set number = number + 1;
-- dt参数进行自增
            set dt = date_add(dt, interval 1 second);
        end WHILE;
    COMMIT;
END;

使用游标

create procedure use_cursor()
begin

    declare u_name varchar(200);
    declare u_code varchar(200);
    declare u_cursor cursor for select name, code from user where id > 1;
    -- 声明条件处理程序 : 当SQL语句执行抛出的状态码为02000时,将关闭游标u_cursor,并退出
    declare exit handler for SQLSTATE '02000' close u_cursor;
    create table if not exists tb_user
    (
        id     int primary key auto_increment,
        u_name varchar(200),
        u_code varchar(200)
    );
    open u_cursor;
    while true
        do
            fetch u_cursor into u_name,u_code;

            select u_code, u_name;
            insert into tb_user values (null, u_name, u_name);
        end while;
    -- 关闭游标
    close u_cursor;
end;
  • 游标的使用包括游标的声明、OPEN、FETCH 和 CLOSE
  • 游标的使用是为了获取游标指向的数据集。

批量给表添加字段

create procedure batch_add_column(
in database_name varchar(60),
in table_name_match varchar(60)
)

BEGIN

-- 临时变量 TABLE NAME
DECLARE T_NAME VARCHAR(256) DEFAULT NULL;
DECLARE T_SQL VARCHAR(256) DEFAULT NULL;

-- 游标相关 CURSOR TABLE_NAMES
DECLARE C_ALL_TABLE CURSOR FOR SELECT table_name FROM information_schema.TABLES WHERE table_schema = database_name AND table_name REGEXP table_name_match;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET T_NAME = NULL;

OPEN C_ALL_TABLE;
    FETCH C_ALL_TABLE INTO T_NAME;
    WHILE(T_NAME IS NOT NULL) DO
        SET @T_SQL = CONCAT('ALTER TABLE ', T_NAME, ' ADD COLUMN CREATE_TIME datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT \'创建时间\'');
        PREPARE statm FROM @T_SQL;
        EXECUTE statm;
        FETCH C_ALL_TABLE INTO T_NAME;
    END WHILE;
CLOSE C_ALL_TABLE;

END;

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/533018.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于不同处理器的函数调用规则

关于不同处理器的函数调用规则 接前面一篇变长参数调用的记录&#xff0c;这次从原理上进行了进一步研究。 不同调用规则对对于编译出来的汇编影响很大的&#xff0c;这里之前的理解比较粗浅&#xff0c;尤其是一般教科书或者网上能看到的内容都比较老&#xff0c;这里记录一下…

【马蹄集】第十一周作业

第十一周作业 目录 MT2012 竹鼠的白色季节MT2013 照亮街道MT2014 打靶MT2026 二维坐标点移动MT2027 一秒成零 MT2012 竹鼠的白色季节 难度&#xff1a;黄金    时间限制&#xff1a;1秒    占用内存&#xff1a;250M 题目描述 小码哥的竹鼠养殖场中的竹鼠都在一条直线的隔间…

深度学习笔记之递归网络(一)引子:序列模型

深度学习笔记之递归网络——引子&#xff1a;序列模型 引言回顾&#xff1a;齐次马尔可夫假设序列模型序列信息序列数据建模 引言 从本节开始&#xff0c;将介绍递归网络系列。本节将介绍序列模型。 回顾&#xff1a;齐次马尔可夫假设 齐次马尔可夫假设——在隐马尔可夫模型…

LeetCode 124. 二叉树中的最大路径和

124. 二叉树中的最大路径和 描述 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一…

收藏|必读10本pcb设计书籍推荐

1."High-Speed Digital Design: A Handbook of Black Magic"。 作者是Howard Johnson和Martin Graham。这是一本关于高速数字电路设计的优秀教材&#xff0c;适合那些需要设计高速电路的工程师。 作为比较早出来的信号完整性参考书&#xff0c;对国内的信号完整性研…

Apollo与SpringBoot整合原理深度剖析

Apollo与SpringBoot整合原理深度剖析 Spring环境上下文模块Value注解如何完成属性注入application.yml等配置文件加载时机监听环境上下文prepared事件Loader加载配置文件 Apollo与SpringBoot整合原理Value注解的热更新原理 Spring环境上下文模块 Spring Envionment设计如下: 需…

Unlimiformer:一个Transformers输入无限长文本思路和中文长文本摘要上的性能实验

Unlimiformer&#xff1a;一个Transformers输入无限长文本思路和中文长文本摘要上的性能实验 1、前言 在处理长文本输入时&#xff0c;以往方法常采用截断&#xff08;如&#xff1a;max_len512&#xff09;、分块&#xff08;将输入分成多个块&#xff0c;并进行逐块处理&am…

【EasyPoi实战系列】Spring Boot使用EasyPoi实现多Sheet导出 - 第470篇

悟纤&#xff1a;师傅&#xff0c;那个讨人厌的产品又来捣乱了~ &#x1f612; 师傅&#xff1a;哈哈&#xff0c;你又来抱怨老板设定的无休止需求了啊&#xff1f; &#x1f606; 悟纤&#xff1a;没错&#xff0c;这次竟然要求导出多个Sheet&#xff0c;这还能不能好好地活着…

十九、Sleuth整合Zipkin链路跟踪

目录 链路跟踪概述 SpringCloud Sleuth 1、架构图 2、主要概念 2.1、跟踪&#xff1a;Trace (一条完整链路--包含很多span(微服务接口)) 2.2、跨度&#xff1a;Span 2.3、标注&#xff1a;Annotation Sleuth整合Zipkin实现分布式链路跟踪 1、搭建zipkin环境 1.1、下载…

2023年5月中国数据库排行榜:OTO组合回归育新机,华为高斯蓄势待发展雄心

路漫漫其修远兮&#xff0c;吾将上下而求索。 2023年5月的 墨天轮中国数据库流行度排行 火热出炉&#xff0c;本月共有262个数据库参与排名。本月排行榜前十变动较大&#xff0c;可以用一句话概括为&#xff1a;openGauss 立足创新夺探花&#xff1b;华为云GaussDB 云上之争成赢…

单片机设计_室内环境智能监测系统(STM32 OLED ESP8266 DHT11 MQ-2 加湿器)

想要更多项目私wo!!! 一、电路设计 室内环境智能监测系统 主要功能: 1.检测空气温湿度 2.检测光照强度 3.检测烟雾浓度 4.数据显示在手机端和设备OLED屏幕上 5.当空气温度高于设定的阈值时&#xff0c;风扇开启 6.当空气湿度…

【Linux从入门到精通】上下文概念详解

上篇文章&#xff08;进程的基本概念&#xff09;我们讲解了进程后&#xff0c;还留下了一个上下文数据概念还没有解释。本篇文章会对上下文概念进行详解。在理解上下文概念时&#xff0c;同时会引出很多新的概念。我们都会对此进行详细解释&#xff0c;希望本篇文章会对你有所…

7款产品经理必备的交互软件

作为UI/UX设计师&#xff0c;我相信你或多或少接触过很多交互设计软件。 为您整理总结了几款流行的交互软件。如果您在上述交互设计软件中确实存在选择困难&#xff0c;希望通过阅读本文帮助您快速做出正确的选择。 即时设计 即时设计是一款「专业UI设计工具」&#xff0c;不…

redis从零开始(1)----基本类型:string/hash/list

认识redis NoSQL Nosql not only sql&#xff0c;泛指非关系型数据库&#xff0c;与之相对的是RDBMS(Relational Database Management System)&#xff0c;即关系型数据库 关系型数据库&#xff1a;列行&#xff0c;同一个表下数据的结构是一样的。 非关系型数据库&#xff…

企业有必要对三方应用进行安全管控吗?

什么是三方应用&#xff1f; 三方应用是指由第三方开发者创建的软件应用程序&#xff0c;与操作系统或其他主要平台的开发公司无关。这些应用程序通常被设计为在特定平台上运行&#xff0c;并且具有特定的功能或服务&#xff0c;例如社交媒体应用程序、游戏和生产力工具等。 简…

IntersectionObserver“替代”滚动条监听

概要 IntersectionObserver 接口提供了一种异步观察目标元素与其祖先元素或顶级文档视口&#xff08;viewport&#xff09;交叉状态的方法。其祖先元素或视口被称为根&#xff08;root&#xff09;。 当一个 IntersectionObserver 对象被创建时&#xff0c;其被配置为监听根中…

Blender渲染分辨率如何优化设置?这些渲染技巧你要知道!

尽管 Blender不断改进其功能&#xff0c;随着硬件的不断进步而变得越来越复杂&#xff0c;该软件最好的是允许很多人免费试用它。但即使所有人都可以访问&#xff0c;这并不意味着Blender可以克服低端GPU的局限性。 并非所有PC都是平等的&#xff0c;也不是每个3D设计师都可以使…

Aho-Corasick automaton,ac自动机实现

文章目录 写在前面算法概述trie树的构建trie树的节点结构插入P串到trie树中fail指针的创建 搜索过程测试程序 写在前面 原作者的视频讲解链接&#xff1a;[算法]轻松掌握ac自动机_哔哩哔哩_bilibili 原作者的代码实现&#xff1a;data-structure-and-algorithm/aho_corasick.c…

机器视觉表面划痕检测流程

表面缺陷检测常见的检测主要有物体表面的划痕、污渍、缺口、平面度、破损、边框对齐度、物体表面的亮度、皱纹、斑点、孔等。 表面缺陷检测设备凝聚了机器视觉领域的许多技术成果&#xff0c;吸取了许多创新的检测理念&#xff0c;可以与现有生产线无缝对接检测&#xff0c;也…

制定进度计划是成功项目管理的必由之路

项目经理王斌接到一个新项目&#xff0c;与各项目干系人没有建立有效的联系&#xff0c;他们无法了解项目进展情况。甚至连项目团队的参与人员自身对项目整体情况也没有清楚的认识&#xff0c;而只管自己那一部分&#xff0c;整个开发过程完全是一种黑盒模式&#xff0c;项目组…