Получение странной ошибки с MySQL курсорами, содержащими простой цикл - PullRequest
1 голос
/ 05 апреля 2020

Получение странной ошибки с MySQL курсорами. Может быть тривиально, но я не вижу, что происходит.

Вот ошибка, если я запускаю ее с помощью "CALL cur ();" обведено ниже ...:

Код ошибки: 1054. Неизвестный столбец "СДЕЛАНО" в "списке полей"

Это заставляет меня поверить, что оно ссылается на мой Paper_Review Таблица. Однако таблица Paper_Review содержит только следующие столбцы:

paperID, reviewerID, Score, reviewSubmissionDate, reviewInvitationDate

Если я запускаю ее, выделяя весь запрос, я получаю совершенно другую ошибку:

Код ошибки: 1064. У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей MySQL версии сервера, чтобы найти правильный синтаксис для использования рядом с 'END' в строке 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;

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");

Всё поможет!

Спасибо.

1 Ответ

0 голосов
/ 05 апреля 2020
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();

скрипка

...