Mysql
為什麼嘗試在 MySQL 中創建儲存過程時出現語法錯誤?
我想使用事務來呼叫多行上的儲存過程。如果它在一行上失敗,我想回滾所有內容。否則我想承諾。
到目前為止,我有以下內容,但它會引發以下錯誤:
您的 SQL 語法有錯誤;檢查與您的 MySQL 伺服器版本相對應的手冊,以獲取在 ‘DECLARE val1 INT DEFAULT 0; 附近使用的正確語法;DECLARE check INT DEFAULT 1; DECLARE done BOOL DEFAU’ 在第 3 行
DELIMITER \\ BEGIN DECLARE val1 INT DEFAULT 0; DECLARE check INT DEFAULT 1; DECLARE done BOOL DEFAULT FALSE; DECLARE e INT DEFAULT 1; DECLARE cursor1 CURSOR FOR SELECT Table1.col1 FROM Table1 WHERE Table.col2 = (SELECT col1 FROM Table2 WHERE col3 = 'xxx'); DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; START TRANSACTION; OPEN cursor1; my_loop: LOOP FETCH NEXT FROM cursor1 INTO val1; IF done THEN LEAVE my_loop; ELSE storedProcedure1(val1,100,e); IF SELECT e = 0 THEN ROLLBACK; SET check = 0; LEAVE my_loop; END IF; END IF; END LOOP; IF check = 1 THEN COMMIT; END IF; END;
關於我可能做錯了什麼的任何想法?
如果要創建儲存過程,則必須使用
CREATE PROCEDURE
語法,請參閱文件。您不能使用過程語言結構,例如DECLARE
在普通 SQL 中。此外,您必須使用您在 final 之後聲明的特殊分隔符
END
,因此最後一行將是END\\
. (在那之後,不要忘記設置DELIMITER
回;
,否則你會掙扎。)(可能還有其他問題,這只是我立即發現的兩個問題。)
你錯過了 CREATE PROCEDURE 部分,快速重構腳本應該這樣寫……
DELIMITER \\ CREATE PROCEDURE your_sp_name() BEGIN DECLARE val1 INT DEFAULT 0; DECLARE check INT DEFAULT 1; DECLARE done BOOL DEFAULT FALSE; DECLARE e INT DEFAULT 1; DECLARE cursor1 CURSOR FOR SELECT Table1.col1 FROM Table1 WHERE table_name.col2 IN (SELECT col1 FROM Table2 WHERE col3 = 'xxx'); DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; START TRANSACTION; OPEN cursor1; my_loop: LOOP FETCH cursor1 INTO val1; IF done THEN LEAVE my_loop; ELSE CALL storedProcedure1(val1,100,e); IF e = 0 THEN ROLLBACK; SET check = 0; LEAVE my_loop; END IF; END IF; END LOOP; IF check = 1 THEN COMMIT; END IF; CLOSE cursor1; END; DELIMITER ;