Это мой код для оператора процедуры, который, по моему мнению, работает правильно, но я не могу его запустить, потому что постоянно получаю эту ошибку: code, no
, taken, due) VA' at line 70"> Код ошибки: 1064. У вас есть ошибка в вашемСинтаксис SQL;проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом с ');- оформить новый кредит.Вставить кредит (code
, no
, взято, причитается) VA 'в строке 70
Я пытаюсь найти способы исправить это, но я ничего не нашел.Может кто-нибудь еще узнать, написал ли я что-то неправильно или я допустил какие-то ошибки в своем коде, которые я не вижу?Ошибка отправляет меня на линию 70, но FETCH NEXT FROM copy_c INTO copy_code;
говорит мне, что FROM
не в правильном положении.Также я включаю свои комментарии для более простого способа чтения этого кода.
DELIMITER $$
CREATE PROCEDURE `new_loan` (IN book_isbn CHAR(17), IN student_no INT)
BEGIN
-- search for the copy of the book and test for loan record in loan table.
DECLARE copy_code, loan_test INT;
-- test for successful loan and for end of cursor.
DECLARE inserted, complete BOOLEAN;
-- the duration date and current date for new loan issue and number of days for the new loan.
DECLARE due, cur DATE;
DECLARE copy_dur TINYINT;
-- test if students can loan books.
DECLARE embargo_status BIT(1) DEFAULT b'1';
-- cursor for copy codes based on isbn.
DECLARE copy_c CURSOR FOR
SELECT `code`
FROM copy
WHERE isbn = book_isbn;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET complete = TRUE;
OPEN copy_c;
-- get student embargo status.
SET embargo_status = (SELECT embargo
FROM student
WHERE `no` = student_no);
SELECT embargo_status;
-- check if the student is valid or embargo is no, if not report a message.
IF (embargo_status IS NULL OR embargo_status = b'1') THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'The student is not valid or has embargo!';
END IF;
SET inserted = FALSE;
SET copy_code = 0;
-- loop through copies to see when that is available.
copy_codes: LOOP
FETCH NEXT FROM copy_c INTO copy_code;
IF complete THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'We looped to end and found nothing!';
END IF;
-- if a copy is available then loan_test will be null.
-- if return is null the book is out on loan and a non null value will be returned to loan_test.
SET loan_test = (SELECT `code` FROM loan
WHERE (`code` = copy_code) AND (`return` IS NULL));
-- if a copy is available loan_test will be null.
-- A null value implies that the copy had a one or many records in loan with a non null return or the copy was never out on loan.
IF (loan_test IS NULL) THEN
SET cur = CURRENT_DATE();
SET copy_dur = (SELECT duration
FROM copy
WHERE `code` = copy_code);
-- calculate due date.
SET due = DATE_ADD (cur, INTERVAL copy_dur DAY);
-- issue the new loan.
INSERT INTO loan (`code`, `no`, taken, due)
VALUES (copy_code, student_no, cur, due);
SET inserted = TRUE;
LEAVE copy_codes;
END IF;
END LOOP;
CLOSE copy_c;
-- inform users of a failed loan.
IF (inserted = FALSE) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'No currently available copies or book does not exist! ';
END IF;
END$$
DELIMITER ;