我正在尝试使用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;
我也试过用BEGIN包裹它......结束;并作为程序。在这种情况下,MySQL Workbench有助于告诉我:第一行上的“SQL语法错误')'”和第二行上的“DECLARE oldFOO varchar(7)'附近的SQL语法错误”。否则它会将两行都作为完整错误,两者都有“SQL语法错误接近...”。
编辑:我忘了提到我在变量上使用和不使用@s都尝试过。有些资源有,有些没用。
我犯了什么愚蠢的错误?
答案 0 :(得分:28)
这对我使用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 ;
表:
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()
答案 1 :(得分:6)
我使用MySQL Workbench遇到了同样的问题。根据{{3}},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;
答案 2 :(得分:0)
看起来你忘记了变量声明中的@。我还记得很久以前在MySql中遇到SET
的问题。
尝试
DECLARE @FOO varchar(7);
DECLARE @oldFOO varchar(7);
SELECT @FOO = '138';
SELECT @oldFOO = CONCAT('0', @FOO);
update mypermits
set person = @FOO
where person = @oldFOO;
答案 3 :(得分:0)
试试这个:
declare @foo varchar(7),
@oldFoo varchar(7)
set @foo = '138'
set @oldFoo = '0' + @foo
答案 4 :(得分:0)
在Mysql中,我们可以使用set命令声明和使用变量,如下所示
mysql> set @foo="manjeet";
mysql> select * from table where name = @foo;
答案 5 :(得分:0)
答案 6 :(得分:-1)
Declare @variable type(size);
Set @variable = 'String' or Int ;
示例:
Declare @id int;
set @id = 10;
Declare @str char(50);
set @str='Hello' ;