MySQL如何在游标(cursor)的WHERE子句中使用运行时传入变量
MySQL 实现带运行时传参的游标方案
MySQL 原生支持带参数的游标,用法和你熟悉的Oracle逻辑高度对齐,可直接在游标定义的WHERE子句中引用游标参数,打开游标时传入实际值即可。
与Oracle写法的等价实现
你给出的Oracle示例:
DECLARE myCursor cursor select col1 from table1 where col2 = &1; OPEN myCursor ("NEW");
对应MySQL的写法如下:
-- 1. 定义游标时声明参数 DECLARE myCursor CURSOR (p_col2 VARCHAR(20)) FOR SELECT col1 FROM table1 WHERE col2 = p_col2; -- 2. 打开游标时传入参数值 OPEN myCursor('NEW');
完整存储过程示例
DELIMITER // CREATE PROCEDURE process_table1_data(IN input_col2_val VARCHAR(20)) BEGIN -- 声明变量承接游标返回的col1值 DECLARE v_col1 VARCHAR(100); -- 声明游标遍历结束标识 DECLARE CONTINUE HANDLER FOR NOT FOUND SET @fetch_finished = 1; -- 定义带参数的游标 DECLARE myCursor CURSOR (p_col2 VARCHAR(20)) FOR SELECT col1 FROM table1 WHERE col2 = p_col2; -- 打开游标时传入参数,可传常量也可传存储过程入参 -- 示例1:传固定值NEW OPEN myCursor('NEW'); -- 示例2:传存储过程入参,调用存储过程时动态指定 -- OPEN myCursor(input_col2_val); -- 游标遍历业务逻辑示例 read_loop: LOOP FETCH myCursor INTO v_col1; IF @fetch_finished = 1 THEN LEAVE read_loop; END IF; -- 此处替换为你需要的业务处理逻辑 SELECT v_col1; END LOOP; -- 释放游标资源 CLOSE myCursor; END // DELIMITER ;
注意事项
- 游标参数仅支持输入类型,定义时无需加
IN修饰,注意参数名不要和表字段重名,避免查询逻辑出错 - 打开游标时传入的参数可以是常量、局部变量、存储过程入参等任意合法取值
- 如果需要多次用不同参数调用游标,关闭后重新OPEN传新值即可
内容的提问来源于stack exchange,提问作者Ram Krishan
相关产品推荐
相关产品推荐

