mysql - 我想在动态查询中的变量中存储一个值,然后想在检查该变量时运行另一个查询

标签 mysql stored-procedures

我想在程序的后面部分中使用 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/

相关文章:

mysql - 如何在 MySQL 中检查日期范围内的任何日期是否落在表中保存的日期之间

mysql - MySql 存储过程中的可选 OrderBy 参数

mysql - 尝试在 phpmyadmin 中创建事务

c# - 如何更改 SQL 中存储过程的排序规则?

sql - 在 SQL Server 中定义动态 PIVOT sql 查询

MySQL:选择多个字段

php - Top 5 排名问题

php - 带有 PHP 和 MySQl 的 Google 图表工具

PHP/MYSQL - 在循环内更新。页面加载缓慢

sql - 如何在 SQL 游标中进行更改