Как выполнить динамическую строку Sql как запрос на сервере MySQL? - PullRequest
0 голосов
/ 29 мая 2018

Я создал триггер, который создает динамический запрос. И выполнил его. Я пытался «EXECU q», но он не работает.Как я могу запустить / выполнить этот динамический запрос.

BEGIN
    DECLARE a INT Default 0 ;
    DECLARE str  VARCHAR(255);
    DECLARE q VARCHAR(500);

    SET q = 'insert into '+new.master_name+' values(';

    simple_loop: LOOP
        SET a=a+1; 
        SET str = SPLIT_STRING(new.remarks,"|",a); 
        SET q = CONCAT(q,str+',');
        SET q = LEFT(q, LENGTH(q) - 1);
        IF str='' THEN
                LEAVE simple_loop; 
            END IF;


    END LOOP simple_loop; 
    SET q = CONCATE(q,');');

    EXEC q
END

Это Trigerr, это функция, которую я сделал ВОЗВРАТ ЗАМЕНИТЬ (SUBSTRING (SUBSTRING_INDEX (str, delim, pos), CHAR_LENGTH (SUBSTRING_INDEX (str, delim,pos - 1)) + 1), delim, '')

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

используйте оператор подготовки для выполнения динамического запроса

BEGIN
    DECLARE a INT Default 0 ;
    DECLARE str  VARCHAR(255);
    DECLARE q VARCHAR(500);
    DECLARE q1 VARCHAR(500);
    DECLARE q2 VARCHAR(500);

    SET @q = 'insert into '+new.master_name+' values(';

    simple_loop: LOOP
        SET a=a+1; 
        SET str = SPLIT_STRING(new.remarks,"|",a); 
        SET q = CONCAT(@q,str+',');
        SET q1 = LEFT(q, LENGTH(q) - 1);
        IF str='' THEN
                LEAVE simple_loop; 
            END IF;


    END LOOP simple_loop; 

    SET q2 = CONCATE(q1,');');
    PREPARE stmt FROM q2;
    EXECecute stmt;
    deallocate PREPARE stmt;
END
0 голосов
/ 20 октября 2018

Я написал хранимую процедуру для выполнения динамически созданных операторов SQL.

Использование

SET @index := 7;
CALL statement(CONCAT('SELECT ', @index));

Реализация

CREATE PROCEDURE statement(IN dynamic_statement TEXT)
  BEGIN
      SET @dynamic_statement := dynamic_statement;
      PREPARE prepared_statement FROM @dynamic_statement;
      EXECUTE prepared_statement;
      DEALLOCATE PREPARE prepared_statement;
  END
;
0 голосов
/ 29 мая 2018

Насколько я понимаю, вы должны сначала подготовить оператор из вашей строки, чтобы выполнить его.Поэтому следующий частичный код должен работать вместо EXEC q:

PREPARE thequery FROM q;
EXECUTE thequery;
...