声明并使用MySQL varchar变量

Cha*_*les 25 mysql sql mysql-error-1064

我正在尝试使用MySQL 5.0中的变量进行一些简单的操作,但我无法让它工作.我见过DECLARE/SET的很多(非常!)不同的语法,我不知道为什么......无论如何我可能会混淆他们/选错了/混合他们.

这是一个失败的最小片段:

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

update mypermits 
   set person = FOO 
 where person = oldFOO;
Run Code Online (Sandbox Code Playgroud)

我也试过用BEGIN包裹它......结束; 并作为程序.在这种情况下,MySQL Workbench有助于告诉我:第一行上的"SQL语法错误')'"和第二行上的"DECLARE oldFOO varchar(7)'附近的SQL语法错误".否则它会将两行都作为完整错误,两者都有"SQL语法错误接近...".

编辑:我忘了提到我已经在变量上使用和不使用@s.有些资源有,有些没有.

我犯了什么愚蠢的错误?

OMG*_*ies 29

这对我使用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 ;
Run Code Online (Sandbox Code Playgroud)

表:

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()
Run Code Online (Sandbox Code Playgroud)

  • 这似乎工作!显然,delimiter命令是我需要的.到目前为止,这对我来说太神奇了......让我来看看吧. (3认同)

Amo*_*ong 7

我使用MySQL Workbench遇到了同样的问题.根据MySQL文档,DECLARE"语句在存储程序中声明局部变量".这显然意味着它只能保证与存储过程/函数一起使用.

我的解决方案是简单地删除DECLARE语句,并在语句中引入变量SET.对于你的代码意味着:

-- 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;
Run Code Online (Sandbox Code Playgroud)

  • 您需要一个`@`符号来设置存储过程/函数之外的变量.e,g`SET @ F00 ='138' (4认同)