Mysql

為什麼嘗試在 MySQL 中創建儲存過程時出現語法錯誤?

  • March 15, 2018

我想使用事務來呼叫多行上的儲存過程。如果它在一行上失敗,我想回滾所有內容。否則我想承諾。

到目前為止,我有以下內容,但它會引發以下錯誤:

您的 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 ;

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