如何在无游标存储过程中使用赋值运算符(:=)?附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
相关产品推荐
相关产品推荐

