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;