转载

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;
正文到此结束