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

Iクエリを独立して実行すると、それらはすべて正しい値を返して動作します。ストアドプロシージャにそれらを追加すると、構文エラーで失敗するだけです。

私の頭が痛む原因は何ですか?私はあなたの例を試してみた

おかげで...

答えて

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

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) 

あなたは

SELECT YEAR(CURRENT_DATE()) INTO cur_year; 

としてSETを書き換える試すことができますウィルそれ作業?あなたのMySQLのバージョンは何ですか?

+0

私が使っているのMySQLのバージョンでは、私が最初にこれを行っ5.0.45 –

0

をあなたは、あなたがそれらに値を割り当てるために開始する前にすべての変数を宣言する必要があり、次のコードは、私のために働くようだ:

`DELIMITER $$

のDROP PROCEDURE test.sp_test $$ CREATE PROCEDUREのtest.sp_testを存在する場合は() 我々はスタートをうまくし、最後は/をさかのぼり

/BEGINDECLARE 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(開始日、終了日);

END $$

DELIMITER; `

関連する問題