事情的原委:

今天遇到一个问题:一个数据表case_folder_info想要实现自定义排序功能,就在表里新加了一个字段SORT_NUMBER,由于表里存在已有数据,所以这个SORT_NUMBER字段都为空,但要想实现上移、下移、置顶等功能的话,需要里面有默认数据,所以我想给这个字段里默认有一些排序的值。

思考解决办法:

1、用c#写个小程序,然后取出来所有数据,UPDATE一遍,这个还得新建项目,添加数据库连接字符串,添加数据库类库引用,太麻烦。

2、用数据库自带的命令行方式实现。

最终经过我头脑的一番小斗争,虽然sql不太熟但还是决定尝试一下吧。

sql实现的思路:

由于命令行中无法直接使用declare这样使用变量,所以干脆用非常规的方式来解决吧,先建一个临时的存储过程,在存储过程中实现我要想的循环赋值,然后使用完后再删除这个存储过程就可以了。

具体的sql语句:

/*判断是否存在,如果存在就删除*/

drop procedure if exists tempProcedure_Test;/*取一个系统中绝对不会用到的存储过程名称*/

/*创建临时存储过程*/

create procedure tempProcedure_Test()

BEGIN

declare isDone int default 0; /*判断是否还有记录*/

declare intNumber int default 1;/*用于自增的变量*/

declare tempId char(36); /*每条记录循环时的临时ID*/

declare folderIds cursor for select A.ID from case_folder_info as A;/*取出来所有需要循环的数据*/

declare continue handler for not FOUND set isDone = 1;/*如果不存在就设置为1,即为true*/

open folderIds; /*OPEN*/

REPEAT /*开始循环数据*/

fetch folderIds into tempId;

if not isDone THEN

update case_folder_info set SORT_NUMBER=intNumber where id=tempId;

set intNumber=intNumber+1;

end if;

until isDone end repeat;

close folderIds; /*CLOSE,对应上面的open folderIds;*/

END;

call tempProcedure_Test();/*调用下这个临时的存储过程*/

drop procedure tempProcedure_Test; /*使用完毕后要删除垃圾*/

完毕,收工!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