Ошибка 1064 при создании инструкции процедуры в рабочей среде mySQL - PullRequest
0 голосов
/ 28 октября 2018

Это мой код для оператора процедуры, который, по моему мнению, работает правильно, но я не могу его запустить, потому что постоянно получаю эту ошибку: imagecode, 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 ;

1 Ответ

0 голосов
/ 29 октября 2018

MySQL Workbench выдает сообщение об ошибке с подробной информацией.Разве вы этого не видели?На самом деле, это дает вам 2 ошибки, но первая (о FETCH NEXT) - это ошибка в проверке синтаксиса WB, которая будет исправлена ​​в следующем выпуске.

Вторая говорит:

«DATE_ADD» недопустимо в этой позиции, ожидая полного вызова функции или другого выражения.

Что гораздо лучше описывает, что не так, как эти ужасные сообщения об ошибках от MySQL (или MariaDB дляэто важно).Когда вы смотрите на этот вызов, вы видите пробел перед открывающей скобкой, который меняет значение из-за режима SQL IGNORE_SPACE .Удалите пробел, и ваш SP будет принят.

...