Загрузка данных


use db_4991_07_pr;

DELIMITER $$
DROP PROCEDURE IF EXISTS CalcExpression$$
CREATE PROCEDURE CalcExpression(IN a INT, IN b INT, IN c INT, OUT res INT)
BEGIN
    SET res = (a + b) * c;
END$$
DELIMITER ;

DELIMITER $$
DROP PROCEDURE IF EXISTS GetStudentsByTeam$$
CREATE PROCEDURE GetStudentsByTeam(IN team_name VARCHAR(50))
BEGIN
    SELECT s.* 
    FROM STUDENT s
    JOIN TEAM t ON s.team = t.id
    WHERE t.team = team_name;
END$$
DELIMITER ;

DELIMITER $$
DROP PROCEDURE IF EXISTS ManageStudents$$
CREATE PROCEDURE ManageStudents(
    IN operation VARCHAR(10),
    IN student_id INT,
    IN last_name VARCHAR(50),
    IN first_name VARCHAR(50),
    IN birth_year INT,
    IN gender CHAR(1),
    IN team_id INT
)
BEGIN
    IF operation = 'insert' THEN
        INSERT INTO STUDENT (id, lastName, name, yearBirth, gender, team)
        VALUES (student_id, last_name, first_name, birth_year, gender, team_id);
    ELSEIF operation = 'update' THEN
        UPDATE STUDENT 
        SET lastName = last_name, name = first_name, yearBirth = birth_year, 
            gender = gender, team = team_id
        WHERE id = student_id;
    ELSEIF operation = 'delete' THEN
        DELETE FROM STUDENT WHERE id = student_id;
    END IF;
END$$
DELIMITER ;

DELIMITER $$
DROP PROCEDURE IF EXISTS Count_rabota$$
CREATE PROCEDURE Count_rabota(OUT total INT)
BEGIN
    SELECT COUNT(*) INTO total FROM WORK;
END$$
DELIMITER ;

DELIMITER $$
DROP PROCEDURE IF EXISTS PR_nm$$
CREATE PROCEDURE PR_nm(IN shifr VARCHAR(20), OUT nm VARCHAR(100))
BEGIN
    SELECT topic INTO nm FROM PROJECT WHERE shifr = shifr;
END$$
DELIMITER ;

DELIMITER $$
DROP PROCEDURE IF EXISTS GetProjectByWorkCode$$
CREATE PROCEDURE GetProjectByWorkCode(IN work_id INT, OUT project_name VARCHAR(100))
BEGIN
    DECLARE proj_shifr VARCHAR(20);
    SELECT project INTO proj_shifr FROM WORK WHERE id = work_id;
    CALL PR_nm(proj_shifr, project_name);
END$$
DELIMITER ;

DELIMITER $$
DROP PROCEDURE IF EXISTS Count_rabota_filtered$$
CREATE PROCEDURE Count_rabota_filtered(
    IN team_code INT, 
    IN project_shifr VARCHAR(20), 
    OUT total INT
)
BEGIN
    SELECT COUNT(*) INTO total 
    FROM WORK 
    WHERE (team = team_code OR team_code IS NULL)
      AND (project = project_shifr OR project_shifr IS NULL);
END$$
DELIMITER ;

DELIMITER $$
DROP PROCEDURE IF EXISTS selectd$$
CREATE PROCEDURE selectd(IN p_gender CHAR(1))
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        SELECT 'Ошибка: неверные данные' AS error_message;
    END;
    
    IF p_gender NOT IN ('M', 'F') THEN
        SELECT 'Ошибка: пол должен быть M или F' AS error_message;
    ELSE
        SELECT t.*, s.lastName, s.name
        FROM TEAM t
        JOIN STUDENT s ON t.lider = s.id
        WHERE s.gender = p_gender;
    END IF;
END$$
DELIMITER ;

DELIMITER $$
DROP PROCEDURE IF EXISTS GetInf$$
CREATE PROCEDURE GetInf(IN project_shifr VARCHAR(20))
BEGIN
    SELECT shifr, topic, project, dateStart, dateFinish, duration, cost
    FROM PROJECT
    WHERE shifr = project_shifr;
END$$
DELIMITER ;

DELIMITER $$
DROP PROCEDURE IF EXISTS ZU$$
CREATE PROCEDURE ZU(IN team_code INT)
BEGIN
    DECLARE student_count INT;
    
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        SELECT 'Ошибка: команда не найдена' AS error_message;
    END;
    
    SELECT COUNT(*) INTO student_count
    FROM STUDENT
    WHERE team = team_code;
    
    SELECT team_code AS kod_komandy, student_count AS kolichestvo_studentov;
END$$
DELIMITER ;

DELIMITER $$
DROP PROCEDURE IF EXISTS PrintDateNTimes$$
CREATE PROCEDURE PrintDateNTimes(IN n INT)
BEGIN
    DECLARE i INT DEFAULT 0;
    
    WHILE i < n DO
        SELECT NOW() AS current_date;
        SET i = i + 1;
    END WHILE;
END$$
DELIMITER ;

