You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在无游标存储过程中使用赋值运算符(:=)?附SQL改写需求

无游标存储过程实现原SQL逻辑

你可以直接把原SQL的集合操作逻辑封装进存储过程,完全不需要游标——因为原SQL本身就是基于批量数据处理的,逐行游标的方式反而没必要。

基础版存储过程

DELIMITER //

CREATE PROCEDURE get_product_sequence()
BEGIN
    SELECT row_number, current_product_id, prev_product_id FROM
    (
        SELECT 
            @row_num:=@row_num+1 AS row_number,
            @pr_product_id AS prev_product_id,
            kd_barang AS current_product_id,
            @pr_product_id:=kd_barang
        FROM m_barang
        CROSS JOIN (SELECT @row_num := 0) rn
        CROSS JOIN (SELECT @pr_product_id := '') prev_product
    ) data
    LIMIT 5;
END //

DELIMITER ;

调用方式

执行以下语句即可获取和原SQL完全一致的输出:

CALL get_product_sequence();

进阶:带参数的通用版

如果需要灵活控制返回的行数,可以给存储过程添加参数:

DELIMITER //

CREATE PROCEDURE get_product_sequence(IN limit_count INT)
BEGIN
    SELECT row_number, current_product_id, prev_product_id FROM
    (
        SELECT 
            @row_num:=@row_num+1 AS row_number,
            @pr_product_id AS prev_product_id,
            kd_barang AS current_product_id,
            @pr_product_id:=kd_barang
        FROM m_barang
        CROSS JOIN (SELECT @row_num := 0) rn
        CROSS JOIN (SELECT @pr_product_id := '') prev_product
    ) data
    LIMIT limit_count;
END //

DELIMITER ;

调用时传入需要的行数:

CALL get_product_sequence(5);

说明

  • DELIMITER //是临时修改SQL语句的结束符,避免存储过程内部的分号和默认分号冲突,创建完存储过程后再改回DELIMITER ;
  • 原SQL中的用户变量@row_num和@pr_product_id会在存储过程执行时初始化,每次调用都会重新生成行号和上一行产品ID的映射,和原SQL执行逻辑完全一致

内容的提问来源于stack exchange,提问作者fransdika dharmawan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:20:28