0

我正在尝试实现一个简单的计数器,它在 SQL 查询中的多个语句中作为参数传递(见下文)。我有以下测试环境

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);

我想要每个计数器迭代的编号输出文件(AFAIK 的一种方法是使用存储过程)

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 服务器版本相对应的手册,以了解在附近使用的正确语法'WHILE CONT > 1 DO BEGIN SELECT TableA.ColumnA INTO OUTFILE CONCAT('OUT'' at line 4"
  • 如何执行这个存储过程?
4

1 回答 1

0

它看起来像2个问题:

  • mysql客户端解释任何“;” 在将过程交给服务器之前,因此您必须先设置不同的分隔符
  • 您不能像在此处尝试的那样将动态文件名用作 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
于 2011-11-09T08:45:59.753 回答