DELIMITER $$
DROP PROCEDURE IF EXISTS FormatZadacha$$
CREATE PROCEDURE FormatZadacha(IN num INT, OUT result VARCHAR(50))
BEGIN
    DECLARE last_digit INT;
    DECLARE last_two_digits INT;
    
    SET last_digit = num % 10;
    SET last_two_digits = num % 100;
    
    IF last_two_digits >= 11 AND last_two_digits <= 14 THEN
        SET result = CONCAT(num, ' задач');
    ELSEIF last_digit = 1 THEN
        SET result = CONCAT(num, ' задача');
    ELSEIF last_digit >= 2 AND last_digit <= 4 THEN
        SET result = CONCAT(num, ' задачи');
    ELSE
        SET result = CONCAT(num, ' задач');
    END IF;
END$$
DELIMITER ;

DELIMITER $$
DROP PROCEDURE IF EXISTS GetProjectCost$$
CREATE PROCEDURE GetProjectCost(IN proj_shifr VARCHAR(20), IN c INT)
BEGIN
    IF c = 1 THEN
        SELECT project, cost * 2 AS doubled_cost
        FROM PROJECT
        WHERE shifr = proj_shifr;
    ELSE
        SELECT project, cost
        FROM PROJECT
        WHERE shifr = proj_shifr;
    END IF;
END$$
DELIMITER ;

DELIMITER $$
DROP PROCEDURE IF EXISTS TeamProjectsCount$$
CREATE PROCEDURE TeamProjectsCount(IN team_code INT)
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE proj_shifr VARCHAR(20);
    DECLARE task_count INT;
    
    DECLARE cur CURSOR FOR
        SELECT project, COUNT(*)
        FROM WORK
        WHERE team = team_code
        GROUP BY project;
    
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    
    CREATE TEMPORARY TABLE IF NOT EXISTS temp_results (
        project_shifr VARCHAR(20),
        tasks_count INT
    );
    
    OPEN cur;
    
    read_loop: LOOP
        FETCH cur INTO proj_shifr, task_count;
        IF done THEN
            LEAVE read_loop;
        END IF;
        INSERT INTO temp_results VALUES (proj_shifr, task_count);
    END LOOP;
    
    CLOSE cur;
    
    SELECT * FROM temp_results;
    DROP TEMPORARY TABLE temp_results;
END$$
DELIMITER ;

DELIMITER $$
DROP PROCEDURE IF EXISTS CheckProjectStage$$
CREATE PROCEDURE CheckProjectStage()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE team_name VARCHAR(100);
    DECLARE proj_name VARCHAR(100);
    DECLARE start_date DATE;
    DECLARE finish_date DATE;
    DECLARE duration_days INT;
    DECLARE result VARCHAR(20);
    
    DECLARE cur CURSOR FOR
        SELECT t.team, p.project, p.dateStart, p.dateFinish, p.duration
        FROM WORK w
        JOIN TEAM t ON w.team = t.id
        JOIN PROJECT p ON w.project = p.shifr;
    
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    
    CREATE TEMPORARY TABLE IF NOT EXISTS temp_stage_results (
        team_name VARCHAR(100),
        project_name VARCHAR(100),
        stage_result VARCHAR(20)
    );
    
    OPEN cur;
    
    read_loop: LOOP
        FETCH cur INTO team_name, proj_name, start_date, finish_date, duration_days;
        IF done THEN
            LEAVE read_loop;
        END IF;
        
        IF DATEDIFF(finish_date, start_date) <= duration_days THEN
            SET result = 'Прошёл';
        ELSE
            SET result = 'Не прошёл';
        END IF;
        
        INSERT INTO temp_stage_results VALUES (team_name, proj_name, result);
    END LOOP;
    
    CLOSE cur;
    
    SELECT * FROM temp_stage_results;
    DROP TEMPORARY TABLE temp_stage_results;
END$$
DELIMITER ;

DELIMITER $$
DROP PROCEDURE IF EXISTS GetCompletedProjectsByYear$$
CREATE PROCEDURE GetCompletedProjectsByYear(IN year INT, OUT project_list TEXT)
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE proj_shifr VARCHAR(20);
    DECLARE start_date DATE;
    DECLARE finish_date DATE;
    DECLARE duration_days INT;
    
    DECLARE cur CURSOR FOR
        SELECT shifr, dateStart, dateFinish, duration
        FROM PROJECT
        WHERE YEAR(dateFinish) = year;
    
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    
    SET project_list = '';
    
    OPEN cur;
    
    read_loop: LOOP
        FETCH cur INTO proj_shifr, start_date, finish_date, duration_days;
        IF done THEN
            LEAVE read_loop;
        END IF;
        
        IF DATEDIFF(finish_date, start_date) <= duration_days THEN
            IF project_list = '' THEN
                SET project_list = proj_shifr;
            ELSE
                SET project_list = CONCAT(project_list, ', ', proj_shifr);
            END IF;
        END IF;
    END LOOP;
    
    CLOSE cur;
END$$
DELIMITER ;