2009-07-03 44 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;`