【问题标题】:MySQL doesn't accept loop end instructionMySQL 不接受循环结束指令
【发布时间】:2015-07-26 14:37:20
【问题描述】:

我正在尝试在插入事件之后创建触发器;这是触发器的定义:

 BEGIN
    DECLARE stud INT(11) DEFAULT 0;
    DECLARE cd INT(11) DEFAULT 0;
    DECLARE sw CURSOR FOR 
        (SELECT CodiceStudente FROM Listastudenticorsi WHERE CodiceCorso IN
            (SELECT CodiceCorso FROM Listanews WHERE CodiceNews IN
                (SELECT MAX(Codice) FROM News)));
    DECLARE cod CURSOR FOR
        (SELECT CodiceDocente FROM Listanews WHERE CodiceNews IN
               (SELECT MAX(Codice) FROM News));
    OPEN sw;
    OPEN cod;
    get_loop: LOOP
    FETCH sw INTO stud;
    FETCH cod INTO cd;
    INSERT INTO Inbox(Mittente, Destinatario, Oggetto, Contenuto, Data) VALUES (cd, stud, "Nuova news", "", CURDATE());
    END LOOP get_loop;
END

由于某些原因,MySQL 不允许我创建它:它说我必须在第 17 行检查“LOOP;END”附近的语法,但据我所知,那里的语法是正确的......我不明白出了什么问题,即使我将循环名称放在结束循环之后,也会出现错误。

我不确定错误是否可能在 INSERT 指令中:我不确定变量 @cod 的使用;它始终是一个独特的价值,但我不确定是否是导致问题的原因。如果是这样,我该如何更改该指令以获得相同的结果?

【问题讨论】:

    标签: mysql loops triggers


    【解决方案1】:

    您缺少第 17 行的 END IF; 语句

    BEGIN
        DECLARE done INT DEFAULT FALSE;
        DECLARE stud VARCHAR(255) DEFAULT "";
        DECLARE sw CURSOR FOR 
            (SELECT CodiceStudente FROM Listastudenticorsi WHERE CodiceCorso IN
                (SELECT CodiceCorso FROM Listanews WHERE CodiceNews IN
                    (SELECT MAX(Codice) FROM News)));
    
        SET @cod = (SELECT CodiceDocente FROM Listanews WHERE CodiceNews IN
                   (SELECT MAX(Codice) FROM News));
        OPEN sw;
        get_loop: LOOP
        FETCH sw INTO stud;
            IF done THEN
            LEAVE get_loop;
            END IF;
        INSERT INTO Inbox(Mittente, Destinatario, Oggetto, Contenuto, Data) VALUES (@cod, @i, stud, "", CURDATE());
        END LOOP get_loop;
    END;
    

    【讨论】:

    • 我是在 Phpmyadmin 对话框中写的,所以不需要
    • 与之前的输出相同:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 'LOOP; 附近使用的正确语法; END' 在第 20 行
    • 将循环名称添加到END 语句。
    • 相同 :( ,甚至添加循环名称
    • 您缺少 END IF;陈述。 MySQL 正在寻找您打开的 IF 分支的 END 语句。但你只给出了 END LOOP 语句。
    【解决方案2】:

    我不确定您为什么会收到该错误,但您根本不需要loop。只需执行以下操作:

    INSERT INTO Inbox(Mittente, Destinatario, Oggetto, Contenuto, Data)
        SELECT @cod, CodiceStudente, 'Nuova news', '', CURDATE()
        FROM Listastudenticorsi
        WHERE CodiceCorso IN (SELECT CodiceCorso 
                              FROM Listanews
                              WHERE CodiceNews IN (SELECT MAX(Codice) FROM News));
    

    【讨论】:

    • 是的,但是这段代码没有做我想做的事:我想在从前一个 SELECT 语句获得的行上切换“@i”,为了做到这一点,我需要执行循环...我不知道其他解决方案:/
    • @tenik 。 . . @i 的值在您问题的代码中没有改变。答案只能基于问题中的信息,但我很确定您不需要光标或循环。
    • 对不起,我在这里复制代码时删除了它。
    • 我刚刚更新了代码,使用了正确的版本。
    • @tenik 。 . .代码不稳定。您正在从两个没有 order by 的查询中获取结果,因此结果可以按任何顺序到达。
    猜你喜欢
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多