【问题标题】:Pass a variable into CURSOR's SELECT Query (MySQL)将变量传递到 CURSOR 的 SELECT 查询 (MySQL)
【发布时间】:2020-02-19 12:04:05
【问题描述】:

我正在尝试下面的存储过程。但是,当我在“DECLARE cur1”行中传递实际列名时,SP 返回正确的值,但是当我传递变量名,即输入参数 (colName) 时,它返回 0。我在下面的代码中添加了 cmets。代码正确吗?

DROP PROCEDURE IF EXISTS test1.checkHardcodedField;
CREATE PROCEDURE test1.checkHardcodedField(IN textValue CHAR(10), colName CHAR(10), OUT counter VARCHAR(100))
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE temp CHAR(16);
  DECLARE i INT DEFAULT 0;

  -- Issue with this statement, returns incorrect value.
  DECLARE cur1 CURSOR FOR SELECT colName FROM data1;   

  -- This statement works. MSH3 is actual column name
  -- DECLARE cur1 CURSOR FOR SELECT MSH3 FROM data1; 

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur1;

  read_loop: LOOP
    FETCH cur1 INTO temp;

    IF done THEN
      LEAVE read_loop;
    END IF;
    IF temp = textValue THEN
      SET i = i + 1;
    END IF;
  END LOOP;

  SET counter = i;

  CLOSE cur1;
END;

【问题讨论】:

  • 字段名不能取自变量。您必须使用动态 SQL(准备好的语句)。
  • 但是有一件令人不快的事情 - 不能使用准备好的语句声明游标...
  • 那么解决办法是什么

标签: mysql cursor


【解决方案1】:
CREATE PROCEDURE procedure_name (..., fieldname VARCHAR, ...)
BEGIN
    CREATE TEMPORARY TABLE tmp (field VARCHAR(10));
    SET @sql := CONCAT('INSERT INTO tmp SELECT ', fieldname, ' FROM tablename;');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DROP PREPARE stmt;
    BEGIN
        DECLARE cur CURSOR FOR SELECT field FROM tmp;
        ...
    END;
    DROP TABLE tmp;
END

【讨论】:

  • 您的 SQL 语法有误;检查与您的 MySQL 服务器版本相对应的手册,以在 'DECLARE CURSOR cur1 FOR SELECT fld FROM tmp; 附近使用正确的语法
  • @SagarSutar 当然 - 这是一个“如何做”的方案,而不是最终的解决方案。
  • 是的,我根据我的代码进行了修改,但它仍然在该行抛出错误
  • 是的。游标名(cur1)必须在CURSOR关键字之前指定——看你自己的代码。
  • 我也这样做了......仍然是同样的错误。但是我观察到一件事,当我从第 4 行到第 8 行删除代码时,错误就消失了。
猜你喜欢
  • 2016-10-11
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 2018-06-02
相关资源
最近更新 更多