如何在 mysql 服务器中执行动态 Sql 字符串作为查询?
Posted
技术标签:
【中文标题】如何在 mysql 服务器中执行动态 Sql 字符串作为查询?【英文标题】:How to Execute Dynamic Sql String as a Query in mysql server? 【发布时间】:2018-11-07 21:29:52 【问题描述】:我创建了一个触发器,它创建一个动态查询。并执行它我曾尝试过“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
这是触发器 这是我制作的功能 退货换货( 子串( SUBSTRING_INDEX(str , delim , pos) , CHAR_LENGTH( SUBSTRING_INDEX(str , delim , pos - 1) ) + 1 ) , 脱脂, '' )
【问题讨论】:
使用准备语句 你应该添加 split_string 函数(我认为这不起作用) 我有我自己做的添加功能 这行不通 动态 sql 在触发器或存储函数中是不允许的。 if 的选项是什么 【参考方案1】:我编写了一个存储过程来执行动态构造的 sql 语句。
用法
SET @index := 7;
CALL eval(CONCAT('SELECT ', @index));
实施
DELIMITER $$
CREATE PROCEDURE eval(IN dynamic_statement TEXT)
BEGIN
SET @dynamic_statement := dynamic_statement;
PREPARE prepared_statement FROM @dynamic_statement;
EXECUTE prepared_statement;
DEALLOCATE PREPARE prepared_statement;
END$$
DELIMITER ;
【讨论】:
【参考方案2】:据我了解,您必须首先从您的字符串中制作一个准备好的语句才能执行它。所以下面的部分代码应该可以代替EXEC q
:
PREPARE thequery FROM q;
EXECUTE thequery;
【讨论】:
我也试过这个,但它不起作用。在 PREPARE thequery FROM q 处给出错误;【参考方案3】:使用prepare语句来执行你的动态查询
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
【讨论】:
动态 sql 是否在触发器或存储生产者中工作? 我已经做出了改变……试试看 仍然不允许在 PREPARE stmt FRom q2 行 @符号是什么意思?当我们使用它时以上是关于如何在 mysql 服务器中执行动态 Sql 字符串作为查询?的主要内容,如果未能解决你的问题,请参考以下文章