MySQL ошибки синтаксиса хранимой процедуры с датами

0

Привет, мне весело, пытаясь заставить хранимую процедуру правильно разбираться в 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 ;

Я запускаю запросы независимо, и все они возвращают правильные значения и работают, они только начинают сбой с синтаксическими ошибками, когда я добавляю их в хранимую процедуру.

Что мне здесь не хватает, что вызывает все боли в голове?

Спасибо...

Теги:
stored-procedures

3 ответа

1
Лучший ответ

Вам нужно ОБРАТИТЬ все переменные в начале блока 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 ;
  • 0
    Я сделал это первым! Хотя я заметил, что я оставил лишний) в линии литья!
0

Вы должны объявить все переменные, прежде чем начинать присваивать им значения, следующий код работает для меня:

`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; `

0

Я пробовал ваш пример, он работает в моем 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?..

  • 0
    Используемая версия MySQL - 5.0.45.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню