Mysql
MySQL 儲存過程返回 null
我編寫了一個簡單的程序來將整列修改為一組無意義的值。但是,當我嘗試
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。