在MySQL触发器中循环以逗号分隔的列表

问题描述

MysqL触发器中,我需要遍历逗号分隔的列表,并对列表中的每个项目执行查询

DELIMITER $$
DROP trigger IF EXISTS my_trigger $$
CREATE TRIGGER my_trigger AFTER UPDATE ON my_table
 FOR EACH ROW BEGIN 
    SET @id = NEW.id;
    SET @item_str = NEW.item_str; -- This is a comma separated list of integers like "34,1,200,99"
    

    /*DYNAMIC SECTION*/
    SET @item_list = CONCAT('''',REPLACE(REPLACE(@item_str,' ',''),',QUOTE(',')),'''');

    SET @list_stub = REPLACE(@item_list,'');
    SET @list_count = LENGTH(@item_list) - LENGTH(@list_stub) + 1;
    
    -- Loop through list of items
    SET @x = 0;
    WHILE @x < @list_count DO
        SET @x = @x + 1;
        SET @sql = CONCAT('SELECT ELT(',@x,@item_list,') INTO @item');
        PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
        
        SET @sql = CONCAT('INSERT IGnorE INTO new_table (id,item) VALUES(',@id,@item,')' );
        PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
    END WHILE;

END $$
DELIMITER ;

这给了我错误ERROR 1336 (0A000): Dynamic sql is not allowed in stored function or trigger

由于“动态部分”在存储过程中运行良好,因此我尝试将该部分移至单独的过程,然后从此触发器中调用它:

相同的错误

我在主题Loop in trigger with comma separated values mysql)上找到的最接近的问题看起来很苗条,没有帮助。该答案中包含的链接实际上是无效的。无论如何,它都会使用临时表的创建,我怀疑这会引发该用户的权限问题。

至少有解决方法?如何遍历此列表并使用每个值执行查询

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)