The execution of a statement seems to alter the variable defining the request

Viewed 21

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;"
0 Answers
Related