mysql循环处理:获取树内节点全路径
mysql循环处理:获取树内节点全路径
DELIMITER $$
USE `workflow_base`$$
DROP PROCEDURE IF EXISTS `pro_create_tree_full_path`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `pro_create_tree_full_path`()
BEGIN
DECLARE temp_id VARCHAR(30);
DECLARE flag INT DEFAULT 0;
# 这是重点,定义一个游标来记录sql查询的结果(此处的知识点还有SQL的模糊查询,见补充)
DECLARE s_list CURSOR FOR SELECT open_id FROM `sys_org`;
# 为下面while循环建立一个退出标志,当游标遍历完后将flag的值设置为1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag=1;
OPEN s_list; # 打开游标
# 将游标中的值赋给定义好的变量,实现for循环的要点
FETCH s_list INTO temp_id;
WHILE flag <> 1 DO
# 循环获取节点树全路径,并进行赋值
#SET @temp_s = temp_id;
#UPDATE sys_org org SET org.path=(
# SELECT GROUP_CONCAT(T1.open_pid) AS path
# FROM
# (
# SELECT
# @temp_s AS _open_id,
# (SELECT @temp_s := open_pid FROM sys_org WHERE open_id = _open_id) AS open_pid
# FROM
# (SELECT @temp_s := temp_id) vars,
# sys_org h
# WHERE @temp_s <> 0 ORDER BY _open_id
# ) T1 )
#WHERE org.open_id=@temp_s;
SET @temp_s = temp_id;
UPDATE sys_org org SET org.org_path=(
SELECT GROUP_CONCAT(T1.org_name SEPARATOR "/") AS name_path
FROM
(
SELECT
@temp_s AS _open_id,
(SELECT @temp_s := open_pid FROM sys_org WHERE open_id = _open_id) AS open_pid,
h.`org_name`
FROM
(SELECT @temp_s := temp_id) vars,
sys_org h
WHERE @temp_s <> 0 ORDER BY _open_id DESC
) T1 )
WHERE org.open_id=@temp_s;
FETCH s_list INTO temp_id;
END WHILE;
CLOSE s_list; # 关闭游标
END$$
DELIMITER ;
参考:
delimiter // # 定义//为一句sql的结束标志,取消;的所代表的意义
drop procedure if exists test; # 如果存在名字为test的procedure则删除
create procedure test() # 创建(创建函数使用的关键字为function 函数名())
begin
declare old_pro varchar(30); # 声明变量
declare temp_id int;
declare flag int default 0;
# 这是重点,定义一个游标来记录sql查询的结果(此处的知识点还有SQL的模糊查询,见补充)
declare s_list cursor for select id, province from temp_table where like "%省";
# 为下面while循环建立一个退出标志,当游标遍历完后将flag的值设置为1
declare continue handler for not found set flag=1;
open s_list; # 打开游标
# 将游标中的值赋给定义好的变量,实现for循环的要点
fetch s_list into temp_id, old_pro;
while flag <> 1 do
# sql提供了字符串的切分,有left、right、substring、substring_index
# 在T-SQL中,局部变量必须以@作为前缀,声明方式set,select还有点差别
set @temp_s = substring_index(old_pro, "省", 1);
# 根据id的唯一性,利用当前查询到的记录中的字段值来实现更新
update temp_table set province=@temp_s where id=temp_id;
# 游标往后移(此处的游标是不是让你想起了C里面的指针)
fetch s_list into temp_id, old_pro;
end while;
#select * from temp_table;
close s_list; # 关闭游标
end
//
delimiter ; # 重新定义;为一句sql的结束标志,取消//的所代表的意义
call test(); # 调用
SQL具有四种匹配模式
1、%:表示零个或多个字符;
2、_:表示任意单个字符;
3、[]:表示括号内所列字符中的任意一个(类似正则);
4、[^]:取反(类似正则);
注:若匹配中包含通配符则使用“[]”将特殊字符括起来即可(相当于转义)
mysql 循环三种循环用法
-- MySQL中的三中循环 while 、 loop 、repeat 求 1-n 的和
第一种 while 循环 :
-- 求 1-n 的和
/* while循环语法:
while 条件 DO
循环体;
end while;
*/
create procedure sum1(a int)
begin
declare sum int default 0; -- default 是指定该变量的默认值
declare i int default 1;
while i<=a DO -- 循环开始
set sum=sum+i;
set i=i+1;
end while; -- 循环结束
select sum; -- 输出结果
end;
-- 执行存储过程
call sum1(100);
-- 删除存储过程
drop procedure if exists sum1;
第二种 loop 循环:
/*loop 循环语法:
loop_name:loop
if 条件 THEN -- 满足条件时离开循环
leave loop_name; -- 和 break 差不多都是结束训话
end if;
end loop;
*/
create procedure sums(a int)
begin
declare sum int default 0;
declare i int default 1;
loop_name:loop -- 循环开始
if i>a then
leave loop_name; -- 判断条件成立则结束循环 好比java中的 boeak
end if;
set sum=sum+i;
set i=i+1;
end loop; -- 循环结束
select sum; -- 输出结果
end;
-- 执行存储过程
call sums(100);
-- 删除存储过程
drop procedure if exists sums;
第三种 repeat 循环:
/*repeat 循环语法
repeat
循环体
until 条件 end repeat;
*/
-- 实例;
create procedure sum55(a int)
begin
declare sum int default 0;
declare i int default 1;
repeat -- 循环开始
set sum=sum+i;
set i=i+1;
until i>a end repeat; -- 循环结束
select sum; -- 输出结果
end;
-- 执行存储过程
call sum55(100);
-- 删除存储过程
drop procedure if exists sum55;
正文到此结束