我想在程序的后面部分中使用 i_count 变量,但该值没有被分配。
再次,当我使用通用查询而不是前面的动态查询时,无论如何它都运行完美。
DROP PROCEDURE IF EXISTS `common2`;
CREATE PROCEDURE `common2`(tablename VARCHAR(50),attr_name VARCHAR(50),pk BIGINT(255),i_block_id BIGINT(255))
BEGIN
DECLARE i_count INTEGER(255);
set @sql_text = concat('SELECT COUNT(',pk,') INTO @i_count FROM ',tablename, ' WHERE ',attr_name,'=1 AND ',pk,'=',i_block_id);
prepare statement from @sql_text;
execute statement;
#deallocate prepare statement;
IF (i_count=1) THEN
set @sql_text1 = concat('UPDATE ',tablename, ' SET ',attr_name,'=0 WHERE ',attr_name,'=1 AND ',pk,'=',i_block_id);
prepare statement1 from @sql_text1;
execute statement1;
#deallocate prepare statement;
ELSE
set @sql_text2 = concat('UPDATE ',tablename, ' SET ',attr_name,'=1 WHERE ',attr_name,'=0 AND ',pk,'=',i_block_id);
prepare statement2 from @sql_text2;
execute statement2;
#deallocate prepare statement;
END IF;
END;
最佳答案
这两个变量之间存在差异。以@开头的变量是 user defined variables 。声明的变量为 local variables .
这样写:
delimiter $$
DROP PROCEDURE IF EXISTS `common2`;
CREATE PROCEDURE `common2`(tablename VARCHAR(50),attr_name VARCHAR(50),pk BIGINT(255),i_block_id BIGINT(255))
BEGIN
set @i_count = 0;
set @sql_text = concat('SELECT COUNT(',pk,') INTO @i_count FROM ',tablename, ' WHERE ',attr_name,'=1 AND ',pk,'=',i_block_id);
prepare statement from @sql_text;
execute statement;
#deallocate prepare statement;
IF (@i_count=1) THEN
set @sql_text1 = concat('UPDATE ',tablename, ' SET ',attr_name,'=0 WHERE ',attr_name,'=1 AND ',pk,'=',i_block_id);
prepare statement1 from @sql_text1;
execute statement1;
#deallocate prepare statement;
ELSE
set @sql_text2 = concat('UPDATE ',tablename, ' SET ',attr_name,'=1 WHERE ',attr_name,'=0 AND ',pk,'=',i_block_id);
prepare statement2 from @sql_text2;
execute statement2;
#deallocate prepare statement;
END IF;
END $$
delimiter ;
关于mysql - 我想在动态查询中的变量中存储一个值,然后想在检查该变量时运行另一个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21476985/