Я пытаюсь понять, почему следующее не работает, и я не могу его увидеть. PhpMyAdmin на нашем сервере разработки сгенерировал это точно, но когда я попытаюсь импортировать его - я столкнулся с странной ошибкой синтаксического анализа (?).
mysql> DELIMITER $$
mysql>
mysql> --
mysql> -- Functions
mysql> --
mysql> DROP FUNCTION IF EXISTS `get_class_nextsession`$$
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> CREATE DEFINER=`myusername`@`localhost` FUNCTION `get_class_nextsession`(class_id INT) RETURNS datetime
-> READS SQL DATA
-> BEGIN
-> DECLARE nextsession,startdate,runningdate,enddate DATETIME;
-> SET nextsession= '-';
-> SELECT MIN(CS.start_datetime) INTO startdate FROM site_class_schedule AS CS INNER JOIN site_class AS C ON (C.id=CS.class_id) WHERE CS.class_id=class_id Group by C.id Limit 0,1;
-> IF startdate >= NOW() THEN
-> RETURN startdate;
-> ELSE
-> SELECT CS.start_datetime INTO runningdate FROM site_class_schedule AS CS INNER JOIN site_class AS C ON (C.id=CS.class_id) WHERE CS.class_id=class_id and (NOW() between start_datetime and end_datetime ) Limit 0,1;
-> IF runningdate IS NOT NULL THEN
-> RETURN runningdate;
-> ELSE
-> SELECT MAX(CS.end_datetime) INTO enddate FROM site_class_schedule AS CS INNER JOIN site_class AS C ON (C.id=CS.class_id) WHERE CS.class_id=class_id Group by C.id Limit 0,1;
-> IF enddate < NOW() THEN
-> RETURN enddate;
-> ELSEIF enddate >= NOW() THEN
-> SELECT MIN(CS.start_datetime) INTO startdate FROM site_class_schedule AS CS INNER JOIN site_class AS C ON (C.id=CS.class_id) WHERE CS.class_id=class_id and CS.start_datetime > NOW() Group by C.id Limit 0,1;
->
Display all 1866 possibilities? (y or n)
-> startdate;
->
Display all 1866 possibilities? (y or n)
-> D IF;
-> END IF;
-> END IF;
-> RETURN nextsession;
-> END$$
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ';
D IF;
END IF;
END IF;
RETURN nextsession;
END' at line 19
mysql>
mysql>
Обновление выполнения 1
Это РАБОТАЕТ
mysql> DELIMITER $$
mysql>
mysql> DROP FUNCTION IF EXISTS `get_class_nextsession`$$
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> CREATE DEFINER=`myusername`@`localhost` FUNCTION `get_class_nextsession`(class_id INT) RETURNS datetime
-> READS SQL DATA
-> BEGIN
-> RETURN nextsession;
-> END$$
Query OK, 0 rows affected (0.00 sec)
Это РАБОТАЕТ
mysql>
mysql> DROP FUNCTION IF EXISTS `get_class_nextsession`$$
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> CREATE DEFINER=`myusername`@`localhost` FUNCTION `get_class_nextsession`(class_id INT) RETURNS datetime
-> READS SQL DATA
-> BEGIN
-> DECLARE nextsession,startdate,runningdate,enddate DATETIME;
-> RETURN nextsession;
-> END$$
Query OK, 0 rows affected (0.00 sec)
Это НЕ РАБОТАЕТ - Обратите внимание, как я пытаюсь упростить запрос/заявления в базовые.
mysql> DROP FUNCTION IF EXISTS `get_class_nextsession`$$
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> CREATE DEFINER=`myusername`@`localhost` FUNCTION `get_class_nextsession`(class_id INT) RETURNS datetime
-> READS SQL DATA
-> BEGIN
-> DECLARE nextsession,startdate,runningdate,enddate DATETIME;
-> SET nextsession= '-';
-> SELECT MIN(start_datetime) INTO startdate FROM site_class_schedule;
-> IF startdate >= NOW() THEN
-> RETURN startdate;
-> ELSE
-> END IF;
-> RETURN nextsession;
-> END$$
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END IF;
RETURN nextsession;
END' at line 10
Ага!
Определенно "необычная" ошибка, в которой "ничего" было неправильно! Проблемы, с которыми я столкнулся, были вызваны чрезмерными вкладами, создаваемыми или размещенными в исходном создании FUNCTION! Два последовательных \t s разбивали поток ввода данных в приглашении mysql и имели mysql ask
Display all 1866 possibilities? (y or n)
Кроме того, когда я был скопирован здесь в SO, я вставлял окончательный вывод моего взаимодействия с командной строкой MYSQL, а не то, что я действительно разместил там "там"
DROP FUNCTION IF EXISTS `get_class_nextsession`$$
CREATE DEFINER=`myusername`@`localhost` FUNCTION `get_class_nextsession`(class_id INT) RETURNS datetime
READS SQL DATA
BEGIN
DECLARE nextsession,startdate,runningdate,enddate DATETIME;
SET nextsession= '-';
SELECT MIN(CS.start_datetime) INTO startdate FROM site_class_schedule AS CS INNER JOIN site_class AS C ON (C.id=CS.class_id) WHERE CS.class_id=class_id Group by C.id Limit 0,1;
IF startdate >= NOW() THEN
RETURN startdate;
ELSE
SELECT CS.start_datetime INTO runningdate FROM site_class_schedule AS CS INNER JOIN site_class AS C ON (C.id=CS.class_id) WHERE CS.class_id=class_id and (NOW() between start_datetime and end_datetime ) Limit 0,1;
IF runningdate IS NOT NULL THEN
RETURN runningdate;
ELSE
SELECT MAX(CS.end_datetime) INTO enddate FROM site_class_schedule AS CS INNER JOIN site_class AS C ON (C.id=CS.class_id) WHERE CS.class_id=class_id Group by C.id Limit 0,1;
IF enddate < NOW() THEN
RETURN enddate;
ELSEIF enddate >= NOW() THEN
SELECT MIN(CS.start_datetime) INTO startdate FROM site_class_schedule AS CS INNER JOIN site_class AS C ON (C.id=CS.class_id) WHERE CS.class_id=class_id and CS.start_datetime > NOW() Group by C.id Limit 0,1;
RETURN startdate; ****ISSUE WITH MORE THAN 2 TABS****
END IF; ****ISSUE WITH MORE THAN 2 TABS****
END IF;
END IF;
RETURN nextsession;
END$$