Reputation: 1
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
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