web-dev-qa-db-fra.com

Déclarer et utiliser les variables MySQL varchar

J'essaie de faire quelques manipulations simples avec des variables dans MySQL 5.0 mais je n'arrive pas à le faire fonctionner. J'ai vu beaucoup (très!) Syntaxen différents pour DECLARE/SET, je ne sais pas pourquoi ... dans tous les cas, je les confondre/choisir le mauvais/les mélanger.

Voici 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é de l'envelopper avec BEGIN ... END; et en tant que PROCEDURE. 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. Sinon, les deux lignes sont entièrement des erreurs, avec "erreur de syntaxe SQL proche de ..." sur les deux.

Edit: J'ai oublié de mentionner que je l'ai essayé avec et sans @s sur les variables. Certaines ressources ont eu avec, d'autres sans.

Quelle erreur stupide je fais?

20
Charles

Cela fonctionne très bien pour moi avec 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 ;

Table:

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()
26
OMG Ponies

J'ai rencontré le même problème avec MySQL Workbench. Selon la documentation MySQL , l'instruction DECLARE "déclare les variables locales dans les programmes stockés". Cela signifie apparemment qu'il est uniquement garanti de travailler avec des procédures/fonctions stockées.

La solution pour moi consistait simplement à supprimer l'instruction DECLARE et à introduire la variable dans l'instruction SET. Pour votre code, cela voudrait dire:

-- 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;
6
Amos Long

Si vous utilisez phpmyadmin pour ajouter une nouvelle routine, n'oubliez pas de placer votre code entre BEGIN et FIN  enter image description here

0
Repky

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

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

On dirait que vous avez oublié la déclaration @ dans la variable. De plus, je me souviens d'avoir eu des problèmes avec SET dans MySql il y a longtemps.

Essayer

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
rickythefox

essaye ça:

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

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