-- 设置分隔符
DELIMITER // /*初始化*/
DROP PROCEDURE IF EXISTS useCursor // /*建立 存储过程 create */
CREATE PROCEDURE useCursor(input_planGuid BIGINT )
BEGIN -- 声明游标使用的变量----------
DECLARE nowID BIGINT;-- 本行自增id
DECLARE nowGuid BIGINT;-- 本行的guid,
DECLARE parentGuid BIGINT;-- 本行父级guid
DECLARE newIndex BIGINT;-- 要设置的本行的index DECLARE preIndex BIGINT DEFAULT -1;-- 上一行设置的index.
DECLARE preParentGuid BIGINT DEFAULT -1;-- 上一行的父级guid -- 声明游标,从临时表中读取数据.循环更新临时表-----------------------------------------------
DECLARE cur1 CURSOR FOR SELECT id,guid,PARENT_GUID FROM tb_tmp ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET nowID = NULL; -- 声明临时表,并获取数据--------------------------------------------------------------------
-- 定义临时表 tb_tmp(自增主键,标题,拓展信息,原表主键ID)
DROP TEMPORARY TABLE IF EXISTS tb_tmp; CREATE TEMPORARY TABLE tb_tmp (
id INT AUTO_INCREMENT PRIMARY KEY,
funcsOrder BIGINT,
ITEM_NO VARCHAR(200),
GUID BIGINT,
NAME VARCHAR(100) NULL,
ITEM_NO_INDEX BIGINT NULL,
PLAN_GUID BIGINT NULL,
PARENT_GUID BIGINT
); #所有数据
INSERT INTO tb_tmp( funcsOrder,ITEM_NO,GUID,NAME,ITEM_NO_INDEX,PLAN_GUID,PARENT_GUID)
SELECT CASE WHEN (
CASE WHEN INSTR(item_No, '.')>0
THEN CAST( SUBSTRING(item_No,(LENGTH(item_No)-INSTR(REVERSE(item_No), '.')+2)) AS SIGNED)
ELSE CAST(item_No AS SIGNED)
END )=0
THEN 2147483647
ELSE
CASE WHEN INSTR(item_No, '.')>0
THEN CAST( SUBSTRING(item_No,(LENGTH(item_No)-INSTR(REVERSE(item_No), '.')+2)) AS SIGNED)
ELSE CAST(item_No AS SIGNED)
END
END AS funcsOrder,item_no,guid, NAME,ITEM_NO_INDEX ,PLAN_GUID,PARENT_GUID
FROM sn93_elggtw_goal
WHERE PLAN_GUID=input_planGuid
ORDER BY PARENT_GUID,
(CASE WHEN (
CASE WHEN INSTR(item_No, '.')>0
THEN CAST( SUBSTRING(item_No,(LENGTH(item_No)-INSTR(REVERSE(item_No), '.')+2)) AS SIGNED)
ELSE CAST(item_No AS SIGNED)
END )=0
THEN 2147483647
ELSE
CASE WHEN INSTR(item_No, '.')>0
THEN CAST( SUBSTRING(item_No,(LENGTH(item_No)-INSTR(REVERSE(item_No), '.')+2)) AS SIGNED)
ELSE CAST(item_No AS SIGNED)
END
END ),item_no,guid; -- 临时表完毕------------------------------------------------------------------------------- -- 开游标
OPEN cur1;
/*游标向下走一步*/
FETCH cur1 INTO nowID,nowGuid,parentGuid; /* 循环体 */
WHILE ( nowID IS NOT NULL)
DO
-- 如果nowID=1,则表示第一行.设置item_no_index=1即可
IF nowID=1 THEN
SET newIndex=1;
ELSE
-- 如果不是第一行:
-- 再根据本行与上一行的数据进行判断:
-- A:本行父级id<>上一行的父级id,则本行为第一个子.设置index=1;
IF parentGuid!=preParentGuid THEN
SET newIndex=1;
ELSE
-- B:本行父级id==上一行的父级id,则本行为上一行的兄弟,设置index=上行index+1;
SET newIndex= preIndex + 1;
END IF;
END IF;
-- 更新index
UPDATE tb_tmp SET ITEM_NO_INDEX = newIndex WHERE id=nowID;
-- 更新上一行变量.
SET preIndex=newIndex;
SET preParentGuid=parentGuid; /*游标向下走一步*/
FETCH cur1 INTO nowID,nowGuid,parentGuid;
END WHILE; CLOSE cur1;
-- 游标处理临时表完毕---------------------------------------------------------------------
-- 根据临时表数据,更新真实表数据---------------------------------------------------------- update sn93_elggtw_goal inner join (sn93_elggtw_goal T1 INNER JOIN tb_tmp T2 ON T1.guid=T2.guid and T1.guid=T2.guid ) on T1.PLAN_GUID=input_planGuid
SET T1.ITEM_NO_INDEX=T2.ITEM_NO_INDEX ; -- 删除临时表
DROP TEMPORARY TABLE IF EXISTS tb_tmp;
-- over ----------------------------------------------------------------------------------
END// DELIMITER ;

  

