首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL存储过程返回null

问MySQL存储过程返回null
EN

Database Administration用户
提问于 2016-05-10 15:28:58
回答 2查看 3.3K关注 0票数 2

我编写了一个简单的过程,将整个列修改为一组无意义的值。然而,当我尝试

代码语言:javascript
复制
call NewProc('tableName','colName')

它回来了

1064 -您的SQL语法有一个错误;检查与您的MySQL服务器版本对应的手册,以便在第1行使用接近'NULL‘的正确语法。该错误可能发生在"set @sql0=CONCAT('select (*) into ',@i,’from ',tab1)中;

但我不知道为什么会有这个问题。

代码语言:javascript
复制
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;
EN

回答 2

Database Administration用户

回答已采纳

发布于 2016-05-10 15:52:26

最有可能的问题是第一个动态查询,即存储到@sql0中的查询:

代码语言:javascript
复制
set @sql0=CONCAT('select count(*) into ',@i,' from ',tab1);

您正在将@i的值连接到查询中,但此时还没有定义@i,因此它是null。将null与其他字符串文本进行连接也会为您提供一个null。因此,@sql0最终为null,这就是您随后要执行的内容,并得到了所提到的错误。

我猜您的意思是@i是动态查询的一部分,所以它应该是这样的:

代码语言:javascript
复制
set @sql0=CONCAT('select count(*) into @i from ',tab1);

也就是说,您需要连接@i的名称,而不是值。这样,动态查询将把count(*)的结果存储到@i中。

但是,请注意,您可能还需要在动态查询之前显式声明变量。否则,动态查询可能会在自己的、嵌套的级别隐式声明变量,并且在查询完成后变量将超出作用域,因此查询中进一步的@i引用仍将计算为null。

票数 1
EN

Database Administration用户

发布于 2016-05-10 17:36:03

为什么要写一个循环?跳过计数和循环,只需执行一次:

代码语言:javascript
复制
SET @sql1=CONCAT("update ",tab1," set ",col1,"='565656'");
票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/138126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档