查找关于MySql的存储过程依赖项

时间:2019-03-13 09:09:29

标签: mysql dependencies

我正在使用8.0.15 MySQL,上面有几个存储过程。 “主”会调用其他程序,每个过程可能会(也可能不会)自己调用其他过程

我的目标是拥有一棵“过程树”,以记录它们被调用的顺序。

有关如何操作的任何想法?我当时想查询information_schema。ROUTINES表,只提取带有正则表达式的各种Call,以仅拥有过程的“骨骼”,例如:

MAIN_PROCEDURE
  CALL PCD2();
  CALL PCD3();
END;

PCD2
  CALL PCD4();
END;

然后,递归执行此操作,以便知道PCD2内部调用了PCD4。

我停留在第一部分,那么递归查询应该很简单

有帮助吗?当然,任何其他方法都可以!

预先感谢

2 个答案:

答案 0 :(得分:0)

想知道是否存在一种自动方法来处理不平衡数据。假设这是一个二进制分类问题,我想使用交叉验证,例如kfolds。 您是否知道是否有任何交叉验证技术不仅可以随机地随机整理数据,还可以尝试“均衡”训练集中的标签,使其为50%-50%? 仅仅因为模型具有更高的更改以从特定类中学习更多点,这将不会获得较高的准确度得分。

答案 1 :(得分:0)

尝试此代码。将您的数据库名称放在“ MyDataBase”中。

CREATE DEFINER = root @ localhost程序dependencias()     没有SQL;

BLOCK1:开始

DECLARE bas, c1 VARCHAR(50);
DECLARE fin int DEFAULT FALSE;
DECLARE cur1 CURSOR FOR SELECT  specific_name from information_schema.routines where routine_schema= bas;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET fin = TRUE;

SET  bas='MyDataBase';

DROP TABLE IF EXISTS dependencias;
CREATE  TABLE dependencias (a varchar(50), b varchar(50));
OPEN cur1;
rulo1: LOOP
FETCH cur1 INTO c1;
    IF fin THEN
        LEAVE rulo1;
    END IF;
    BLOCK2: BEGIN
        DECLARE can int; 
        DECLARE c2,cad varchar(50);
        DECLARE fin int DEFAULT FALSE;
        DECLARE cur2 CURSOR FOR SELECT  specific_name from information_schema.routines where routine_schema= bas; 
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET fin = TRUE;
        OPEN cur2;
        rulo2: LOOP
        FETCH cur2 INTO  c2;
            IF fin THEN
                LEAVE rulo2;
            END IF;
            SET cad=CONCAT ('%',c2,'(%');
                SET can=(SELECT COUNT(*) FROM information_schema.routines WHERE Routine_Name = c1 AND routines.routine_definition LIKE cad AND Routine_Schema = bas);
            IF c1!=c2 AND can>0 THEN
                INSERT INTO `dependencias` values (c1,c2);
            END IF;  
        END LOOP rulo2;
        CLOSE cur2; 
    END BLOCK2; 
END LOOP rulo1;
CLOSE cur1;

END BLOCK1