2009-07-03 90 views
0

嗨我很开心试图让存储过程在MySQL中正确解析。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 ; 

我已经独立运行查询并且它们都返回正确的值并且工作,当我将它们添加到存储过程中时,它只会开始失败并出现语法错误。

我在这里错过了什么导致我所有的头痛?

谢谢...

回答

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

这样做第一!虽然我注意到我在演员阵容中留下了额外的)! – James 2009-07-03 14:28:54

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) 

你可以尝试的rewrite设置为

SELECT YEAR(CURRENT_DATE()) INTO cur_year; 

它会工作?您的MySQL版本是什么?

+0

我使用的MySQL版本5.0.45是我 – 2009-07-03 14:26:29

0

你必须声明所有变量,你开始给它们赋值之前,下面的代码似乎为我工作:

`DELIMITER $$

DROP PROCEDURE IF EXISTS test.sp_test $$ CREATE PROCEDURE test.sp_test() BEGIN

/我们制定出开始和结束日期/ DECLARE cur_year INT; DECLARE cur_month INT; DECLARE temp_date VARCHAR(10); DECLARE start_date DATE; DECLARE end_date DATE;设置cur_year =(SELECT YEAR(CURRENT_DATE()));设置cur_month =(选择月(CURRENT_DATE())); SET temp_date =(SELECT CONCAT(cur_year,' - ',cur_month,' - 01')); SET START_DATE =(SELECT CAST(temp_date AS DATE));设置结束日期=(SELECT DATE_ADD(start_date,INTERVAL 1 MONTH)); END_DATE_ADD(start_date,INTERVAL 1 MONTH));

INSERT INTO alex。my_table(startdate,enddate)VALUES(start_date,end_date);

END $$

DELIMITER;`