将变量传递到游标的SELECT查询(MySQL)

将变量传递到游标的SELECT查询(MySQL),mysql,cursor,Mysql,Cursor,我正在尝试下面的存储过程。但是,当我在“DECLARE cur1”行中传递实际列名时,SP返回正确的值,但当我传递变量名(即输入参数colName)时,它返回0。我在下面的代码中添加了注释。代码正确吗 DROP PROCEDURE IF EXISTS test1.checkHardcodedField; CREATE PROCEDURE test1.checkHardcodedField(IN textValue CHAR(10), colName CHAR(10), OUT counter V

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

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;

不能从变量中获取Fieldname。您必须使用动态SQL准备语句。但是有一件令人不快的事情-不能使用准备语句声明游标…解决方案是什么?那么您的SQL语法中有一个错误;检查与您的MySQL服务器版本对应的手册,了解使用near'DECLARE cur1从tmp选择fld的正确语法@当然是SagarSutar-这是一个如何设计的方案,而不是最终的解决方案。是的,我根据我的代码进行了修改,但它仍然在该行抛出一个错误是的。游标名称cur1必须在游标关键字之前指定-查看您自己的代码。我也这样做了。。。还是一样的错误。但我观察到一件事,当我从第4行到第8行删除代码时,错误消失了。
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