Mysql

MySQL 5.6 中的 DELIMITER 問題

  • May 7, 2015
Drop procedure if EXISTS rotatepjp;
DELIMITER //
CREATE PROCEDURE rotatepjp()
BEGIN
 DECLARE u_id, settingval, pjp_userid, pjp_beatid, u_frequency INT;
 DECLARE  u_pjpstartdate, pjp_fordate, tilldate, newdate DATE;
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
    SELECT value INTO settingval FROM settings where name = 'autorotatepjp';
    IF settingval > 0 THEN
      BEGIN
       DECLARE done INT DEFAULT FALSE;
       DECLARE cur1 CURSOR FOR SELECT id, pjpstartdate, frequency FROM users;
       DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
       #open cursor
       OPEN cur1;

       #starts the loop
       the_loop: LOOP

           #get the values of each column into our variables
           FETCH cur1 INTO u_id, u_pjpstartdate, u_frequency;
           IF done THEN
               LEAVE the_loop;
           END IF;
           #Do some post processing
           IF u_frequency > 0 THEN
               SET tilldate = DATE_ADD( u_pjpstartdate, INTERVAL u_frequency DAY );
               IF tilldate = CURDATE() THEN
                   BEGIN
                       DECLARE done1 INT DEFAULT FALSE;
                       DECLARE cur2 CURSOR FOR SELECT user_id, beat_id, fordate FROM pjps where user_id = u_id and fordate >= u_pjpstartdate and fordate < tilldate;
                       DECLARE CONTINUE HANDLER FOR NOT FOUND SET done1 = TRUE;
                       OPEN cur2;
                       the_loop1: LOOP
                           #get the values of each column into our variables
                           FETCH cur2 INTO pjp_userid, pjp_beatid, pjp_fordate;
                           IF done1 THEN
                               LEAVE the_loop1;
                           END IF;
                           SET newdate = DATE_ADD( pjp_fordate, INTERVAL u_frequency DAY );
                           INSERT INTO pjps (user_id, beat_id, fordate, created, modified )
                           VALUES ( pjp_userid, pjp_beatid, newdate, NOW(), NOW() );
                       END LOOP the_loop1;
                       UPDATE users set pjpstartdate = CURDATE(), modified = NOW() where id = u_id;
                   END;
               END IF;
           END IF;
       END LOOP the_loop;
    END;
END IF;
COMMIT ;
END //
DELIMITER ;

此程式碼在 innodb_version 5.5.34 中有效,但在 innodb_version 5.6.21 中無效…….任何線索,我在哪裡做錯了???

錯誤 - #1064 - 您的 SQL 語法有錯誤;檢查與您的 MySQL 伺服器版本相對應的手冊,以在第 1 行的“DELIMITER”附近使用正確的語法

創建儲存過程時,您不需要COMMIT;.

我從未將它用於儲存過程。

沒有人應該這樣做,因為儲存過程儲存在 MyISAM 表中(mysql.proc

請刪除COMMIT;前面的END //,然後重試。

我也會換行說

DELIMITER $$

和結束子句

END $$

然後再試一次

我以為你在 mysql 客戶端工作。如果您的問題是 SQLFiddle,這裡是 StackOverflow 的作者發布的文章(在 SqlFiddle.Mysql 上執行觸發儲存過程

基於它,DELIMITER完全停止使用。查找查詢窗格下的第四個按鈕。

我剛剛在筆記型電腦上安裝了適用於 Windows 的 MySQL 5.6.22 並按原樣執行您的程式碼。有用 !!!

剩下的唯一罪魁禍首是phpmyadmin。它無法處理針對 MySQL 最新版本 5.6 的分隔符。您可能需要升級 phpmyadmin。

在 phpMyAdmin 中,您不能在 SQL 語句中使用 DELIMITER,因為您必須在頁面上定義分隔符。

從 SQL 語句中刪除兩個 DELIMITER 行,然後,在您編寫 SQL 的 TEXTAREA 下方,有一個如下所示的輸入欄位:

[ Delimiter ';']

改變’;’ 到你的新分隔符,即。’//’。

這也意味著所有分隔符現在都從 ; 到 //,所以你的第一行需要從:

Drop procedure if EXISTS rotatepjp;

到:

Drop procedure if EXISTS rotatepjp//

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