mysql存储过程 详细注释

摘要:
原文:https://my.oschina.net/u/3582142/blog/1581929delimiter$$/*重新定义mysql结束符,而不再是分号是结束符*/createproceduremergeDeclare()/*创建存储过程*/BEGIN/*定义局部变量*/DECLAREidINTDEFAULT0;DECLAREDoneINTDEFAULT0;DECLAREmobileVAR

原文:https://my.oschina.net/u/3582142/blog/1581929

delimiter $$ /* 重新定义mysql结束符,而不再是分号是结束符 */
create procedure mergeDeclare() /* 创建存储过程 */
BEGIN
/*定义局部变量*/
DECLARE id INT DEFAULT 0;
DECLARE Done INT DEFAULT 0;
DECLARE mobile VARCHAR(20);
DECLARE mobileTemp VARCHAR(20) DEFAULT '';
DECLARE maxId INT DEFAULT 0;
DECLARE t_error INTEGER DEFAULT 0;
DECLARE rs CURSOR FOR /* 定义从mysql取数据的游标 */
/* 查出需要的数据 */
select
a.declare_id,a.user_mobile
from
declare_info a,
(select user_mobile from declare_info b where b.status=1 group by user_mobile having count(1)>1) b
where
a.user_mobile=b.user_mobile and a.status =1 and CHARACTER_LENGTH(a.user_mobile) = 11 ORDER BY a.user_mobile , a.declare_id DESC;
/* 当游标遍历完所有数据的时候,set Done的值为1 */
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;
/* 当发生sql异常的时候set t_error的值为1 */
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
/* 开启事务 */
START TRANSACTION;
/* 打开游标 */
OPEN rs;
/* 取游标当前的值,into后面是赋值的意思,被赋值变量的数目与sql查出来的字段数相等 */
FETCH NEXT FROM rs INTO id,mobile;
/* 在此处进行循环 */
REPEAT
IF NOT Done THEN
IF mobileTemp = mobile THEN
UPDATE farmer_certification_info set declare_id = maxId where declare_id = id;
UPDATE farmer_contact_info set declare_id = maxId where declare_id = id;
UPDATE farmer_industry_info set declare_id = maxId where declare_id = id;
UPDATE farmer_info set declare_id = maxId where declare_id = id;
UPDATE farmer_job_info set declare_id = maxId where declare_id = id;
UPDATE farmer_skill_info set declare_id = maxId where declare_id = id;
UPDATE training_class_user set declare_id = maxId where declare_id = id;
UPDATE training_class_evaluate set declare_id = maxId where declare_id = id;
UPDATE declare_info set `status`= 0 where declare_id = id;
ELSE
set mobileTemp = mobile;
set maxId = id;
END IF;
END IF;
IF t_error = 1 THEN
/* sql异常回滚 */
ROLLBACK;
ELSE
/* 提交事务 */
COMMIT;
END IF;
/* 向游标取出下一个值进行赋值 */
FETCH NEXT FROM rs INTO id,mobile;
/* 遍历完Done=1,结束遍历 */
UNTIL Done END REPEAT;
/*关闭游标*/
CLOSE rs;
END $$ /* 结束符,和开始定义的一致 */

/*
drop procedure mergeDeclare /* 删除存储过程 */
*/
/*
call mergeDeclare() /* 调用存储过程 */
*/

标注:存储过程没有容器和数据概念,但可新建表借助表当作一个容器使用。

免责声明:文章转载自《mysql存储过程 详细注释》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题SpringBoot在IDEA中的配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

noodjs(koa)+mysql搭建服务器环境及基本的增删改查操作

手动创建项目文件 1.在指定目录下,右击创建项目文件夹。2.使用git init 命令把此文件下内容变成可由git进行版本控制的文件。3.执行“npm init -y”命令,创建package.json文件,初始化4.执行“npm init koa”命令,安装koa,此时项目路径下会生成一个package-lock.json文件。 创建server 1.创...

.frm和.ibd恢复数据

昨日晚上开发告诉我不小心truncate两个表的数据,要求还原。结果在阿里云上找到了备份内容,结果是物理备份文件.frm、.ibd。心中一万个草泥马啊。。没办法,开始还原吧。 1、查看测试机Mysql配置文件位置 [root@localhost mysql]# which mysqld /usr/sbin/mysq...

项目中应该怎么选择MySQL的事务隔离级别

知识点总结 1.数据库默认隔离级别: mysql :Repeatable Read; oracle、sql server :Read Commited 2.mysql binlog的格式三种:statement,row,mixed 3.为什么mysql用的是Repeatable Read而不是Read Commited:在 5.0之前只有statement...

使用engine关键字指定该表使用哪个engine

建表及插入数据语句:mysql> create table salary(userid int,salary decimal(9,2));Query OK, 0 rows affected (0.11 sec)mysql> insert into salary values(1,1000),(2,2000),(3,3000),(4,4000),...

Asp.net Mvc 使用EF6 code first 方式连接MySQL总结

最近由于服务器变更为Linux系统.MsSql for Linux什么时候出来到生产环境使用还是要很长时间的.于是考虑使用Mysql数据库,ORM使用EF.于是先踩下坑顺便记录一下,有需要的tx可以参考下.当你考虑使用EF连接Mysql的时候肯定是已经在网上搜了一堆教程.网上教程基本都是使用控制台做演示.跟着一步步来姿势没错的话可能会正常运行,但项目中使用...

优化mysql的内存

Mysql占用CPU过高的时候,该从哪些方面下手进行优化?占用CPU过高,可以做如下考虑:1)一般来讲,排除高并发的因素,还是要找到导致你CPU过高的哪几条在执行的SQL,show processlist语句,查找负荷最重的SQL语句,优化该SQL,比如适当建立某字段的索引;2)打开慢查询日志,将那些执行时间过长且占用资源过多的SQL拿来进行explain...