mysql - 为什么MySQL发现CONCAT语句有错误?

标签 mysql stored-procedures

我正在尝试在 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/

相关文章:

PHP MYSQL 根据日期月份获取列

While 循环中的 MySQL 更新

sql - 在SQL Server中,如何在存储过程中传递可选参数?

mysql - 选择不同的数据库进行连接 - mysql

MySQL 存储过程错误意外字符 ":"

c# - 存储过程未返回输出参数

mysql - SQL查询以从重复行中获取结果

mysql - Mysql 上的 Gtfs 数据库 - 在区域内搜索路线时查询速度慢

c# - 如何检查数据是否存在然后删除数据

mysql - 搜索原始日期 - MYSQL