为什么 MySQL 在 CONCAT 语句中发现错误?

Why does MySQL find an error in the CONCAT statement?

我正在尝试在 MySQL 中编写一个存储过程,我需要在游标上循环,并执行一个 SQL 语句,该语句使用游标中的一段数据提取到一个变量中,然后作为 SQL 执行。游标 orders_cur 在 this_addr 上排序;在给定的 this_addr 记录块中,第一个记录被跳过,其余的需要通过设置 duplicateorder="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”的文字,但都无济于事,而且我会斗鸡眼...如果有人看到我的错误所在,我将非常感激...

--里克斯特

CONCAT 没有问题,循环不正确 initiated/enclosed。

这个set_dupe_loop: WHILE this_addr = match_addr

应该是这个set_dupe_loop: WHILE this_addr = match_addr DO

此操作不需要光标。你可以这样做:

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 的游标。当您可以将逻辑表达为集合操作时,通常最好这样做。