mysql存储过程存储一列_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 ;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值