8791 sujets

Développement web côté serveur, CMS

Bonjour a tous.

J'ai un petit problème, lorsque j'utilise la fonction DECLARE, mysql me met qu'il y a une erreur de syntaxe, je ne vois pas de quoi cela peux venir, le code m'a pourtant l'air bon.

J'ai même testé avec un code tout bête :

DECLARE @test int 
SET @test = 1 

print @test
  

mais rien ne marche, si vous avez une idée je suis preneur. J'ai pensé que ca pouvais venir d'un module de wamp a activer mais je ne vois pas.

Merci d'avance
Salut,

je ne vois pas trop ce que tu cherches à faire mais :
* il me semble qu'on ne peut pas déclarer une variable en dehors de BEGIN ... END (cf. triggers et procédures stockées).
* il me semble qu'il faut séparer tes lignes par des points-virgules ;
* il me semble que print ne s'utilise pas ainsi. Cela sert à afficher la dernière commande effectuée sans l'exécuter (je crois).

Voir http://dev.mysql.com/doc/refman/5.0/fr/declare.html
je balance mon script d'origine

DECLARE @IdUser INT,
DECLARE @CodeArticle INT

SET @IdUser = 1,
SET @CodeArticle = 1

IF EXIST (SELECT * FROM pannier
WHERE personnel = @IdUser AND article = @CodeArticle)
BEGIN

UPDATE pannier
SET quantite = (SELECT quantite FROM pannier
WHERE personnel = @IdUser AND Article = @CodeArticle) + 1
END

ELSE
BEGIN

INSERT INTO pannier ('personnel', 'article', 'quantite')
VALUES (@IdUser, @CodeArticle, 1)
END

l'idée est de tester le comportement de la requête avt d'en faire une procédure stockée histoire de bien vérifier le bon fonctionnement

j'utilise WampServer 2 avec MySQL 5.1 dessus

l'instruction DECLARE n'a pas l'air d'être reconnu par l'analyseur de requête intégré.

J'ai essayé les séparations de lignes avec des "," et ";" mais rien n'y fait. meme sans separation.

Le bout de code du premier message était juste pour illustrer que même DECLARE avec un script SQL des plus basic ne fonctionne pas.

Ce que je comprends pas c'est que pourtant DECLARE existe bien dans la documentation MySQL 5 et que j'ai , il me semble bien utilisé la bonne syntaxe.

je suis sur qu'il y a une astuce bete comme bonjour mais là, je cale.

Merci d'avance
Salut,

D'une part, l'utilisation de l'arobase devant ton nom de variable lui confère une portée globale, donc ton DECLARE est inutile.
D'autre part, et comme le fait remarquer Heyoan, le DECLARE ne s'utilise que dans une fonction/procédure pour déclarer les variables locales. Donc sans variable locale parce que pas de fonction/procédure, pas de DECLARE.
Salut,

ton script qui aurait presque l'air pas mal du tout, voir bien ( j'ai pas testé )
en SQL server ( le sql que je prefere Smiley smile )
n' est pas faisable en mysql. pas sans creer une procedure en tout cas


mais bon creer une procedure et la detruire derriere c'est sans consequence . une procedure ce n'est pas un trigger ca ne se lance pas tous seul.

j'ai testé par curiosité jusqu'a arrivé a créer qq chose:

1/ DECLARE @IdUser INT, NIET

DECLARE IdUser INT; semble passer pas de @ dans le declare

2/ IF EXIST manque un s IF EXISTS (select ... ) et un THEN apres. pas de BEGIN END obligatoire a priori . et le IF ce fini par un END IF;

3/ le update ne marche pas car on ne peut pas faire de select pannier dans un update de pannier.

si tu utilises une autre table par contre c'est bon

quoi que la requete me laisse perplexe. si ça aurait marché tu aurais updaté toutes les lignes de ta table ( pas de where pour le update là!!!!)

j'aurais fais moi

	UPDATE pannier
	SET quantite =  quantite = quantite +1
	WHERE personnel = @IdUser AND Article = @CodeArticle;

4/ le insert marche pas sur ma version a cause des quotes (') autour des noms des champs

5/ mettre des ; ( et si tu testes sur phpmyadmin comme moi definir un delimiter autre )

au final ma version de test qui a bien voulu se creer

CREATE PROCEDURE testsp2 (x VARCHAR(5))

BEGIN
	DECLARE IdUser INT;
	DECLARE CodeArticle INT;

	SET @IdUser = 1;
	SET @CodeArticle = 1;

	IF EXISTS (SELECT * FROM pannier
	 WHERE personnel = @IdUser AND article = @CodeArticle)
	THEN 


	UPDATE pannier
	SET quantite =  2
	WHERE personnel = @IdUser AND Article = @CodeArticle;
	

	ELSE
	

	INSERT INTO pannier (personnel, article, quantite)
	VALUES (@IdUser, @CodeArticle, 1);

	END IF;
END  

Modifié par CPascal (09 Sep 2009 - 00:16)