2010-10-20 5 views
19

Sto cercando di eseguire alcune semplici manipolazioni con le variabili in MySQL 5.0 ma non riesco a farlo funzionare correttamente. Ho visto molti (molto!) Differenti sintassi per DECLARE/SET, non sono sicuro del perché ... in ogni caso, presumo che io li confonda/scelgo quello sbagliato/li mescoli.Dichiarazione e utilizzo delle variabili varchar di MySQL

Ecco un frammento minimo che non riesce:

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

update mypermits 
    set person = FOO 
where person = oldFOO; 

Ho anche provato avvolgendolo con BEGIN ... END; e come PROCEDIMENTO. In questo caso MySQL Workbench mi dice: "Errore di sintassi SQL vicino a") "nella prima riga e" Errore di sintassi SQL vicino a "DECLARE oldFOO varchar (7)" "sul secondo. Altrimenti fornisce entrambe le righe come errori completi, con "Errore di sintassi SQL vicino a ..." su entrambi.

Modifica: Ho dimenticato di dire che l'ho provato con e senza @s sulle variabili. Alcune risorse ce l'hanno, altre senza.

Quale stupido errore sto facendo?

+0

Messaggio esattamente ciò che si sta tentando di utilizzare, a causa Ho creato una nuova procedura e non ricevo un errore di sintassi utilizzando quello che hai fornito - vedi la mia risposta. –

risposta

25

Questo funziona bene per me usando 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 ; 

Tabella:

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

Sembra funzionare! Il comando delimitatore è ciò di cui avevo bisogno, a quanto pare. Per me è una magia finora ... fammi vedere. – Charles

0

Sembra che tu abbia dimenticato la dichiarazione della variabile @ in. Inoltre ricordo di avere problemi con SET in MySql molto tempo fa.

Prova

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

Mi spiace, ho dimenticato di menzionare che l'errore rimane quando inserisco @s sulle variabili (come originariamente l'avevo). – Charles

0

provare questo:

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

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

"Errore di sintassi SQL vicino a 'declare @foo varchar (7), @oldFoo varchar (7)' " – Charles

+1

Ho letteralmente copiato e incollato su una nuova query e ha funzionato senza problemi ...hai qualche codice che circonda questa parte? – IWriteApps

+0

No. Ho commentato tutto il resto e ha ancora dato quell'errore. – Charles

-1
Declare @variable type(size); 

Set @variable = 'String' or Int ; 

Esempio:

Declare @id int; 
set @id = 10; 

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

In MySQL, possiamo dichiarare e utilizzare le variabili con comando set come qui di seguito

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

Ho incontrato lo stesso problema usando MySQL Workbench. Secondo lo MySQL documentation, l'istruzione DECLARE "dichiara le variabili locali all'interno dei programmi memorizzati." Ciò significa apparentemente che è garantito il funzionamento solo con stored procedure/funzioni.

La soluzione per me era semplicemente rimuovere l'istruzione DECLARE e introdurre la variabile nell'istruzione SET. Per il codice che vorrebbe 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; 
+4

Avrete bisogno di un simbolo '@' per impostare le variabili al di fuori delle stored procedure/funzioni. e, g 'SET @ F00 = '138'' – Yoga

0

Se si utilizza phpMyAdmin per aggiungere nuova routine quindi non dimenticate di avvolgere il vostro codice tra BEGIN ed END enter image description here