DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`creditRecovery`() BEGIN DECLARE EXIT HANDLER FOR SQLSTATE '45000' BEGIN ROLLBACK; RESIGNAL; END; START TRANSACTION; UPDATE `client` c JOIN payMethod pm ON pm.id = c.payMethodFk SET c.credit = 0 WHERE pm.`code` = 'card'; DROP TEMPORARY TABLE IF EXISTS tCreditClients; CREATE TEMPORARY TABLE tCreditClients SELECT clientFk, IF (credit > recovery ,credit - recovery,0) newCredit FROM ( SELECT r.clientFk, r.amount recovery, timestampadd(DAY, r.period, sub2.created) deadLine, sub2.amount credit FROM recovery r JOIN ( SELECT clientFk, amount , created FROM ( SELECT * FROM clientCredit ORDER BY created DESC LIMIT 10000000000000000000 ) sub GROUP BY clientFk ) sub2 ON sub2.clientFk = r.clientFk WHERE r.finished IS NULL OR r.finished >= util.VN_CURDATE() GROUP BY r.clientFk HAVING deadLine <= util.VN_CURDATE() ) sub3 WHERE credit > 0; UPDATE client c JOIN tCreditClients cc ON cc.clientFk = c.clientFk SET c.credit = newCredit; DROP TEMPORARY TABLE tCreditClients; COMMIT; END$$ DELIMITER ;