我编写了一个简单的过程,将整个列修改为一组无意义的值。然而,当我尝试
call NewProc('tableName','colName')它回来了
1064 -您的SQL语法有一个错误;检查与您的MySQL服务器版本对应的手册,以便在第1行使用接近'NULL‘的正确语法。该错误可能发生在"set @sql0=CONCAT('select (*) into ',@i,’from ',tab1)中;
但我不知道为什么会有这个问题。
CREATE DEFINER = root@% PROCEDURE NewProc (IN tn VARCHAR(20), IN mc VARCHAR(20))
BEGIN
DECLARE j INT;
DECLARE tab1 VARCHAR(20);
DECLARE col1 VARCHAR(20);
DECLARE stmt VARCHAR(1000);
SET tab1:=tn;
SET col1:=mc;
set @sql0=CONCAT('select count(*) into ',@i,' from ',tab1);
PREPARE stmt FROM @sql0;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET j=1;
WHILE j<@i DO
SET @sql1=CONCAT("update ",tab1," set ",col1,"='565656' where id=",j);
PREPARE stmt FROM @sql1;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET j=j+1;
END WHILE;
END;发布于 2016-05-10 15:52:26
最有可能的问题是第一个动态查询,即存储到@sql0中的查询:
set @sql0=CONCAT('select count(*) into ',@i,' from ',tab1);您正在将@i的值连接到查询中,但此时还没有定义@i,因此它是null。将null与其他字符串文本进行连接也会为您提供一个null。因此,@sql0最终为null,这就是您随后要执行的内容,并得到了所提到的错误。
我猜您的意思是@i是动态查询的一部分,所以它应该是这样的:
set @sql0=CONCAT('select count(*) into @i from ',tab1);也就是说,您需要连接@i的名称,而不是值。这样,动态查询将把count(*)的结果存储到@i中。
但是,请注意,您可能还需要在动态查询之前显式声明变量。否则,动态查询可能会在自己的、嵌套的级别隐式声明变量,并且在查询完成后变量将超出作用域,因此查询中进一步的@i引用仍将计算为null。
发布于 2016-05-10 17:36:03
为什么要写一个循环?跳过计数和循环,只需执行一次:
SET @sql1=CONCAT("update ",tab1," set ",col1,"='565656'");https://dba.stackexchange.com/questions/138126
复制相似问题