Таблиця k_contract ідентична
Твердження невірне, оскільки, наприклад, на скріні назва першої колонки "contract_num", а в скрипті Create Table перша колонка називається "num_contract", і т.д.
Якщо ж взяти за постулат що назви співпадають, то нижче дещо видозмінив код для врахування колонки "type_contract", потестував - працює:
drop table if exists k_contract;
/*create table k_contract (contract_date date, contract_type boolean);*/
CREATE TABLE k_contract (
num_contract INT not null auto_increment primary key, -- номер контракту
date_contract DATE, -- дата контракту
type_contract ENUM ('A', 'B', 'C'), -- тип контракту
k_firm_firm_num INT,
k_staff_staff_num INT
);
Insert Into k_contract (num_contract, date_contract, type_contract)
Select 1 as num_contract, curdate() - interval 1 month as date_contract, 'A' as type_contract Union All
Select 2 as num_contract, curdate() - interval 2 month as date_contract, 'B' as type_contract Union All
Select 3 as num_contract, curdate() - interval 3 month as date_contract, 'C' as type_contract;
drop table if exists interim;
/*create table interim (contract_date date, contract_type boolean);*/
CREATE TABLE interim (
num_contract INT not null auto_increment primary key, -- номер контракту
date_contract DATE, -- дата контракту
type_contract ENUM ('A', 'B', 'C') -- тип контракту
);
Drop PROCEDURE if exists delete_contracts_by_date;
CREATE PROCEDURE delete_contracts_by_date (v_date DATE)
BEGIN
DECLARE p_date DATE;
DECLARE p_type ENUM ('A', 'B', 'C');
DECLARE p_num INT;
DECLARE finished NUMERIC(1);
DECLARE my_cursor CURSOR
FOR SELECT num_contract, date_contract, type_contract FROM k_contract Order By date_contract Desc;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
OPEN my_cursor; -- відкриваємо курсор
FETCH my_cursor INTO p_num, p_date, p_type; -- читаємо перший рядок
IF p_date < v_date THEN
SET finished = 0;
WHILE( finished != 1) DO
INSERT INTO interim (num_contract, date_contract, type_contract)
SELECT p_num, p_date, p_type;
DELETE FROM k_contract
WHERE num_contract = p_num and date_contract = p_date and type_contract = p_type;
FETCH my_cursor INTO p_num, p_date, p_type; -- читаємо наступний рядок
END WHILE;
CLOSE my_cursor; -- закриваємо курсор
END IF;
END
call delete_contracts_by_date ( curdate() );
Select * From k_contract;
/*
No results found
*/
Select * From interim;
/*
num_contract,date_contract,type_contract
1,2020-11-10,A
2,2020-10-10,B
3,2020-09-10,C
*/
Із неспівпадінням назв колонок пропоную розібратися самостійно.
----
▼Upd: зовнішні ключі
Upd: Про зовнішні ключі в описі недостатньо деталізовано, можливо інші таблиці посилаються на k_contract? Якщо так, то потрібно видозмінити ключі on delete cascade або ж спочатку видаляти дані з дочірніх таблиць.