user3223695
user3223695

Reputation: 1

MySQL Syntax Error: I just can't find it

I am executing the following SQL script for a MySQL server. It is to create a SPROC that accepts a course code and start date as parameters then add sessions for each module on consecutive weekdays.

    DELIMITER $$
CREATE PROCEDURE Assign_Schedule (IN course_code CHAR(3),IN start_date DATE)
BEGIN
        DECLARE module_code CHAR(2);
        DECLARE day_count TINYINT;
        DECLARE new_date DATE;  
        DECLARE finished BOOLEAN;

        DECLARE mod_cursor CURSOR FOR SELECT code FROM module WHERE  module.course_code = course_code;


        DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = TRUE;
        SET day_count = 0;
        SET finished = FALSE;

        IF PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM NOW()), EXTRACT(YEAR_MONTH FROM start_date)) > 0 THEN
            OPEN mod_cursor;

            insert_schedule : LOOP
            BEGIN
                FETCH NEXT FROM mod_cursor INTO module_code;

                IF finished THEN
                    LEAVE insert_schedule;
                END IF;

                SET new_date = DATEADD(day, day_count, start_date);

                    IF LEFT(DATE_FORMAT(new_date,'%W'),1) != 'S' THEN
                        INSERT INTO session (code, date) VALUES (module_code,new_date);
                        SET day_count = (day_count + 1);
                    ELSEIF DATE_FORMAT(new_date,'%w') = 0 THEN
                        INSERT INTO session (code, date) VALUES (module_code, DATEADD(day, day_count + 1,new_date));
                        SET day_count = (day_count + 2);
                    ELSEIF DATE_FORMAT(new_date,'%w') = 6 THEN
                        INSERT INTO session (code, date) VALUES (module_code, DATEADD(day, day_count + 2,new_date));
                        SET day_count = (day_count + 3);
                    END IF;
            END LOOP insert_schedule;
            CLOSE mod_cursor;
        END IF;
    END;
    $$

I get the following error message:

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near:
       'LOOP insert_schedule;
     CLOSE mod_cursor;
   END IF;
 END;
$$' 
at line 38

I'd be very grateful if somebody could tell me where the error is, cheers!

Upvotes: 0

Views: 103

Answers (1)

Vignesh Kumar A
Vignesh Kumar A

Reputation: 28403

My guess is you have missed END for Second BEGIN

There is no END before these

 'LOOP insert_schedule;
     CLOSE mod_cursor;
   END IF;
 END;
$$' 



      DELIMITER $$
CREATE PROCEDURE Assign_Schedule (IN course_code CHAR(3),IN start_date DATE)
BEGIN
        DECLARE module_code CHAR(2);
        DECLARE day_count TINYINT;
        DECLARE new_date DATE;  
        DECLARE finished BOOLEAN;

        DECLARE mod_cursor CURSOR FOR SELECT code FROM module WHERE  module.course_code = course_code;


        DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = TRUE;
        SET day_count = 0;
        SET finished = FALSE;

        IF PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM NOW()), EXTRACT(YEAR_MONTH FROM start_date)) > 0 THEN
            OPEN mod_cursor;

            insert_schedule : LOOP
            BEGIN
                FETCH NEXT FROM mod_cursor INTO module_code;

                IF finished THEN
                    LEAVE insert_schedule;
                END IF;

                SET new_date = DATEADD(day, day_count, start_date);

                    IF LEFT(DATE_FORMAT(new_date,'%W'),1) != 'S' THEN
                        INSERT INTO session (code, date) VALUES (module_code,new_date);
                        SET day_count = (day_count + 1);
                    ELSEIF DATE_FORMAT(new_date,'%w') = 0 THEN
                        INSERT INTO session (code, date) VALUES (module_code, DATEADD(day, day_count + 1,new_date));
                        SET day_count = (day_count + 2);
                    ELSEIF DATE_FORMAT(new_date,'%w') = 6 THEN
                        INSERT INTO session (code, date) VALUES (module_code, DATEADD(day, day_count + 2,new_date));
                        SET day_count = (day_count + 3);
                    END IF;
                END;
            END LOOP insert_schedule;
            CLOSE mod_cursor;
        END IF;
    END;
    $$

Upvotes: 1

Related Questions