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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:57:03