MySQL函数和存储过程在项目中的应用

1. 生成项目编号

create
    definer = root@`%` function generate_project_no_func(areaId varchar(50), tradeId varchar(50), typeId varchar(50)) returns varchar(100)
BEGIN

    DECLARE dateStr VARCHAR(10);
    DECLARE areaSimpleSpell VARCHAR(50) DEFAULT 'NOAREA';
    DECLARE tradeSimpleSpell VARCHAR(50) DEFAULT 'NOTRADE';
    DECLARE typeSimpleSpell VARCHAR(50) DEFAULT 'NOTYPE';
    DECLARE currentProjectNum VARCHAR(2) DEFAULT '01';

    SELECT date_format(now(), '%Y%m%d') INTO dateStr FROM DUAL;
    SELECT IF(am.simple_spell IS NULL, 'NULL', am.simple_spell)
    INTO areaSimpleSpell FROM area_manage am WHERE am.id = areaId;
    SELECT IF(tm.simple_spell IS NULL, 'NULL', tm.simple_spell)
    INTO tradeSimpleSpell FROM trade_manage tm WHERE tm.id = tradeId;
    SELECT IF(ptm.simple_spell IS NULL, 'NULL', ptm.simple_spell)
    INTO typeSimpleSpell FROM project_type_manage ptm WHERE ptm.id = typeId;
    SELECT IF(COUNT(p.id) < 10, CONCAT('0', COUNT(p.id) + 1), COUNT(p.id) + 1) INTO currentProjectNum FROM project p WHERE DATEDIFF(create_time, now()) = 0;

    RETURN CONCAT(dateStr, areaSimpleSpell, tradeSimpleSpell, typeSimpleSpell, currentProjectNum);
END;

2. 递归获取下级员工

create
    definer = root@`%` function get_child_list_func(rootId char(50)) returns varchar(10000)
BEGIN
    DECLARE sTemp VARCHAR(10000);
    DECLARE sTempChd VARCHAR(10000);

    SET sTemp = '$';
    SET sTempChd = cast(rootId as CHAR);

    WHILE sTempChd is not null
        DO
            SET sTemp = concat(sTemp, ',', sTempChd);
            SELECT group_concat(id) INTO sTempChd FROM admin_user where FIND_IN_SET(parent_id, sTempChd) > 0;
        END WHILE;
    RETURN SUBSTRING(sTemp, 3);
END;

3. 递归获取下级部门

create
    definer = root@`%` function get_dept_child_ids_func(rootId varchar(1000)) returns text
BEGIN
    DECLARE sTemp text;
    DECLARE sTempChd text;

    SET sTemp = '';
    SET sTempChd =CAST(rootId AS CHAR);

    WHILE sTempChd IS NOT NULL DO
            SET sTemp = CONCAT(sTemp,',',sTempChd);
            SELECT GROUP_CONCAT(id) INTO sTempChd FROM department WHERE FIND_IN_SET(parenti_id,sTempChd);
        END WHILE;
    RETURN SUBSTRING(sTemp,2);
END;

4. 存储过程实现循环插入

drop procedure if exists test;
DELIMITER //
CREATE PROCEDURE test()
BEGIN
    DECLARE i INT DEFAULT 0;
    DECLARE cnt INT DEFAULT 0;
    select count(id) into cnt from department where id not in (
        select department_id from check_work_v2_rule_dept_link where check_work_rule_id = '8a8be68f73f0aec20173f1ae325e00a6'
    ) and status = 0 and id not like '%gk%';
WHILE i < cnt DO
        # 日常考勤
        insert into check_work_v2_rule_dept_link (id,check_work_rule_id, department_id)
        select REPLACE(UUID(), '-', '') cid,'8a8be68f73f0aec20173f1ad13bd0053',id from department where id not in (
            select department_id from check_work_v2_rule_dept_link # where check_work_rule_id = '8a8be68f73f0aec20173f1ae325e00a6'
        ) and status = 0  and id not like '%gk%' limit 1;
        # 项目考勤
        insert into check_work_v2_rule_dept_link (id,check_work_rule_id, department_id)
        select REPLACE(UUID(), '-', '') cid,'8a8be68f73f0aec20173f1ae325e00a6',id from department where id not in (
            select department_id from check_work_v2_rule_dept_link  # where check_work_rule_id = '8a8be68f73f0aec20173f1ae325e00a6'
        ) and status = 0  and id not like '%gk%' limit 1;
SET i=i+1;
END WHILE;
select @cnt;
END
//
DELIMITER ;

猜你喜欢

转载自blog.csdn.net/weixin_41085114/article/details/108094762