gpt4 book ai didi

mysql - 在存储过程中使用动态 SQL 的解决方法是什么

转载 作者:可可西里 更新时间:2023-11-01 06:36:00 25 4
gpt4 key购买 nike

存储过程

DELIMITER $$

CREATE PROCEDURE `lms`.`leads_to_bak` ()
BEGIN
SET @table1 = (SELECT `tabler_name` FROM `sets` WHERE `on_off`=0 LIMIT 1);
SET @table2 = CONCAT(@table1, '_bak');
SET @SQL1 = CONCAT('INSERT INTO ',@table2, '(', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), 'lead_id,', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @table2), ')', ' SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), 'lead_id,', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @table1), ' FROM ', @table1);
PREPARE stmt FROM @sql1;
EXECUTE stmt;
END$$

DELIMITER ;

触发器

DELIMITER $$
USE `lms`$$

CREATE TRIGGER `lms`.`after_insert_into_leads`
AFTER INSERT ON `sets` FOR EACH ROW
BEGIN
CALL lms.leads_to_bak();
END$$

DELIMITER ;

问题

我收到一个错误代码:1336。存储函数或触发器中不允许使用动态 SQL 错误消息,当生成一个 INSERT 时,暗示会执行触发器和存储过程。我假设问题出在此处的动态 SQL:

PREPARE stmt FROM @sql1;
EXECUTE stmt;

我环顾四周,有一个 thread关于stackoverflow上的问题,但是没有答案。有人对合理的解决方法有任何建议吗?

最佳答案

对于 MySQL 函数中缺少动态 SQL,没有好的解决方法,只有笨拙的问题。有些事情仍然完全无法解决,例如在 SQL 查询中使用动态计算的字段名或表名。是的,偶尔需要做这种事情!

并且不要尝试通过将动态 SQL 放入存储过程并包装在函数或触发器中来作弊,因为问题提出者曾尝试过 - MySQL 太聪明了,通常会给你模糊的错误消息。相信我,我去过所有的房子。

来自 Oracle PL/SQL 和 MS SQL Server 背景,我非常怀念 PL/SQL 和(在小范围内)T-SQL 为编写过程 SQL 提供的丰富功能。

关于mysql - 在存储过程中使用动态 SQL 的解决方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12568577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com