DROP PROCEDURE IF EXISTS `procedure_foo`; DELIMITER $$ CREATE PROCEDURE `procedure_foo`() BEGIN DECLARE done INTEGER DEFAULT FALSE; DECLARE token_id, membership_id, membership_domain_id, type_id INTEGER; DECLARE membership_name VARCHAR(60); DECLARE cur CURSOR FOR SELECT `id`, `name`, `domain_id` FROM `sf_membership`; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; SELECT id INTO type_id FROM `acme_token_type` WHERE `name` = 'in_membership' LIMIT 1; OPEN cur; read_loop: LOOP FETCH cur INTO membership_id, membership_name, membership_domain_id; IF done THEN LEAVE read_loop; END IF; -- Double Insert Protection. SELECT COUNT(id) INTO token_id FROM `acme_token_entry` WHERE `token` IN (CONCAT('in_membership_', membership_id, '_active'), CONCAT('in_membership_', membership_id, '_pending'), CONCAT('in_membership_', membership_id, '_rejected')) LIMIT 1; IF token_id > 0 THEN ITERATE read_loop; END IF; -- Insert tokens: INSERT INTO `acme_token_entry` (`type_id`, `domain_id`, `is_system`, `token`, `label`, `access_level`) VALUES (type_id, membership_domain_id, 0, CONCAT('in_membership_', membership_id, '_active'), CONCAT('Active In Membership ', membership_name), 0), (type_id, membership_domain_id, 0, CONCAT('in_membership_', membership_id, '_pending'), CONCAT('Pending In Membership ', membership_name), 0), (type_id, membership_domain_id, 0, CONCAT('in_membership_', membership_id, '_rejected'), CONCAT('Rejected In Membership ', membership_name), 0); END LOOP; CLOSE cur; END $$ delimiter ; CALL procedure_foo(); DROP PROCEDURE procedure_foo;