Привет, мне весело, пытаясь заставить хранимую процедуру правильно разбираться в MySQL.
Моя проблема связана с датами. Я пытаюсь получить процедуру хранилища, чтобы создать дату начала, которая является началом текущего месяца, например. 2009-07-01. Используя эту дату, я затем использую функцию DATA_ADD(), чтобы добавить месяц, чтобы он читал 2009-08-01.
Однако моя проблема заключается в том, что при попытке запустить procdure для его создания я получаю следующую ошибку:
Script line: 7 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 'DECLARE
cur_month INT;
SET cur_month = (SELECT MONTH(CURRENT_DATE()));
Код процедуры хранения выглядит следующим образом:
DROP PROCEDURE IF EXISTS sp_test;
DELIMITER //
CREATE PROCEDURE sp_test()
BEGIN
/*we work out the start and end dates*/
DECLARE cur_year INT;
SET cur_year = (SELECT YEAR(CURRENT_DATE()));
DECLARE cur_month INT;
SET cur_month = (SELECT MONTH(CURRENT_DATE()));
DECLARE temp_date VARCHAR(10);
SET temp_date = (SELECT CONCAT(cur_year,'-',cur_month,'-01'));
DECLARE start_date DATE;
SET start_date = (SELECT CAST(temp_date AS DATE)));
DECLARE end_date DATE;
SET end_date = (SELECT DATE_ADD(start_date, INTERVAL 1 MONTH));
INSERT INTO my_table (startdate, enddate)VALUES(start_date, end_date);
END; //
DELIMITER ;
Я запускаю запросы независимо, и все они возвращают правильные значения и работают, они только начинают сбой с синтаксическими ошибками, когда я добавляю их в хранимую процедуру.
Что мне здесь не хватает, что вызывает все боли в голове?
Спасибо...
Вам нужно ОБРАТИТЬ все переменные в начале блока BEGIN - END. У вас также есть несогласованные круглые скобки (дополнительно закрытые) в вашей строке CAST. Должно работать следующее:
DROP PROCEDURE IF EXISTS sp_test;
DELIMITER //
CREATE PROCEDURE sp_test()
BEGIN
/*we work out the start and end dates*/
DECLARE cur_year INT;
DECLARE cur_month INT;
DECLARE temp_date VARCHAR(10);
DECLARE start_date DATE;
DECLARE end_date DATE;
SET cur_year = (SELECT YEAR(CURRENT_DATE()));
SET cur_month = (SELECT MONTH(CURRENT_DATE()));
SET temp_date = (SELECT CONCAT(cur_year,'-',cur_month,'-01'));
SET start_date = (SELECT CAST(temp_date AS DATE));
SET end_date = (SELECT DATE_ADD(start_date, INTERVAL 1 MONTH));
INSERT INTO my_table (startdate, enddate)VALUES(start_date, end_date);
END; //
DELIMITER ;
Вы должны объявить все переменные, прежде чем начинать присваивать им значения, следующий код работает для меня:
`DELIMITER $$
ПРОЦЕДУРА РАЗРЕШЕНИЯ ЕСЛИ EXISTS test.sp_test $$ CREATE PROCEDURE test.sp_test() НАЧАТЬ
/мы разрабатываем даты начала и окончания / DECLARE cur_year INT; DECLARE cur_month INT; DECLARE temp_date VARCHAR (10); DECLARE start_date DATE; DECLARE end_date DATE;
SET cur_year = (SELECT YEAR (CURRENT_DATE()));
SET cur_month = (SELECT MONTH (CURRENT_DATE()));
SET temp_date = (SELECT CONCAT (cur_year, '-', cur_month, '- 01'));
SET start_date = (SELECT CAST (temp_date AS DATE));
SET end_date = (SELECT DATE_ADD (start_date, INTERVAL 1 MONTH));
INSERT INTO alex.my_table (startdate, enddate) VALUES (start_date, end_date);
END $$
DELIMITER; `
Я пробовал ваш пример, он работает в моем MySQL 5.0.32:
delimiter //
CREATE PROCEDURE sp_test()
BEGIN
DECLARE cur_year INT;
SET cur_year = (SELECT YEAR(CURRENT_DATE()));
INSERT INTO tt (y) VALUES (cur_year);
END; //
delimiter ;
CREATE TABLE tt (y INT);
CALL sp_test();
Query OK, 1 row affected (0.00 sec)
Вы можете попробовать переписать SET как
SELECT YEAR(CURRENT_DATE()) INTO cur_year;
Будет ли это работать? Какая ваша версия MySQL?..