存储过程为什么使用DELIMITER $$,存储过程的详细运用解释

2024-01-25 23:04

本文主要是介绍存储过程为什么使用DELIMITER $$,存储过程的详细运用解释,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这是正确的存储过程写法,可以成功执行,相比较上图的报错,增加了DELIMITER,简单解释下这个命令的用途,在MySQL中每行命令都是用“;”结尾,回车后自动执行,在存储过程中“;”往往不代表指令结束,马上运行,而DELIMITER原本就是“;”的意思,因此用这个命令转换一下“;”为"$$",这样只有收到"$$"才认为指令结束可以执行

delimiter就是告诉mysql解释器,该段命令是否已经结束了,是否可以执行了。
默认情况下,delimiter是分号;,遇到分号就执行。


后面的双美元符号 就是告诉mysql,遇到双美元符号再执行

这改变了MySQL命令的默认分隔符,使得存储过程中可以包含多个SQL语句。

-- 定义分隔符:`DELIMITER`。这改变了MySQL命令的默认分隔符,
-- 使得存储过程中可以包含多个SQL语句。
DELIMITER $$-- 选择数据库meteorological:USE `meteorological`。
-- 这指示MySQL使用名为meteorological的数据库。
USE `meteorological`$$-- **删除如果已存在的存储过程**:DROP PROCEDURE IF EXISTS `StatisticsForDay1`。
如果存储过程`StatisticsForDay1`已经存在,则删除它。
DROP PROCEDURE IF EXISTS `StatisticsForDay1`$$-- ∗∗创建存储过程∗∗:CREATE DEFINER=`root@`%` PROCEDURE `StatisticsForDay1`()
CREATE DEFINER=`root`@`%` PROCEDURE `StatisticsForDay1`()BEGIN
-- **声明变量∗∗:声明了两个变量,sql_str用于存储SQL语句,
-- `CURDATE`用于存储当前日期减去一天的值。DECLARE sql_str VARCHAR(1000);DECLARE CURDATE VARCHAR(10);
-- ∗∗获取昨天的日期∗∗:使用‘SELECT DATE_ADD(CURRENT_DATE,INTERVAL −1 DAY)INTO CURDATE;
-- ‘获取昨天的日期,并将其存储在变量‘CURDATE‘中。SELECT DATE_ADD(CURRENT_DATE,INTERVAL -1 DAY) INTO CURDATE;-- ∗∗构建并执行删除语句∗∗:构建一个SQL语句来删除`bn_day_sum`表中昨天的所有记录,并执行它。SET sql_str = CONCAT('DELETE FROM bn_day_sumWHERE `date` LIKE ''',CURDATE,'%''');SELECT sql_str;SET @sql = sql_str;PREPARE stmt FROM @sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;-- ∗∗构建并执行插入语句∗∗:构建一个SQL语句来从‘bn_hour_sum‘表中选择昨天的数据,
-- 并将其插入到`bn_day_sum`表中。然后执行这个语句。SET sql_str = CONCAT('INSERT INTO bn_day_sum(device,`group`,num,`date`,`max_value`,max_value_time,`min_value`,`min_value_time`,sum_value,count_num,avg_num,warn_count,`time`)SELECT device,`group`,num,DATE(`hour`) `Date`,MAX(`max_value`) `MaxValue`,NULL MaxValueTime,MIN(`min_value`) `MinValue`,NULL MinValueTime,SUM(`sum_value`) SumValue,SUM(count_num) CountNum,SUM(`sum_value`)/SUM(count_num) AvgNum,SUM(`warn_count`) WarnCount,CURRENT_TIMESTAMP TimeFROM bn_hour_sum WHERE `hour` LIKE ''',CURDATE,'%''GROUP BY device,`group`,num, DATE(`hour`) ');SELECT sql_str;SET @sql = sql_str;PREPARE stmt FROM @sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;-- 尖凤平谷统计 10101,10102,10103,10104 从10144得到SELECT DATE(CURDATE) INTO @curDate;
-- ∗∗创建临时表并插入数据∗∗:创建一个临时表(如果它不存在),并插入一些统计数据,
-- 这些数据基于对‘bn_hour_sum‘表中特定记录的筛选和计算。CREATE TEMPORARY TABLE IF NOT EXISTS t1(Device VARCHAR(32),`Group` VARCHAR(32),Num VARCHAR(64),s INT,p INT,f INT,v INT);
-- ∗∗将数据插入到bn_day_sum表中∗∗:最后,将临时表中的数据插入到‘bn_day_sum‘表中。INSERT INTO t1 SELECT device,`group`,num,SUM(CASE spfv	WHEN 's' THEN `max_value` - `min_value` ELSE 0 END) s,SUM(CASE spfv	WHEN 'p' THEN `max_value` - `min_value` ELSE 0 END) p,SUM(CASE spfv	WHEN 'f' THEN `max_value` - `min_value` ELSE 0 END) f,SUM(CASE spfv	WHEN 'v' THEN `max_value` - `min_value` ELSE 0 END) vFROMbn_hour_sumWHERE DATE(`hour`) = @curDate AND num='10144'GROUP BY device,`group`,num;-- 将临时表t1中的数据插入到bn_day_sum表中。对于不同的设备(10101、10102、10103、10104),
-- 它们的数据来自相同的临时表t1,但插入到bn_day_sum表中的数据有所不同。例如,
-- 对于设备'10101',它的max_value、min_value等数据都设置为0,
-- 并且从临时表t1中选择了s列作为其sum_value。INSERT INTO bn_day_sum(device,`group`,num,`date`,`max_value`,max_value_time,
`min_value`,min_value_time,sum_value,count_num,avg_num,warn_count,TIME)SELECT t1.device,t1.`group`,'10101',@curDate,0,NULL,0,NULL,t1.s,0,0,0,
CURRENT_TIMESTAMP 
FROM t1;INSERT INTO bn_day_sum(device,`group`,num,`date`,`max_value`,max_value_time,
`min_value`,min_value_time,sum_value,count_num,avg_num,warn_count,TIME)SELECT t1.device,t1.`group`,'10102',@curDate,0,NULL,0,NULL,t1.p,0,0,0,
CURRENT_TIMESTAMP FROM t1;INSERT INTO bn_day_sum(device,`group`,num,`date`,`max_value`,max_value_time,
`min_value`,min_value_time,sum_value,count_num,avg_num,warn_count,TIME)SELECT t1.device,t1.`group`,'10103' ,@curDate,0,NULL,0,NULL,t1.f,0,0,0,
CURRENT_TIMESTAMP FROM t1;INSERT INTO bn_day_sum(device,`group`,num,`date`,`max_value`,max_value_time,
`min_value`,min_value_time,sum_value,count_num,avg_num,warn_count,TIME)SELECT t1.device,t1.`group`,'10104',@curDate,0,NULL,0,NULL,t1.v,0,0,0,
CURRENT_TIMESTAMP FROM t1;-- 最后,这段代码删除了临时表t1。
-- 总的来说,这段存储过程将之前计算得到的统计数据(针对不同设备)从临时表t1中提取出来,
-- 并插入到bn_day_sum表中,最后清理了临时表。DROP TEMPORARY TABLE t1;
END$$DELIMITER ;

这篇关于存储过程为什么使用DELIMITER $$,存储过程的详细运用解释的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/644900

相关文章

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示