存储过程为什么使用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 ;

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

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

相关文章

五款焊在电脑上的效率软件

在当今快节奏的商业环境中,提高工作效率成为了每个人都渴望实现的目标。尤其是在面对繁忙的工作日程、庞杂的任务清单和团队合作的压力时,我们需要一些可靠的工具来帮助我们更好地管理时间、组织工作和提高生产力。幸运的是,现在有许多高效的…

TableConvert:简化API集成,提升广告推广和用户运营效率

无代码开发实现系统集成 在电子商务和广告推广领域,系统之间的集成常常需要繁琐的API开发工作。但TableConvert为非技术人员提供了一个无需编写代码的集成解决方案。用户只需通过简单的界面操作,即可将不同来源的数据导入到TableConvert中,从…

VC++中使用OpenCV进行人脸检测

VC中使用OpenCV进行人脸检测 对于上面的图像,如何使用OpenCV进行人脸检测呢? 使用OpenCV进行人脸检测十分简单,OpenCV官网给了一个Python人脸检测的示例程序, objectDetection.py代码如下: from __future__ import p…

67.在使用SpringMVC时说说你是如何解决 get 和 post 乱码问题?

说说你是如何解决 get 和 post 乱码问题&#xff1f; &#xff08;1&#xff09;解决post请求乱码问题&#xff1a;在web.xml中配置一个CharacterEncodingFilter过滤器&#xff0c;设置成utf8&#xff1b; <filter><filter‐name>CharacterEncodingFilter</fil…

Pandas ------ 向 Excel 文件中写入含有 multi-index 和 Multi-column 表头的数据

Pandas ------ 向 Excel 文件中写入含有 multi-index 和 Multi-column 表头的数据 引言正文 引言 之前在 《pandas向已经拥有数据的Excel文件中添加新数据》 一文中我们介绍了如何通过 pandas 向 Excel 文件中写入数据。那么对于含有多表头的数据&#xff0c;我们该如何将它们…

STM32_JTAG引脚及复用代码

目录 1.JTAG引脚1.1 说明&#xff08;可以不看&#xff09;1.2 引脚 2.复用代码3. 手册介绍&#xff08;可以不看&#xff09; 总是忘记有些引脚是JTAG复用的&#xff0c;导致偶尔浪费一些时间&#xff0c;记录一下。 1.JTAG引脚 1.1 说明&#xff08;可以不看&#xff09; …

【jetson笔记】vscode远程调试

vscode安装插件 vscode安装远程插件Remote-SSH 安装完毕点击左侧远程资源管理器 打开SSH配置文件 添加如下内容&#xff0c;Hostname为jetson IP&#xff0c;User为登录用户名需替换为自己的 Host aliasHostName 192.168.219.57User jetson配置好点击连接&#xff0c;控制台输…

全国首个!华为5.5G新突破:速率最高超4Gbps

“华为中国”官微宣布&#xff0c;近日&#xff0c;山东移动联合华为在青岛城区完成500个三载波聚合站点规模开通&#xff0c;标志着山东移动成为全国首个实现百站三载波聚合连片部署的运营商。 本次开通三载波聚合站点覆盖五四广场、八大关、青岛北站、中国海洋大学等热点区域…

谷粒商城配置虚拟机

一、创建虚拟机 之前有在VM里面建一个ubuntu的虚拟机&#xff0c;准备拿来直接用&#xff0c;网络设置为NAT模式&#xff0c;查看我的虚拟机是虚拟机&#xff1a;192.168.248.128 主机&#xff1a; 192.168.2.12。可以互相ping通。 二、linux安装docker Docker docker是虚拟…

威联通QNAP NAS结合cpolar内网穿透实现公网远程访问NAS中存储的文件

文章目录 推荐 前言1. 威联通安装cpolar内网穿透2. 内网穿透2.1 创建隧道2.2 测试公网远程访问 3. 配置固定二级子域名3.1 保留二级子域名3.2 配置二级子域名 4. 使用固定二级子域名远程访问 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣…

解决Xcode报错Stored properties cannot be marked unavailable with ‘@available‘

