我正在尝试在 MySQL 中编写一个存储过程,我需要在游标上循环,并执行一条 SQL 语句,该语句使用游标中的一段数据,该数据被提取到变量中,然后作为 SQL 执行。游标orders_cur在this_addr上排序;在给定的 this_addr 记录 block 中,第一条记录将被跳过,其余记录需要通过设置重复顺序 =“1”来标记。
出于某种原因,我无法让 CONCAT 函数的线路在不出现错误的情况下工作:
OPEN orders_cur;
order_loop: LOOP
-- Now loop on orders_cur until this_addr = match_addr
find_addr_loop: REPEAT
FETCH orders_cur INTO this_addr,this_orderid;
UNTIL this_addr = match_addr
END REPEAT;
-- Skip the first order that matched by performing another fetch
FETCH orders_cur INTO this_addr,this_orderid;
-- Now start next loop which does the real work; set duplicateorder on the remaining records in cursor,
-- using the orders_cur.order_id to locate the actual record in the Reservations table.
set_dupe_loop: WHILE this_addr = match_addr
SET @sql = CONCAT('UPDATE Reservations SET duplicateorder = \'1\' WHERE order_id=',this_orderid);
PREPARE runme FROM @sql;
EXECUTE runme;
FETCH orders_cur INTO this_addr,this_orderid;
END WHILE set_dupe_loop:;
DEALLOCATE PREPARE runme;
END LOOP order_loop;
我已经尝试了所有可能的变体来转义“1”周围我需要的文字,但无济于事,而且我正在斗鸡眼......如果有人看到我的错误所在,我将非常感激。 .
--里克斯特
最佳答案
此操作不需要光标。你可以这样做:
UPDATE Reservations r JOIN
(SELECT this_addr, MIN(order_id) as minoi
FROM Reservations r2
WHERE this_addr = match_addr
GROUP BY this_addr
) dups
ON r.this_addr = dups.this_addr and r.order_id > dups.minoi
SET r.duplicateorder = 1;
一般来说,您应该避免使用游标,尤其是那些需要动态 SQL 的游标。当您可以将逻辑表达为集合运算时,通常最好这样做。
关于mysql - 为什么MySQL发现CONCAT语句有错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30178528/