refactor(SQL): Staging tables and Calc stored procedures used for modular stored procedure archicture for scalability. Implemented for Product Catalogue. \n BREAKING CHANGE: BIT argument a_debug added to all but basic stored procedures for analysis of performance and results.
This commit is contained in:
@@ -1,52 +1,47 @@
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|
||||
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_guid BINARY(36)
|
||||
, IN a_string LONGTEXT
|
||||
, IN a_separator VARCHAR(1000)
|
||||
-- IN a_allow_empty BIT
|
||||
, IN a_debug 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);
|
||||
DECLARE v_time_start TIMESTAMP(6);
|
||||
|
||||
|
||||
-- Argument validation + default values
|
||||
SET v_time_start := CURRENT_TIMESTAMP(6);
|
||||
SET a_string := IFNULL(a_string, '');
|
||||
SET a_separator := IFNULL(a_separator, '');
|
||||
SET a_debug := IFNULL(a_debug, 0);
|
||||
|
||||
IF a_debug = 1 THEN
|
||||
SELECT
|
||||
a_guid
|
||||
, a_string
|
||||
, a_separator
|
||||
, a_debug
|
||||
;
|
||||
END IF;
|
||||
|
||||
-- Temporary tables
|
||||
DROP TABLE IF EXISTS Split_Temp;
|
||||
CALL p_validate_guid ( a_guid );
|
||||
|
||||
CREATE TABLE Split_Temp (
|
||||
DROP TABLE IF EXISTS tmp_Split_Split;
|
||||
|
||||
CREATE TEMPORARY TABLE tmp_Split_Split (
|
||||
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;
|
||||
|
||||
@@ -57,40 +52,51 @@ BEGIN
|
||||
|
||||
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);
|
||||
INSERT INTO tmp_Split_Split (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));
|
||||
INSERT INTO tmp_Split_Split (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
|
||||
;
|
||||
*/
|
||||
IF EXISTS (SELECT * FROM tmp_Split_Split LIMIT 1) THEN
|
||||
START TRANSACTION;
|
||||
INSERT INTO Split_Temp (
|
||||
guid
|
||||
, display_order
|
||||
, substring
|
||||
)
|
||||
SELECT
|
||||
a_guid
|
||||
, display_order
|
||||
, substring
|
||||
FROM tmp_Split_Split
|
||||
;
|
||||
COMMIT;
|
||||
END IF;
|
||||
|
||||
IF a_debug = 1 THEN
|
||||
CALL p_debug_timing_reporting ( v_time_start );
|
||||
END IF;
|
||||
END //
|
||||
DELIMITER ;;
|
||||
|
||||
/*
|
||||
|
||||
/*
|
||||
CALL p_split (
|
||||
'noods, cheese ', # a_string
|
||||
',' # a_separator
|
||||
'nips'
|
||||
, 'noods, cheese ' # a_string
|
||||
, ',' # a_separator
|
||||
# '0', # a_allow_empty
|
||||
, 1
|
||||
);
|
||||
|
||||
SELECT *
|
||||
FROM SPLIT_TEMP;
|
||||
FROM Split_Temp
|
||||
WHERE GUID = 'nips';
|
||||
|
||||
CALL p_clear_split_temp( 'nips' );
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user