MYSQL - 执行过程从表中执行语句

标签 mysql sql stored-procedures mariadb

我正在使用一个存储过程,该过程从表中获取查询并执行它们。 问题是我有一些带有单引号/双引号的查询,并且在执行它们时抛出错误。

程序

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$$

查询 更新urisegments as s内连接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, '"}') 其中 s.app_namespace = 'Shop' 和 s.primary_key_value like '%product_id%'; 抛出错误:< br/>
[42000][1064] 您的 SQL 语法有错误;请检查与您的 MySQL 服务器版本相对应的手册,以了解在 '{"product_id":"' 附近使用的正确语法, p.old_id, '"}') = s.primary_key_value 在第 1 行设置 s.primary_key_value '

解决方法#01
我已经尝试分别将单引号/双引号转义为 \'\" ,但它会引发另一个错误: [42000][1064] 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 '\'{\"product_id\":\"\', p.old_id,\'\"}\') = s.primary_key_value set s 附近使用的正确语法.primary_k' 在第 1 行

最佳答案

不要尝试将查询连接到 SQL 中。准备好的语句可以包含占位符,您在使用 EXECUTE 语句时填写这些占位符。

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

关于MYSQL - 执行过程从表中执行语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52863527/

相关文章:

一进多出Oracle Run Procedure

使用 GROUP BY 在 MySQL 中进行 SQL 查询

javascript - MySQL : Create table comparison product

mysql替换位置处的字符

sql - 删除真费时!数据库

sql - LEFT JOIN 使用子查询不返回空结果为 "0"

sql-server - 从 Sql Server 2008 执行 Oracle 存储过程

mysql - MySQL 中的 DataDir 是什么?

mysql - 选择重复项并保留最旧的(不基于 ID)

php - 如何使按钮隐藏并在一定日期后显示?