为什么MySQL在CONCAT语句中发现错误?
我试图在MySQL中编写一个存储过程,在这里我需要在游标上循环,并执行一条SQL语句,该语句使用游标中的一段数据,该数据被提取到变量中,然后作为SQL执行。光标顺序在该地址上排序;在这个地址记录的给定块中,第一条记录被跳过,其余记录需要通过设置duplicateorder=1来标记 由于某些原因,我无法使带有CONCAT函数的行正常工作,而不给我一个错误:为什么MySQL在CONCAT语句中发现错误?,mysql,stored-procedures,Mysql,Stored Procedures,我试图在MySQL中编写一个存储过程,在这里我需要在游标上循环,并执行一条SQL语句,该语句使用游标中的一段数据,该数据被提取到变量中,然后作为SQL执行。光标顺序在该地址上排序;在这个地址记录的给定块中,第一条记录被跳过,其余记录需要通过设置duplicateorder=1来标记 由于某些原因,我无法使带有CONCAT函数的行正常工作,而不给我一个错误: OPEN orders_cur; order_loop: LOOP
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”周围需要的文字,但都没有效果,我会交叉眼睛…如果有人看到我的错误所在,我将非常感激
-rixterCONCAT没有问题,循环未正确启动/封闭 此集合重复循环:而此添加=匹配添加
应该是这个设置重复循环:当这个地址=匹配地址时,这个操作不需要光标。你可以做:
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的游标。当您可以将逻辑表示为集合操作时,通常最好这样做。出于好奇,这个\u orderid的声明是什么?编辑:无需担心,可能,请参见下面的答案。这很有效,一旦我做了一些小的更正,我给出了错误的表名,应该是_orders:UPDATE _ordersr JOIN SELECT addressmatch,MINorder\u id作为来自_OrdersR2的minoi,其中orderdate>=CURDATE-间隔3天,按地址分组r.addressmatch=dups.addressmatch和r.order\u id>dups.minoi设置r.duplicateorder=1;