Mysql
MySQL 5.6 中的 DELIMITER 問題
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//