it-swarm.com.de

Deklarieren und Verwenden von MySQL-Varchar-Variablen

Ich versuche, einige einfache Manipulationen mit Variablen in MySQL 5.0 vorzunehmen, aber ich kann es nicht ganz schaffen. Ich habe viele (sehr!) Verschiedene Syntaxen für DECLARE/SET gesehen, ich bin mir nicht sicher, warum ... auf jeden Fall verwirre ich sie vermutlich/wähle das falsche aus/mische sie.

Hier ist ein minimales Fragment, das fehlschlägt:

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

update mypermits 
   set person = FOO 
 where person = oldFOO;

Ich habe auch versucht, es mit BEGIN einzuwickeln ... END; und als VERFAHREN. In diesem Fall sagt mir MySQL Workbench hilfreich: "SQL-Syntaxfehler in der Nähe von ')'" in der ersten Zeile und "SQL-Syntaxfehler in der Nähe von 'DECLARE oldFOO varchar (7)'" in der zweiten Zeile. Ansonsten werden beide Zeilen als Fehler ausgegeben, mit "SQL-Syntaxfehler in der Nähe von ...".

Edit: Ich habe vergessen zu erwähnen, dass ich es mit und ohne @s für die Variablen probiert habe. Einige Ressourcen hatten es mit, andere ohne.

Was für ein dummer Fehler mache ich?

20
Charles

Dies funktioniert gut für mich mit 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 ;

Tabelle:

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

Ich bin mit MySQL Workbench auf das gleiche Problem gestoßen. Gemäß der MySQL-Dokumentation deklariert die Anweisung DECLARE "lokale Variablen in gespeicherten Programmen." Dies bedeutet anscheinend, dass nur mit gespeicherten Prozeduren/Funktionen gearbeitet werden kann.

Die Lösung für mich war, einfach die DECLARE-Anweisung zu entfernen und die Variable in die SET-Anweisung einzuführen. Für Ihren Code würde das bedeuten:

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

Wenn Sie phpmyadmin verwenden, um eine neue Routine hinzuzufügen, vergessen Sie nicht, Ihren Code zwischen BEGIN und END einzugeben. enter image description here

0
Repky

In MySQL können wir Variablen wie folgt mit dem Befehl set deklarieren und verwenden

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

Sieht aus, als hätten Sie das @ in der Variablendeklaration vergessen. Ich erinnere mich auch, dass ich vor langer Zeit Probleme mit SET in MySql hatte.

Versuchen

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

versuche dies:

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

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