-- 设置分隔符
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. vscode中go插件配置

    # 转自:http://www.mamicode.com/info-detail-2436665.html # https://blog.csdn.net/bing2011/article/detai ...

  2. 内存不够清理方法,costdown项目时如果裁剪不下来,也可以参考

    Linux下清理内存和Cache方法 /proc/sys/vm/drop_caches 频繁的文件访问会导致系统的Cache使用量大增 $ free -m total used free shared ...

  3. MAC和PHY的区别 (转自http://www.cnblogs.com/feitian629/archive/2013/01/25/2876857.html)

    一块以太网网卡包括OSI(开方系统互联)模型的两个层.物理层和数据链路层.物理层定义了数据传送与接收所需要的电与光信号.线路状态.时钟基准.数据编码和电路等,并向数据链路层设备提供标准接口.数据链路层 ...

  4. 大数据系列之分布式数据库HBase-1.2.4+Zookeeper 安装及增删改查实践

    之前介绍过关于HBase 0.9.8版本的部署及使用,本篇介绍下最新版本HBase1.2.4的部署及使用,有部分区别,详见如下: 1. 环境准备: 1.需要在Hadoop[hadoop-2.7.3]  ...

  5. RF和adaboost

    通过对所有的决策树进行加总来预测新的数据(在分类时采用多数投票,在回归时采用平均).

  6. scrapy爬虫

    a. 配置文件 #settings.py DEPTH_LIMIT = 1 #指定“递归”的层数 ROBOTSTXT_OBEY = False #对方网站规定哪些网址可以爬,这个选项表示不遵循此规定 b ...

  7. 洛谷P1789【Mc生存】插火把 题解

    题目传送门 这道题目可以纯暴力: #include<bits/stdc++.h> //Minecraft 666 using namespace std; ][]; int n,m,k,a ...

  8. 基于Token的授权(with srping mvc)

    @Override public void doFilter(ServletRequest sr, ServletResponse sr1, FilterChain fc) throws IOExce ...

  9. 基于vue2.0的后管系统(配置篇)

    一些项目依赖package.json { "name": "frontend", "description": "tssp bas ...

  10. Java 中可变参数

    可变参数 Java 中可变参数 现在需要编写一个求和的功能,但是不知道有几个参数,在调用的时候才知道有几个参数,请问这如何实现呢? Java 给我们提供了一个 JDK 1.5 的新特性---可变参数 ...