如何执行存储在表中的MySQL更新语句?嵌套PREPARE语句失败求助
问题
我需要执行存储在某张表中的UPDATE语句,流程是先查询存储该语句的行获取内容,再执行这条UPDATE语句。
我试过用PREPARE和EXECUTE组合,但只能执行第一条查询语句,把语句嵌套进子查询时直接失败。
能正常运行的语句:
PREPARE prepared_stmt1 from "SELECT UPDATE_STATEMENT FROM FIRST_TABLE WHERE ID = 12345"; EXECUTE prepared_stmt1;
执行后返回的数据示例:
UPDATE SECOND_TABLE SET THIS = THAT
我想执行这条返回的UPDATE语句,试了多种嵌套写法都失败,比如:
PREPARE prepared_stmt2 from (PREPARE prepared_stmt1 from "SELECT UPDATE_STATEMENT FROM FIRST_TABLE WHERE ID = 12345"; EXECUTE prepared_stmt1); EXECUTE prepared_stmt2;
解决方法
在MySQL这类数据库中,不能直接嵌套PREPARE和EXECUTE语句,得用用户变量先存储查询到的UPDATE语句,再动态执行:
- 先把查询到的UPDATE语句存入变量:
SELECT UPDATE_STATEMENT INTO @update_sql FROM FIRST_TABLE WHERE ID = 12345;
- 用
PREPARE和EXECUTE执行这个变量里的语句:
PREPARE prepared_stmt FROM @update_sql; EXECUTE prepared_stmt; DEALLOCATE PREPARE prepared_stmt; -- 可选,释放预处理语句资源
如果是在存储过程里执行,写法更简洁:
DELIMITER // CREATE PROCEDURE run_stored_update() BEGIN DECLARE update_sql TEXT; SELECT UPDATE_STATEMENT INTO update_sql FROM FIRST_TABLE WHERE ID = 12345; SET @sql = update_sql; PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END // DELIMITER ; -- 调用存储过程 CALL run_stored_update();
注意:这种动态执行SQL的方式要做好权限控制和SQL注入防护,确保存储的UPDATE语句是可信的。
内容的提问来源于stack exchange,提问作者Miket46
相关产品推荐
相关产品推荐

