USE PARTSLTD_PROD; /* CALL p_split ( 'noods, chees', ',' ) */ -- Clear previous proc DROP PROCEDURE IF EXISTS p_split; DELIMITER // CREATE PROCEDURE p_split ( IN a_string VARCHAR(4000), IN a_separator VARCHAR(5) -- IN a_allow_empty BIT ) BEGIN -- Argument redeclaration -- Variable declaration DECLARE v_has_string BIT; DECLARE v_has_separator BIT; DECLARE v_i_separator INT; DECLARE v_i_start INT; DECLARE v_i_end INT; DECLARE v_current_item VARCHAR(4000); -- Argument validation + default values IF a_string IS NULL THEN SET a_string = ''; ELSE SET a_string = TRIM(a_string); END IF; IF a_separator IS NULL THEN SET a_separator = ''; ELSE SET a_separator = TRIM(a_separator); END IF; /* IF a_allow_empty IS NULL THEN SET a_allow_empty = 0; END IF; */ -- Temporary tables DROP TABLE IF EXISTS Split_Temp; CREATE TABLE Split_Temp ( display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT, substring VARCHAR(4000) NOT NULL ); -- Parse filters SET v_has_string = CASE WHEN a_string = '' THEN 0 ELSE 1 END; SET v_has_separator = CASE WHEN a_separator = '' THEN 0 ELSE 1 END; IF (v_has_string AND v_has_separator) THEN SET v_i_start = 1; SET v_i_end = LOCATE(',', a_string); WHILE v_i_end > 0 DO SET v_current_item = SUBSTRING(a_string, v_i_start, v_i_end - v_i_start); INSERT INTO Split_Temp (substring) VALUES (v_current_item); SET v_i_start = v_i_end + 1; SET v_i_end = LOCATE(',', a_string, v_i_start); END WHILE; SET v_current_item = SUBSTRING(a_string, v_i_start); INSERT INTO Split_Temp (substring) VALUES (TRIM(v_current_item)); END IF; /* -- Select the results from the temporary table SELECT * FROM Split_Temp; # Return arguments for test SELECT a_string, a_separator -- a_allow_empty ; */ END // DELIMITER ; /* CALL p_split ( 'noods, cheese ', # a_string ',' # a_separator # '0', # a_allow_empty ); SELECT * FROM SPLIT_TEMP; */