【问题标题】:Getting odd Error with MySQL Cursors containing a Simple Loop使用包含简单循环的 MySQL 游标出现奇怪的错误
【发布时间】:2020-07-17 00:28:12
【问题描述】:

MySQL 游标出现奇怪错误。可能是微不足道的,但我看不到发生了什么。

如果我使用“CALL cur();”运行它会出现错误概述如下...:

错误代码:1054。“字段列表”中的未知列“完成”

这让我相信它指的是我的 Paper_Review 表。但是,Paper_Review 表仅包含以下列:

paperID、reviewerID、分数、reviewSubmissionDate、reviewInvitationDate

如果我通过突出显示整个查询来运行它,我会得到一个完全不同的错误:

错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在第 1 行的“END”附近使用的正确语法

这是我的代码:

DELIMITER $$
CREATE PROCEDURE cur()
BEGIN
DECLARE pScore INT;
DECLARE b BOOLEAN DEFAULT FALSE;
DECLARE aCursor CURSOR FOR SELECT pr.score FROM Paper_Review AS pr;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = TRUE;
OPEN aCursor;
myloop: LOOP
    FETCH aCursor INTO pScore;
    IF b THEN
        LEAVE myloop;
    END IF;
    IF pScore <> -1 THEN
        UPDATE Paper_Review AS pr
        SET pr.score = -1
        WHERE pr.reviewerID = "123" AND pr.reviewSubmissionDate < "2016-03-25";
    END IF;
END LOOP;
CLOSE aCursor;
END;

CALL cur();

创建表格:

    CREATE TABLE Author(
aEmail VARCHAR(255) PRIMARY KEY,
fName VARCHAR(255),
lName VARCHAR(255),
bDate date,
city VARCHAR(255)
);

CREATE TABLE Reviewer(
rEmail VARCHAR(255) PRIMARY KEY,
phoneNumber VARCHAR(255),
lName VARCHAR(255),
fName VARCHAR(255),
city VARCHAR(255)
);

CREATE TABLE Paper(
paperID INT PRIMARY KEY,
title VARCHAR(255),
abstract VARCHAR(255),
submissionDate date
);

CREATE TABLE Author_Paper(
authorID INT PRIMARY KEY REFERENCES Author (aEmail),
paperID INT,
isContact BOOLEAN
);

ALTER TABLE Author_Paper
ADD FOREIGN KEY (paperID) REFERENCES Paper(paperID);

ALTER TABLE Author_Paper
MODIFY COLUMN authorID VARCHAR(255);

ALTER TABLE Author_Paper
ADD FOREIGN KEY (authorID) REFERENCES Author(aEmail);

CREATE TABLE Paper_Review(
paperID INT,
reviewerID VARCHAR(255),
score INT,
reviewSubmissionDate date,
reviewInvitationDate date
);

ALTER TABLE Paper_reviewpaper_review_ibfk_1
ADD FOREIGN KEY (paperID) REFERENCES Paper(paperID),
ADD FOREIGN KEY (reviewerID) REFERENCES Reviewer(rEmail);

INSERT INTO Author (aEmail, fName, lName, bDate, city) VALUES("abc", "s", "b", '1981-02-1', "City");
INSERT INTO Author (aEmail, fName, lName, bDate, city) VALUES("ghi", "r", "s", '1999-01-05', "City");
INSERT INTO Reviewer (rEmail, phoneNumber, lName,fName, city) VALUES ("123", "403-333-3333", "k", "b", "City");
INSERT INTO Paper(paperID, title, submissionDate) VALUES (5, "A Paper 5", "2016-02-2");
INSERT INTO Author_Paper(authorID, paperID, isContact) VALUES ("abc", "5", true);
INSERT INTO Paper_Review(paperID, reviewerID, score, reviewSubmissionDate, reviewInvitationDate) VALUES (5, "123", 6, "2016-02-20", "2016-02-15");

一切都会有帮助!

谢谢。

【问题讨论】:

  • 能否将 yozr 表格添加为文本而不是图像
  • 当然很抱歉。表paper_review 仅包含以下列:paperID、reviewerID、Score、reviewSubmissionDate、reviewInvitationDate。我认为价值观本身不应该是必要的。如果您需要更多信息,请告诉我。
  • 为了测试您的查询,我需要一个创建表和数据。我可以看到没有任何问题,但要测试它,我需要数据,请参阅 meta.stackoverflow.com/questions/333952/… 并请编辑您的查询并添加类似代码表结构之类的内容作为注释
  • 我添加了重现问题的所有要求,谢谢,如果可行,请告诉我。
  • 纸质审查就足够了,我运行你的程序,它运行没有问题,没有任何错误。我觉得不是sql的问题,还是mysql的问题,有什么不对,重启电脑,看看mysql event viewer有没有报错

标签: mysql mysql-workbench cursors


【解决方案1】:
DELIMITER $$
CREATE PROCEDURE cur()
BEGIN
DECLARE pScore INT;
DECLARE b BOOLEAN DEFAULT FALSE;
DECLARE aCursor CURSOR FOR SELECT pr.score FROM Paper_Review AS pr;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = TRUE;
OPEN aCursor;
myloop: LOOP
    FETCH aCursor INTO pScore;
    IF b THEN
        LEAVE myloop;
    END IF;
    IF pScore <> -1 THEN
        UPDATE Paper_Review AS pr
        SET pr.score = -1
        WHERE pr.reviewerID = "123" AND pr.reviewSubmissionDate < "2016-03-25";
    END IF;
END LOOP;
CLOSE aCursor;
END;

-- finalize SP definition
$$
-- restore std. delimiter
DELIMITER ;

CALL cur();

fiddle

【讨论】:

  • 谢谢你!不幸的是,我仍然收到上面的错误:(
  • 很遗憾,我仍然遇到上述错误问题中提供的 DDL 与真实的 DDL 不匹配,或者您的执行环境存在一些问题...
猜你喜欢
  • 1970-01-01
  • 2012-07-26
  • 2012-11-26
  • 2012-08-14
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
相关资源
最近更新 更多