出现场景 打开一个IOS老项目时&#xff0c;Xcode提示以下错误 available(iOS, unavailable) //Stored properties cannot be marked unavailable with available解决方案 我们只需要把unavailable改成*号&#xff0c;同时增加版本号的限制。 // available(iOS, unavailabl…

Linux sudo与/etc/sudoers

sudo介绍 sudo命令可以让普通用户在执行需要超级用户权限的命令时&#xff0c;临时提升为超级用户。例如&#xff0c;普通用户可以使用sudo执行系统管理任务&#xff0c;如安装软件、修改系统配置等。访问控制&#xff1a;sudo命令通过sudoers文件中的配置&#xff0c;可以对用…

【AI绘画】Stable Diffusion使用入门教程!!!!

手把手教你入门绘图超强的AI绘画&#xff0c;用户只需要输入一段图片的文字描述&#xff0c;即可生成精美的绘画。给大家带来了全新保姆级教程资料包 &#xff08;文末可获取&#xff09; 首先提几个好玩的名词&#xff1a; 炼丹&#xff1a;训练AI学习图片生成模型 咒语&…

CES 2024的亮点仅仅聚焦AI深度赋能和产业创新吗?| DALL-E 3、Stable Diffusion等20+ 图像生成模型综述

随着科技飞速发展&#xff0c;CES&#xff08;国际消费电子展&#xff09;已然成为全球科技产业的风向标&#xff0c;每年的CES大会都是业界瞩目的盛事。回顾2024年CES大会&#xff0c;不难发现其亮点纷呈&#xff0c;其中以人工智能的深度赋能为最引人注目之处。AI技术的深入应…

如何在Linux环境下安装Redis呢?

第一步&#xff1a;创建存放redis存放的文件夹 mkdir /usr/local/redis使用cd切换到上述创建的目录 第二步&#xff1a;从官网下载redis压缩包 wget https://download.redis.io/releases/redis-6.0.5.tar.gz下图为下载成功示例 第三步&#xff1a;解压下载的压缩包 tar -zv…

TA百人计划学习笔记 3.1.2深度测试

资料 源视频 【技术美术百人计划】图形 3.1 深度与模板测试 传送门效果示例_哔哩哔哩_bilibili ppt 3100-模板测试与深度测试(1) 参考 Unity Shader: 理解Stencil buffer并将它用于一些实战案例&#xff08;描边&#xff0c;多边形填充&#xff0c;反射区域限定&#xff0c;阴影…

文字转语音在线合成掩码系统 让你的文字自动转为语音 带完整的安装部署教程

互联网的快速发展&#xff0c;人们对文字转语音&#xff08;TTS&#xff09;的需求日益增长。无论是需要为视障人士提供语音阅读的内容&#xff0c;还是想要为视频内容添加语音旁白&#xff0c;都需要一个高效、准确的文字转语音系统。然而&#xff0c;市面上的许多TTS工具都存…

C++文件操作基础 读写文本、二进制文件 输入输出流 文件位置指针以及随机存取 文件缓冲区以及流状态

一、写入文本文件 文本文件一般以行的形式组织数据。 包含头文件&#xff1a;#include <fstream> 类&#xff1a;ofstream&#xff08;output file stream&#xff09; ofstream 打开文件的模式&#xff08;方式&#xff09;&#xff1a;类内open()成员函数参数2.参数1是…

C语言sizeof 不是函数吗?

一、问题 sizeof 怎么⽤&#xff0c;它不是函数吗&#xff1f; 二、解答 sizeof 在 C 和 C 中不是一个函数&#xff0c;而是一个运算符。它在编译时计算其操作数所占用的内存大小&#xff0c;并返回一个大小&#xff08;字节数&#xff09;&#xff0c;这个结果是类型或表达式…

是用原生js创建红包雨效果

需求: 创建红包雨 答案: // 红包雨代码 开始 // 添加遮罩层 const addOverlay () > {const overlay document.createElement(div);overlay.className overlay;overlay.style.position fixed;overlay.style.top 0;overlay.style.left 0;overlay.style.width 100%;o…