2010-10-20 14 views
19

J'essaie de faire quelques manipulations simples avec des variables dans MySQL 5.0 mais je n'arrive pas vraiment à le faire fonctionner. J'ai vu beaucoup de syntaxes (très!) Différentes pour DECLARE/SET, je ne sais pas pourquoi ... en tout cas je les confondrais vraisemblablement/en choisissant le mauvais/en les mélangeant.Déclarer et utiliser les variables MySQL varchar

est ici un fragment minimal qui échoue:

DECLARE FOO varchar(7); 
DECLARE oldFOO varchar(7); 
SET FOO = '138'; 
SET oldFOO = CONCAT('0', FOO); 

update mypermits 
    set person = FOO 
where person = oldFOO; 

J'ai aussi essayé emballer avec BEGIN ... END; et comme une procédure. Dans ce cas MySQL Workbench me dit utilement: "Erreur de syntaxe SQL près de ')'" sur la première ligne et "Erreur de syntaxe SQL près de 'DECLARE oldFOO varchar (7)'" sur la seconde. Dans le cas contraire, les deux lignes sont considérées comme des erreurs complètes, avec "Erreur de syntaxe SQL proche de ..." sur les deux. Edit: J'ai oublié de mentionner que je l'ai essayé avec et sans @ sur les variables. Certaines ressources l'ont eu avec, d'autres sans.

Quelle erreur stupide je fais? Il semblerait que vous ayez oublié la déclaration de variable @ dans l'ordre de

+0

Poster exactement ce que vous essayez d'utiliser, parce que J'ai créé une nouvelle procédure et je n'obtiens pas d'erreur de syntaxe en utilisant ce que vous avez fourni - voir ma réponse. –

Répondre

25

Cela fonctionne bien pour moi en utilisant MySQL 5.1.35:

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `example`.`test` $$ 
CREATE PROCEDURE `example`.`test`() 
BEGIN 

    DECLARE FOO varchar(7); 
    DECLARE oldFOO varchar(7); 
    SET FOO = '138'; 
    SET oldFOO = CONCAT('0', FOO); 

    update mypermits 
    set person = FOO 
    where person = oldFOO; 

END $$ 

DELIMITER ; 

Tableau:

DROP TABLE IF EXISTS `example`.`mypermits`; 
CREATE TABLE `example`.`mypermits` (
    `person` varchar(7) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO mypermits VALUES ('0138'); 

CALL test() 
+2

Cela semble fonctionner! La commande délimiteur est ce dont j'avais besoin, apparemment. C'est magique pour moi jusqu'ici ... laisse-moi regarder ça. – Charles

0

Aussi, je me souviens d'avoir des problèmes avec MySQL il y a longtemps.

Essayez

DECLARE @FOO varchar(7); 
DECLARE @oldFOO varchar(7); 
SELECT @FOO = '138'; 
SELECT @oldFOO = CONCAT('0', @FOO); 

update mypermits 
    set person = @FOO 
where person = @oldFOO; 
+0

Désolé, j'ai oublié de mentionner que l'erreur reste quand je mets @s sur les variables (comme je l'avais à l'origine.) – Charles

0

essayez ceci:

declare @foo varchar(7), 
     @oldFoo varchar(7) 

set @foo = '138' 
set @oldFoo = '0' + @foo 
+2

"Erreur de syntaxe SQL près de 'declare @foo varchar (7), @oldFoo varchar (7)' " – Charles

+1

Je l'ai littéralement copié et collé sur une nouvelle requête et cela a fonctionné sans problème ...avez-vous du code entourant cette partie? – IWriteApps

+0

Non, j'ai commenté tout le reste et il a quand même donné cette erreur. – Charles

-1
Declare @variable type(size); 

Set @variable = 'String' or Int ; 

Exemple:

Declare @id int; 
set @id = 10; 

Declare @str char(50); 
set @str='Hello' ; 
0

En Mysql, nous pouvons déclarer et utiliser des variables avec commande set comme ci-dessous

mysql> set @foo="manjeet"; 
mysql> select * from table where name = @foo; 
6

je suis tombé sur le même problème en utilisant MySQL Workbench. Selon le MySQL documentation, l'instruction DECLARE "déclare les variables locales dans les programmes stockés." Cela signifie apparemment qu'il est seulement garanti de travailler avec des procédures/fonctions stockées.

La solution pour moi était simplement de supprimer l'instruction DECLARE et d'introduire la variable dans l'instruction SET. Pour votre code qui signifierait:

-- DECLARE FOO varchar(7); 
-- DECLARE oldFOO varchar(7); 

-- the @ symbol is required 
SET @FOO = '138'; 
SET @oldFOO = CONCAT('0', FOO); 

UPDATE mypermits SET person = FOO WHERE person = oldFOO; 
+4

Vous aurez besoin d'un symbole '@' pour paramétrer les variables en dehors des procédures/fonctions stockées. e, g 'SET @ F00 = '138'' – Yoga

0

Si vous utilisez phpMyAdmin pour ajouter une nouvelle routine alors ne pas oublier d'envelopper votre code entre BEGIN et END enter image description here

Questions connexes