mysql 存储过程案列一个。
-- 设置分隔符
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 存储过程案列一个。的更多相关文章
- 写MYSQL存储过程遇到的一个小BUG
DELIMITER $$ USE `income_new`$$ DROP PROCEDURE IF EXISTS `a`$$ CREATE DEFINER=`income_new`@`%` PROCE ...
- MySQL去重案列(待更新...)
谈谈distinct 查询单个字段,没问题! SELECT DISTINCT username FROM t_user 但是我想加入id字段,这样写,报错! SELECT id, DISTINCT u ...
- 【转】MySQL存储过程中使用动态行转列
MySQL存储过程中使用动态行转列 最近做项目关于数据报表处理,然而数据库存储格式和报表展现形式不同,需要进行一下行转列的操作,在做上一个项目的时候也看了一下,但是后来换了读取方式,也就没深入研究这个 ...
- MySQL存储过程的动态行转列
MySQL存储过程中使用动态行转列 最近做项目关于数据报表处理,然而数据库存储格式和报表展现形式不同,需要进行一下行转列的操作,在做上一个项目的时候也看了一下,但是后来换了读取方式,也就没深入研究这个 ...
- linux下mysql函数的详细案列
MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *pas ...
- 第一个MySQL 存储过程
昨天写了人生第一个mysql存储过程:遗憾的是,这个存储过程最后还是没用上,用php代码替代 话说mysql的存储过程真是反人类,不查reference,基本不能看懂那些语句:语言中能和它相比的,只有 ...
- mysql 存储过程 事务; mysql的事务中包含一个存储过程
在asp.net结合mysql的开发中,我平时用到的事务处理是 使用 TransactionOptions 来进行处理 TransactionOptions transactionOption = ...
- 写一个MySql存储过程实现房贷等额本息还款计算(另外附javascript代码)
写一个MySql存储过程实现房贷等额本息还款计算 MySql存储过程代码如下: DROP procedure IF EXISTS `calc_equal_interest_proc`; DELIMIT ...
- 2021年-在windwos下如何用TOMACT发布一个系统(完整配置案列)
2021年新年第一篇:博主@李宗盛-关于在Windwos下使用TOMCAT发布一个系统的完成配置案列. 之前写过关于TOMCAT的小篇幅文档,比较分散,可以作为对照与参考. 此篇整合在一起,一篇文档写 ...
随机推荐
- Vuex-Mutation
更改 Vuex 的 store 中的状态的唯一方法是提交 mutation.Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 ...
- [转载]Windows服务编写原理及探讨(2)
(二)对服务的深入讨论之上 上一章其实只是概括性的介绍,下面开始才是真正的细节所在.在进入点函数里面要完成ServiceMain的初始化,准确点说是初始化一个 SERVICE_TABLE_ENTRY结 ...
- nginx 查看当前的连接数
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}' https://www.cnblogs.com/lianzhil ...
- html基础--css基本属性
HTML基础--css基本属性 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- C#窗口矩形区域着色
C#写的一个GUI窗口,有几百个矩形区域.每个矩形区域的颜色随时都可能改变,并且多次改变. 我放弃使用label绘制矩形,因为效果不好.拖控件的界面使用power packs中的rectanglesh ...
- booklist for machine learning
Recommended Books Here is a list of books which I have read and feel it is worth recommending to fri ...
- 二十三 使用@property
在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 这显然不合逻辑.为了限制score的范围,可以 ...
- Java 中的值传递和引用传递问题
Java 中的值传递和引用传递问题 public class Operation { int data = 50; void change(int data) { data = data + 100; ...
- socket.io分布式
socket.io是目前较为流行的web实时推送框架,其基于nodejs语言开发,底层用engine.io实现. 借助nodejs语言异步的特性,其获得了不错的性能.但单个实例的socket.io依然 ...
- 【C++】指针的引用及面向对象
指针的引用 #include <iostream> using namespace std; struct Teacher { ]; int age; }; int getTeacher( ...