MYSQL - Выполнить процедуру для выполнения оператора из таблицы - PullRequest
0 голосов
/ 17 октября 2018

Я работаю в хранимой процедуре, которая извлекает запросы из таблицы и выполняет их.Проблема в том, что у меня есть несколько запросов с одинарными / двойными кавычками, и при их выполнении выдается ошибка.

Процедура

delimiter $$
drop procedure if exists run_change_ids_queries$$
create procedure run_change_ids_queries()
  begin

    declare s_query TEXT;

    declare done bool default false;
    declare c_queries cursor for
      select `query` from `queries` WHERE `executed` = 0 ORDER BY `qry_id` ASC;
    declare continue handler for not found set done = true;

    open c_queries;
    read_loop: loop

      fetch c_queries into s_query;
      if done then
        leave read_loop;
      end if;

      -- run the query
      set @sql = s_query;
      prepare stmt from @sql;
      execute stmt;
      deallocate prepare stmt;

      -- update executed flag on query
      set @update = CONCAT('UPDATE `queries` SET `executed` = 1 WHERE `query` LIKE \'',@sql,'\';');
      prepare stmt from @update;
      execute stmt;
      deallocate prepare stmt;
    end loop;
  end$$

Запрос update urisegments as s inner join change_product_ids as p on concat('{"product_id":"', p.old_id, '"}') = s.primary_key_value set s.primary_key_value = CONCAT('{"product_id":', p.new_id, '"}') where s.app_namespace = 'Shop' and s.primary_key_value like '%product_id%'; выдает ошибку:

[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 '{"product_id":"', p.old_id, '"}') = s.primary_key_value set s.primary_key_value ' at line 1

Обходной путь # 01 Я уже пытался экранировать одинарные / двойные кавычки в \' и \" соответственно, но выдает еще одну ошибку: [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 '\'{\"product_id\":\"\', p.old_id, \'\"}\') = s.primary_key_value set s.primary_k' at line 1.

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Оператор не экранирован.Все одинарные / двойные кавычки должны быть экранированы.

update urisegments as s
inner join change_product_ids as p on concat(\'{\"product_id\":\"\', p.old_id, \'\"}\') = s.primary_key_value
set s.primary_key_value = CONCAT(\'{\"product_id\":\', p.new_id, \'\"}\')
where s.app_namespace = \'Shop\' and s.primary_key_value like \'%product_id%\';
0 голосов
/ 25 октября 2018

Вместо проверки запроса, проверьте его идентификатор:

... WHERE qry_id = ?

(Добавьте этот столбец к исходному SELECT.)

0 голосов
/ 18 октября 2018

Не пытайтесь объединить запрос в SQL.Подготовленные операторы могут содержать заполнители, которые вы заполняете при использовании оператора EXECUTE.

set @update = 'UPDATE `queries` SET `executed` = 1 WHERE `query` = ?');
prepare stmt from @update;
execute stmt USING @sql;
...