dimanche 3 juin 2018

MySql Database Stuck In Instruction ORDER BY RAND

So I have this university project where I have to create a database in MySql about managing Football competitions where I've got this procedure to fill in a full season, but it crashes half the time when I call it. I really don't know how that can be. I even sent it to a friend of mine who has a better PC and the crashing ratio gets even worse. The code segment is pasted down below if you want to take a closer look. The link is if you want to test the whole thing. Thanks in advance and I'm sorry the parameters are in portuguese. Thanks in advance. Link: https://codeshare.io/5zbb4W

    DROP PROCEDURE IF EXISTS create_jornada_primeira_volta;
    DELIMITER @

    CREATE PROCEDURE create_jornada_primeira_volta()
    BEGIN
    DECLARE xepoca, xcompeticao, xepoca2, xjornada, cnt, njogos INT;
    SELECT cod_epoca, cod_competicao INTO xepoca, xcompeticao FROM Epoca GROUP BY cod_epoca DESC LIMIT 1;
    SELECT num_jornada, cod_epoca INTO xjornada, xepoca2 FROM Jornada GROUP BY cod_epoca DESC LIMIT 1;
    IF (xepoca != xepoca2 OR xjornada IS NULL) THEN
        SET xjornada = 1;
    ELSE 
        SET xjornada = xjornada + 1;
    END IF;
    SELECT num_equipas(xcompeticao)/2 INTO njogos;
    SET cnt = 0;
    INSERT INTO Jornada VALUES (xjornada, xepoca, xcompeticao);
    WHILE (cnt != njogos) DO
        CALL create_jogo_primeira_volta;
        SET cnt = cnt + 1;
    END WHILE;
END;
@
DELIMITER ;

DROP PROCEDURE IF EXISTS create_jornada_segunda_volta;
DELIMITER @

CREATE PROCEDURE create_jornada_segunda_volta()
BEGIN
    DECLARE xepoca, xcompeticao, xjornada, cnt, njogos, xequipa_visitada, xequipa_visitante, xinfraestrutura, xequipa_arbitragem INT;
    SELECT cod_epoca, cod_competicao INTO xepoca, xcompeticao FROM Epoca GROUP BY cod_epoca DESC LIMIT 1;
    SELECT num_jornada INTO xjornada FROM Jornada GROUP BY num_jornada DESC LIMIT 1;
    SET xjornada = xjornada + 1;
    SELECT num_equipas(xcompeticao)/2 INTO njogos;
    SET cnt = 0;
    INSERT INTO Jornada VALUES (xjornada, xepoca, xcompeticao);
    WHILE (cnt != njogos) DO
        SELECT cod_visitado, cod_visitante 
            INTO xequipa_visitante, xequipa_visitada
            FROM Jogo 
            Where num_jornada = xjornada - (num_equipas(xcompeticao) * 2 - 2) / 2 AND cod_epoca = xepoca 
            ORDER BY cod_equipa_arbitragem
            LIMIT cnt,1;
        CALL create_equipa_arbitragem;
        SELECT cod_equipa_arbitragem INTO xequipa_arbitragem FROM Equipa_arbitragem GROUP BY cod_equipa_arbitragem DESC LIMIT 1;
        SELECT cod_infraestrutura INTO xinfraestrutura FROM Infraestrutura WHERE tipo = 'Estadio' AND cod_clube = (SELECT cod_clube FROM Equipa WHERE cod_equipa = xequipa_visitada);
        INSERT INTO Jogo VALUES (xepoca, xcompeticao, xjornada, xequipa_visitada, xequipa_visitante, xequipa_arbitragem, xinfraestrutura, null, null);
        SET cnt = cnt + 1;
    END WHILE;
END;
@
DELIMITER ;

DROP PROCEDURE IF EXISTS create_epoca;
DELIMITER @

CREATE PROCEDURE create_epoca()
BEGIN
    DECLARE ncompeticoes, cnt_comp, cnt_jornadas, nepoca, njornadas INT;
    SELECT COUNT(*) INTO ncompeticoes FROM Competicao;
    SET cnt_comp = 1;
    SELECT cod_epoca INTO nepoca FROM Epoca GROUP BY cod_epoca DESC LIMIT 1;
    IF nepoca IS NULL THEN
        SET nepoca = 1;
    ELSE 
        SET nepoca = nepoca + 1;
    END IF;
    WHILE (cnt_comp != (ncompeticoes + 1)) DO
        INSERT INTO Epoca VALUES (nepoca, cnt_comp, 2017, CURDATE(), null, null);
        SELECT ((num_equipas(cnt_comp) * 2 - 2) / 2) INTO njornadas;
        SET cnt_jornadas = 0;
        WHILE (cnt_jornadas < njornadas) DO 
            CALL create_jornada_primeira_volta;

            SET cnt_jornadas = cnt_jornadas + 1;
        END WHILE;
        SET cnt_jornadas = 0;
        WHILE (cnt_jornadas != njornadas) DO 
            CALL create_jornada_segunda_volta;
            SET cnt_jornadas = cnt_jornadas + 1;
        END WHILE;
        SET cnt_comp = cnt_comp + 1;
    END WHILE;
END;
@
DELIMITER ;




Aucun commentaire:

Enregistrer un commentaire