在存储的mysql过程中声明一个用作参数的变量
问题描述:
我试图实现一个simple counter,它在SQL查询中的几个语句中作为参数传递(见下文)。我有以下的测试环境在存储的mysql过程中声明一个用作参数的变量
CREATE TABLE `test`.`TableA` (
`ColumnA` INT(3) NOT NULL ,
`ColumnB` INT(5) NOT NULL
) ENGINE = MYISAM ;
ALTER TABLE `TableA` ADD INDEX (`ColumnA`)
INSERT INTO `TableA` (`ColumnA`, `ColumnB`) VALUES
(2, 4654), (2, 223), (5, 12), (4, 32), (3, 23), (5, 21), (1, 2), (2, 2), (4, 2), (5, 1);
我想每个计数器迭代编号的输出文件(据我所知一个做到这一点的方法是使用存储过程)
CREATE PROCEDURE dowhile()
BEGIN
DECLARE CONT INT DEFAULT 5
WHILE CONT > 1 DO
BEGIN
SELECT TableA.ColumnB
INTO OUTFILE CONCAT('OUT', CONT)
FROM TableA
WHERE TableA.ColumnA = CONT
SET CONT = CONT - 1
END
END WHILE
END;
- 当我尝试执行我有一个语法错误,但我不知道 问题在哪里:“#1064 - 你的SQL语法错误; 检查手册,对应于你的MySQL服务器版本为 正确的语法使用NE ar'WHILE CONT> 1 DO BEGIN SELECT TableA.ColumnA INTO OUTFILE CONCAT('OUT''line 4“
- 如何执行此存储过程?
答
它看起来像2个问题:
- MySQL的客户端解释的任何 “;”它的程序相传到服务器之前,因此你必须设置一个不同的分隔符第一
- 像你在这里
尝试过与很多谷歌的搜索,你可以不使用动态文件名作为INTO OUTFILE我来到以下解决方案,与我的MySql 5.1.51一起工作:
delimiter //
CREATE PROCEDURE doWhile()
BEGIN
DECLARE CONT INT DEFAULT 5;
DECLARE filename VARCHAR(32);
WHILE CONT > 1 DO
SET @myvar = CONCAT('SELECT TableA.ColumnB INTO OUTFILE', "'", CONCAT('OUT', CONT), "'", 'FROM TableA WHERE TableA.ColumnA = ', CONT);
PREPARE stmt1 FROM @myvar;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
SET CONT = CONT - 1;
END WHILE;
END
也许你错过了“;”在“END WHILE”的结尾处,并且可能也在其他一些行的末尾,例如,以“DECLARE”开头的行?当你尝试执行这个操作时,你是如何得到一个错误的,但是接下来你会问如何执行它?我很困惑:-)我会假设你用“CALL dowhile()”执行它。“ – miherrma
不,如果我放一个“;”在DECLARE行之后,我得到: - > BEGIN - > DECLARE CONT INT DEFAULT 5; 错误1064(42000):您的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,以便在第3行的''附近使用正确的语法。我正在将“脚本”粘贴到mysql解释器,mysql解释器有时通过将“;”有时通过使用CALL? ;) 谢谢 – user869097