mysql 存储过程案列一个。的更多相关文章

  1. 写MYSQL存储过程遇到的一个小BUG

    DELIMITER $$ USE `income_new`$$ DROP PROCEDURE IF EXISTS `a`$$ CREATE DEFINER=`income_new`@`%` PROCE ...

  2. MySQL去重案列(待更新...)

    谈谈distinct 查询单个字段,没问题! SELECT DISTINCT username FROM t_user 但是我想加入id字段,这样写,报错! SELECT id, DISTINCT u ...

  3. 【转】MySQL存储过程中使用动态行转列

    MySQL存储过程中使用动态行转列 最近做项目关于数据报表处理,然而数据库存储格式和报表展现形式不同,需要进行一下行转列的操作,在做上一个项目的时候也看了一下,但是后来换了读取方式,也就没深入研究这个 ...

  4. MySQL存储过程的动态行转列

    MySQL存储过程中使用动态行转列 最近做项目关于数据报表处理,然而数据库存储格式和报表展现形式不同,需要进行一下行转列的操作,在做上一个项目的时候也看了一下,但是后来换了读取方式,也就没深入研究这个 ...

  5. linux下mysql函数的详细案列

    MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *pas ...

  6. 第一个MySQL 存储过程

    昨天写了人生第一个mysql存储过程:遗憾的是,这个存储过程最后还是没用上,用php代码替代 话说mysql的存储过程真是反人类,不查reference,基本不能看懂那些语句:语言中能和它相比的,只有 ...

  7. mysql 存储过程 事务; mysql的事务中包含一个存储过程

    在asp.net结合mysql的开发中,我平时用到的事务处理是 使用 TransactionOptions  来进行处理 TransactionOptions transactionOption = ...

  8. 写一个MySql存储过程实现房贷等额本息还款计算(另外附javascript代码)

    写一个MySql存储过程实现房贷等额本息还款计算 MySql存储过程代码如下: DROP procedure IF EXISTS `calc_equal_interest_proc`; DELIMIT ...

  9. 2021年-在windwos下如何用TOMACT发布一个系统(完整配置案列)

    2021年新年第一篇:博主@李宗盛-关于在Windwos下使用TOMCAT发布一个系统的完成配置案列. 之前写过关于TOMCAT的小篇幅文档,比较分散,可以作为对照与参考. 此篇整合在一起,一篇文档写 ...

随机推荐

  1. Nginx实现404页面的几种方法【转】

    一个网站项目,肯定是避免不了404页面的,通常使用Nginx作为Web服务器时,有以下集中配置方式,一起来看看. 第一种:Nginx自己的错误页面 Nginx访问一个静态的html 页面,当这个页面没 ...

  2. 012 public等关键字可见性

    public: 具有最大的访问权限,可以访问任何一个在classpath下的类.接口.异常等.它往往用于对外的情况,也就是对象或类对外的一种接口的形式. protected: 主要的作用就是用来保护子 ...

  3. spring中的任务调度Quartz

    Spring 整合 Quartz 任务调度 主要有两种方式. Quartz的官网:http://www.quartz-scheduler.org/ 这两种只是一些配置文件简单配置就OK了,但是根本无法 ...

  4. 接口测试(概念、Postman、SoapUI、jmeter)

    一.什么是接口测试 接口测试是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点.测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑 ...

  5. java网络编程三次握手四次挥手

    第一次握手:client设置syn=1,随机产生一个序列号seq=x,将数据包发送到server.client进入syn_send状态, 等待server确认. 第二次握手:server查看clien ...

  6. 《自己动手写docker》之namespace部门实验

    动手写一遍,印象不一样! package main import ( "log" "os" "os/exec" "syscall& ...

  7. Centos bash: make: command not found

    一般出现这个bash: make: command not found提示,是因为安装系统的时候使用的是最小化mini安装,系统没有安装make.vim等常用命令,直接yum安装下即可: yum -y ...

  8. 前端canvas合并图片两种实现方式

    ---恢复内容开始--- 需求: 有一个固定的背景图,还有一个是随机生成的二维码,合并成一张图,让用户下载. 实现一:纯手写,这里为了省事生成图片我直接给的base64,其实使用qrcode.js生成 ...

  9. LeetCode 136. Single Number(只出现一次的数字)

    LeetCode 136. Single Number(只出现一次的数字)

  10. 洛谷P3538 [POI2012]OKR-A Horrible Poem [字符串hash]

    题目传送门 A Horrible Poem 题目描述 Bytie boy has to learn a fragment of a certain poem by heart. The poem, f ...