2010-10-20 12 views
19

Estoy tratando de hacer algunas manipulaciones simples con variables en MySQL 5.0 pero no puedo hacer que funcione. He visto muchos (¡muy!) Diferentes sintaxis para DECLARAR/ESTABLECER, no estoy seguro de por qué ... en cualquier caso, presumiblemente, los estoy confundiendo/escogiendo el incorrecto/mezclándolos.Declaración y uso de variables Varchar de MySQL

Aquí está un fragmento mínimo que falla:

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

update mypermits 
    set person = FOO 
where person = oldFOO; 

También he intentado envolviéndolo con BEGIN ... END; y como un PROCEDIMIENTO. En este caso, MySQL Workbench me dice amablemente: "Error de sintaxis SQL cerca de ')'" en la primera línea y "Error de sintaxis SQL cerca de 'DECLARAR oldFOO varchar (7)'" en el segundo. De lo contrario, da a ambas líneas como errores completos, con "Error de sintaxis SQL cerca ..." en ambos.

Editar: Olvidé mencionar que lo he intentado con y sin @s en las variables. Algunos recursos lo tenían, otros sin

¿Qué tonto error estoy cometiendo?

+0

mensaje exactamente lo que está tratando de usar, porque Creé un nuevo procedimiento y no obtuve un error de sintaxis con lo que me proporcionó; vea mi respuesta. –

Respuesta

25

Esto funciona muy bien para mí el uso de 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 ; 

Tabla:

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

¡Parece que funciona! El comando delimitador es lo que necesitaba, aparentemente. Para mí es mágico hasta ahora ... déjame buscarlo. – Charles

0

Parece que olvidó el @ en declaración de variable. También recuerdo haber tenido problemas con SET en MySql hace mucho tiempo.

Trate

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

Lo siento, olvidé mencionar que el error permanece cuando puse @s en las variables (como originalmente lo tuve.) – Charles

0

probar esto:

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

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

"Error de sintaxis SQL cerca de 'declare @foo varchar (7), @oldFoo varchar (7)' " – Charles

+1

Literalmente solo copié y pegué en una nueva consulta y funcionó sin problemas ...¿Tiene algún código que rodee esta porción? – IWriteApps

+0

No. Comenté todo lo demás y todavía dio ese error. – Charles

-1
Declare @variable type(size); 

Set @variable = 'String' or Int ; 

Ejemplo:

Declare @id int; 
set @id = 10; 

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

en MySQL, se puede declarar y utilizar variables con comando set, como a continuación

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

me encontré con el mismo problema usando MySQL Workbench. De acuerdo con MySQL documentation, la declaración DECLARE "declara variables locales dentro de programas almacenados." Eso aparentemente significa que solo se garantiza que funciona con procedimientos/funciones almacenados.

La solución para mí fue simplemente eliminar la declaración DECLARE e introducir la variable en la declaración SET. Para su código que significaría:

-- 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

Necesitará un símbolo '@' para ESTABLECER variables fuera de procedimientos/funciones almacenados. e, g 'SET @ F00 = '138'' – Yoga

0

Si está utilizando phpmyadmin añadir nueva rutina a continuación, no se olvide de envolver su código entre comenzar y terminar enter image description here

Cuestiones relacionadas