2017-02-07 1 views
-1

J'essaye de créer une procédure stockée qui exécuterait la sélection montrée comme la ligne avant la fin. Il faudrait le plus tôt StartDate et le dernier EndDate de mon utilisable et sélectionner tous les jours entre les dates de ma table de calendrier de référence. Malheureusement, quelle que soit la syntaxe que j'essaierai d'utiliser, j'obtiendrai toujours un message d'erreur sur l'affectation des valeurs des sélections utilisables aux variables start/endday. Je n'ai pas trouvé beaucoup de ressources spécifiant la syntaxe correcte des exemples que j'ai vus j'ai essayé ce qui suit.mysql - initialise la variable locale (dans la procédure stockée) à partir d'un résultat de requête

DELIMITER $$ 
CREATE PROCEDURE seldays() 

BEGIN 

DECLARE startday DATE; 
SET startday = (SELECT MIN(StartDate) from user1table1); 
DECLARE endday DATE; 
SET endday = (SELECT MAX(EndDate) from user1table1); 
SELECT calendar_date FROM calendar WHERE calendar_date >= startday AND calendar_date< endday; 

END $$ 
DELIMITER ; 

J'ai essayé aussi d'attribuer des valeurs thusly

SELECT MIN(StartDate) from user1table1 INTO endday; 

En vain. Je pourrais être en mesure de faire fonctionner la procédure sans stocker ces variables - mais c'est quelque chose que je devrai tôt ou tard utiliser de toute façon. Alors, comment remplir correctement les variables locales avec les résultats de la requête dans Mysql?

+1

Pourquoi pas simple 'SELECT calendar_date votre agenda c, (SELECT MIN (StartDate) MinDate, MAX (StartDate) MaxDate de user1table1) u où c.calendar_date> = u.mindate et c.calendar_date <= u .maxdate) '? Pourquoi une procédure au lieu d'un simple sélectionner? –

+1

Déclare variable devrait être sur le dessus –

+0

Merci Ankit Agrawal c'était une chose si simple que j'ai raté –

Répondre

0
SELECT MIN(StartDate) into startday from user1table1 
0

En MySQL, vous pouvez utiliser les select ... into <variable list> from ...statement pour affecter des variables de résultats:

select min(StartDate) into startday from user1table1; 
select max(EndDate) into endday from user1table1; 
+0

Hmm essayé que les erreurs encore. ERREUR 1064 (42000): Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'DECLARE endday DATE; –

+3

Votre message d'erreur n'est pas lié à l'attribution d'une valeur aux variables, votre question entière est trompeuse. – Shadow

+1

Votre 2e déclaration doit être déplacée vers le haut. Tous les déclarations doivent précéder toute autre déclaration. – Shadow

1

Je voudrais juste faire cela en une seule requête. Pourquoi s'embêter avec des variables?

SELECT c.calendar_date 
FROM calendar c JOIN 
    (SELECT MIN(StartDate) as startday, MAX(EndDate) as endday 
     FROM user1table1 
    ) u 
    ON c.calendar_date >= u.startday AND c.calendar_date < u.endday; 
+0

Pourrait fonctionner - mais néanmoins je suppose que je devrais un jour besoin d'un moyen de stocker des résultats de requête dans des variables locales et cela ne semble pas fonctionner pour le moment. –

0

Merci au commentaire "Declare variable doit être au-dessus" par Ankit Agrawal ..

Je peux conclure cette chose une réponse. Je poste ce post comme une réponse correcte, donc si quelqu'un a le même problème, ils peuvent rapidement regarder.

DECLARE n'est autorisé que dans une instruction composée BEGIN ... END et doit être à l'origine, avant toute autre déclaration.

DELIMITER $$ 
CREATE PROCEDURE seldays() 

BEGIN 

DECLARE startday DATE; 
DECLARE endday DATE; 
SELECT MIN(StartDate) INTO startday FROM user1table1; 
SELECT MAX(EndDate) INTO endday FROM user1table1; 
SELECT calendar_date FROM calendar WHERE calendar_date >= startday AND calendar_date< endday; 

END $$ 
DELIMITER ;