I am facing a problem that I can't solve or explain.
My goal:
Create a stored procedure for MySQL to execute action like explode/split function in order to use the result of this procedure as a table.
My Procedure :
DROP PROCEDURE IF EXISTS `P_string_split`;
DELIMITER |
CREATE PROCEDURE
P_string_split(IN p_delimiter TEXT, IN p_text TEXT, IN p_limit INT, IN out_table_name TEXT)
BEGIN
DECLARE var_str_text TEXT;
DECLARE var_str_index INT;
DECLARE var_delimiter TEXT;
SET var_delimiter = p_delimiter;
SET var_str_index = 1;
DROP TABLE IF EXISTS TT_P_string_split;
CREATE TEMPORARY TABLE TT_P_string_split
(
str_index INT PRIMARY KEY,
str_text TEXT
);
while(LENGTH(p_text) > 0 AND (p_limit = 0 OR (p_limit > 0 AND p_limit > var_str_index)))
DO
SET var_str_text = SUBSTRING_INDEX(p_text, var_delimiter, 1);
INSERT INTO TT_P_string_split (str_index, str_text) VALUES (var_str_index, var_str_text);
SET var_str_index = var_str_index + 1;
SET p_text = SUBSTRING(p_text, LENGTH(var_str_text) + LENGTH(var_delimiter) + 1);
END WHILE;
IF LENGTH(p_text) > 0 THEN
INSERT INTO TT_P_string_split (str_index, str_text) VALUES (var_str_index, p_text);
END IF;
SET @QUERY_TMP = CONCAT('
DROP TABLE IF EXISTS `',out_table_name,'`;
CREATE TEMPORARY TABLE `',out_table_name,'` (
`str_index` INT PRIMARY KEY,
`str_text` TEXT );
INSERT INTO ',out_table_name,' (str_index,str_text)
SELECT str_index,str_text
FROM TT_P_string_split;');
# Area with problems
# ==================================
SELECT @QUERY_TMP;
PREPARE stmt FROM @QUERY_TMP;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
# ==================================
END |
DELIMITER ;
Execution command :
CALL P_string_split(',', 'plop,plip,plup,plap', 0, 'PLOUP');
Problem is located in : "Area with problems" named after FAREA
If the code in the FAREA is as follows (Variation 1) :
SELECT @QUERY_TMP;
# PREPARE stmt FROM @QUERY_TMP;
# EXECUTE stmt;
# DEALLOCATE PREPARE stmt;
The output is :
@QUERY_TMP
===============================================================
DROP TABLE IF EXISTS `PLOUP`;
CREATE TEMPORARY TABLE `PLOUP` (
`str_index` INT PRIMARY KEY,
`str_text` TEXT );
INSERT INTO PLOUP (str_index,str_text)
SELECT str_index,str_text
FROM TT_P_string_split;
But if the code in the FAREA is complete (Variation 2) :
SELECT @QUERY_TMP;
PREPARE stmt FROM @QUERY_TMP;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
The output is :
@QUERY_TMP
===============================================================
<No row>
And and error is throw :
[42000][1064] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CREATE TEMPORARY TABLE `PLOUP` (
`str_index` INT PRIMARY KEY,
' at line 2
I have the impression that the addition of the statement executing part truncates the value of my variable.
Am I missing something?
Thanks in advance.
Edit 1 :
This query :
SELECT *
FROM performance_schema.user_variables_by_thread
WHERE VARIABLE_NAME = 'QUERY_TMP';
Return :
2440,QUERY_TMP,"
DROP TABLE IF EXISTS `PLOUP`;
CREATE TEMPORARY TABLE `PLOUP` (
`str_index` INT PRIMARY KEY,
`str_text` TEXT );
INSERT INTO PLOUP (str_index,str_text)
SELECT str_index,str_text
FROM TT_P_string_split;"