Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么MySQL在CONCAT语句中发现错误?_Mysql_Stored Procedures - Fatal编程技术网

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

为什么MySQL在CONCAT语句中发现错误?,mysql,stored-procedures,Mysql,Stored Procedures,我试图在MySQL中编写一个存储过程,在这里我需要在游标上循环,并执行一条SQL语句,该语句使用游标中的一段数据,该数据被提取到变量中,然后作为SQL执行。光标顺序在该地址上排序;在这个地址记录的给定块中,第一条记录被跳过,其余记录需要通过设置duplicateorder=1来标记 由于某些原因,我无法使带有CONCAT函数的行正常工作,而不给我一个错误: OPEN orders_cur; order_loop: LOOP

我试图在MySQL中编写一个存储过程,在这里我需要在游标上循环,并执行一条SQL语句,该语句使用游标中的一段数据,该数据被提取到变量中,然后作为SQL执行。光标顺序在该地址上排序;在这个地址记录的给定块中,第一条记录被跳过,其余记录需要通过设置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”周围需要的文字,但都没有效果,我会交叉眼睛…如果有人看到我的错误所在,我将非常感激


-rixter

CONCAT没有问题,循环未正确启动/封闭

此集合重复循环:而此添加=匹配添加


应该是这个设置重复循环:当这个地址=匹配地址时,这个操作不需要光标。你可以做:

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;