将变量传递到游标的SELECT查询(MySQL)
我正在尝试下面的存储过程。但是,当我在“DECLARE cur1”行中传递实际列名时,SP返回正确的值,但当我传递变量名(即输入参数colName)时,它返回0。我在下面的代码中添加了注释。代码正确吗将变量传递到游标的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
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