声明一个变量,用于在存储的mysql过程中使用as参数

时间:2011-11-06 15:58:55

标签: mysql sql-parametrized-query

我正在尝试实现一个simple counter,它在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开始选择 TableA.ColumnA INTO OUTFILE CONCAT(第4行'OUT''
  • 如何执行此存储过程?

1 个答案:

答案 0 :(得分:0)

看起来有两个问题:

  • mysql-client解释任何“;”在将程序移交给服务器之前,您必须先设置不同的分隔符
  • 你不能像在这里尝试的那样使用动态文件名作为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