2009-07-03 5 views
0

Bonjour, je m'amuse à essayer d'obtenir une procédure stockée pour analyser correctement MySQL.Erreurs de syntaxe de la procédure stockée mysql avec les dates

Mon problème concerne les dates. J'essaie d'obtenir la procédure de magasin pour créer une date de début qui est le début du mois en cours, par exemple. 2009-07-01. En utilisant cette date, j'utilise ensuite la fonction DATA_ADD() pour ajouter un mois afin qu'il se lise le 2009-08-01.

Cependant, mon problème est que quand je tente de courir le procdure pour créer ce que j'obtiens l'erreur suivante:

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())); 

Le code de la procédure de magasin ressemble à ceci:

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 J'ai exécuté les requêtes indépendamment et elles retournent toutes des valeurs correctes et fonctionnent, cela ne commence à échouer qu'avec des erreurs de syntaxe lorsque je les ajoute dans une procédure stockée.

Qu'est-ce qui me manque ici qui cause toutes mes douleurs à la tête?

Merci ...

Répondre

1

Vous devez DÉCLARER toutes les variables au début du bloc BEGIN-END. Vous avez également des parenthèses incompatibles (extra close) dans votre ligne CAST. Ce qui suit devrait fonctionner:

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

je fait cette première! Bien que j'ai remarqué que j'ai laissé l'extra) dans la ligne de fonte! – James

0

J'ai essayé votre exemple, il travaille dans mon 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) 

Vous pouvez essayer Réécrire SET comme

SELECT YEAR(CURRENT_DATE()) INTO cur_year; 

Sera-t- travail? Quelle est votre version de MySQL? ..

+0

La version de MySQL J'utilise est 5.0.45 –

0

Vous devez déclarer toutes les variables avant de commencer à affecter des valeurs, le code suivant semble fonctionner pour moi:

`DELIMITER $$

DROP PROCEDURE SI EXISTE test.sp_test $$ CREATE PROCEDURE test.sp_test() BEGIN

/nous travaillons le début et dates de fin/ 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 (date_date_date AS DATE));

SET end_date = (SELECT DATE_ADD (date_début, INTERVAL 1 MOIS));

INSERT INTO alex.my_table (startdate, enddate) VALEURS (start_date, end_date);

FIN $$

DELIMITER; `

Questions connexes