Mysql

MySQL 儲存過程返回 null

  • May 10, 2016

我編寫了一個簡單的程序來將整列修改為一組無意義的值。但是,當我嘗試

call NewProc('tableName','colName')

它回來了

1064 - 您的 SQL 語法有錯誤;檢查與您的 MySQL 伺服器版本相對應的手冊,以在第 1 行的“NULL”附近使用正確的語法”。錯誤可能發生在“set @sql0=CONCAT(‘select count(*) into ‘,@i, ’ 來自 ‘,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;

問題很可能出在第一個動態查詢上,即您要儲存的那個@sql0

set @sql0=CONCAT('select count(*) into ',@i,' from ',tab1);

您正在將 的連接到@i查詢中,但@i此時尚未定義 - 所以它為空。將 null 與其他字元串文字連接也會給您一個 null。所以@sql0最終為空,這就是您隨後嘗試執行的內容並得到提到的錯誤。

我的猜測是你的意思是@i成為動態查詢的一部分,所以它可能應該是這樣的:

set @sql0=CONCAT('select count(*) into @i from ',tab1);

也就是說,您需要連接 的名稱@i而不是值。這樣動態查詢將儲存count(*)into的結果@i

但請注意,您可能還需要在動態查詢之前顯式聲明變數。否則,動態查詢可能會在​​其自己的嵌套級別隱式聲明變數,並且一旦查詢完成,變數將超出範圍,因此查詢中@i進一步的引用仍將評估為 null。

引用自:https://dba.stackexchange.com/questions/138126