DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_recalcByScope`( vScope VARCHAR(255), vId INT ) BEGIN /** * Recalculates tickets in an scope. * * @param vScope The scope name * @param vId The scope id */ DECLARE vDone BOOL; DECLARE vTicketFk INT; DECLARE cTickets CURSOR FOR SELECT DISTINCT t.id FROM ticket t LEFT JOIN tItems ti ON ti.id = t.id WHERE t.refFk IS NULL AND ((vScope = 'client' AND t.clientFk = vId) OR (vScope = 'address' AND t.addressFk = vId) OR (vScope = 'item' AND ti.id) ); DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; CREATE OR REPLACE TEMPORARY TABLE tItems (PRIMARY KEY (id)) ENGINE = MEMORY SELECT DISTINCT t.id FROM ticket t JOIN sale s ON s.ticketFk = t.id JOIN itemTaxCountry itc ON itc.itemFk = s.itemFk WHERE t.refFk IS NULL AND (vScope = 'item' AND itc.itemFk = vId); OPEN cTickets; myLoop: LOOP SET vDone = FALSE; FETCH cTickets INTO vTicketFk; IF vDone THEN LEAVE myLoop; END IF; CALL ticket_recalc(vTicketFk, NULL); END LOOP; CLOSE cTickets; DROP TEMPORARY TABLE tItems; END$$ DELIMITER ;