2011-11-06 49 views
0

我试图实现一个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“
  • 如何执行此存储过程?
+0

也许你错过了“;”在“END WHILE”的结尾处,并且可能也在其他一些行的末尾,例如,以“DECLARE”开头的行?当你尝试执行这个操作时,你是如何得到一个错误的,但是接下来你会问如何执行它?我很困惑:-)我会假设你用“CALL dowhile()”执行它。“ – miherrma

+0

不,如果我放一个“;”在DECLARE行之后,我得到: - > BEGIN - > DECLARE CONT INT DEFAULT 5; 错误1064(42000):您的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,以便在第3行的''附近使用正确的语法。我正在将“脚本”粘贴到mysql解释器,mysql解释器有时通过将“;”有时通过使用CALL? ;) 谢谢 – user869097

回答

0

它看起来像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 
相关问题