-- 设置分隔符
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. FPGA与CPLD的概念及其区别

    一.FPGA与CPLD的基本概念 1.CPLD CPLD主要是由可编程逻辑宏单元(LMC,Logic Macro Cell)围绕中心的可编程互连矩阵单元组成,其中LMC逻辑结构较复杂,并具有复杂的I/ ...

  2. MYSQL三种安装方式--rpm包安装

    1. 首先检查机器里是否已经存在MySQL $ rpm -qa | grep mysql 2. 去官网下载相应的rpm包:https://dev.mysql.com/downloads/mysql/ ...

  3. Spring mvc知识点总结——面试篇

    一.MVC思想MVC(Model-View-Controller)三元组的概念:1.Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数 ...

  4. 2018-2019-2 网络对抗技术 20165301 Exp6 信息搜集与漏洞扫描

    2018-2019-2 网络对抗技术 20165301 Exp6 信息搜集与漏洞扫描 1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 (2)DNS ...

  5. poj 1041(字典序输出欧拉回路)

    John's trip Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8641   Accepted: 2893   Spe ...

  6. python的多线程threading

    多线程threading 1.Thread创建线程: 上代码: #!/usr/bin/env python3 import threading import time def A(): t_name ...

  7. 《大话设计模式》--UML图

    类图分三层: 第一层:类的名称,如果是抽象类,就用斜体显示 第二层:类的特性,通常是字段和属性 第三层:类的操作,通常是方法或行为 接口图:第一行是接口名称,第二行是接口方法 继承:用空心三角形+实线 ...

  8. c++ getline()

    #include <iostream>#include <string> int main (){ std::string name; std::cout << & ...

  9. Servlet技术——Servlet基础

    Servlet是运行在Web服务器端的Java应用程序,它使用Java语言编写,具有Java语言的优点.与Java程序的区别是,Servlet对象主要封装了对HTTP请求的处理,并且它的运行需要Ser ...

  10. 在SpringMVC Controller中注入Request成员域

    主题 在工作中遇到1个问题....我们定义了一个Controller基类,所有Springmvc自定义的controller都继承它....在它内部定义一个@Autowired HttpServlet ...