我正在尝试使用 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...END 来包装它;并作为一个程序。在这种情况下,MySQL Workbench 会很有帮助地告诉我:第一行是“')'附近的 SQL 语法错误”,第二行是“'DECLARE oldFOO varchar(7)'附近的 SQL 语法错误”。否则,它会将这两行完整地显示为错误,并在两行上显示“SQL 语法错误接近...”。
编辑:我忘了提及我已经尝试过在变量上使用和不使用@s。有些资源有,有些则没有。
我犯了什么愚蠢的错误?
这对我使用 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()
我使用 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;
看起来您忘记了变量声明中的@。我还记得很久以前在 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;
试试这个:
declare @foo varchar(7),
@oldFoo varchar(7)
set @foo = '138'
set @oldFoo = '0' + @foo
在Mysql中,我们可以像下面这样通过set命令声明和使用变量
mysql> set @foo="manjeet";
mysql> select * from table where name = @foo;
Declare @variable type(size);
Set @variable = 'String' or Int ;
示例:
Declare @id int;
set @id = 10;
Declare @str char(50);
set @str='Hello' ;