Объявление переменной для использования в качестве параметра в хранимой процедуре mysql - PullRequest
0 голосов
/ 06 ноября 2011

Я пытаюсь реализовать простой счетчик , который передается в качестве параметра в нескольких инструкциях в запросе 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 (' OUT '' в строке 4 "
  • Как выполнить эту хранимую процедуру?

1 Ответ

0 голосов
/ 09 ноября 2011

Похоже, 2 проблемы:

  • mysql-клиент интерпретирует любое ";" перед передачей процедуры на сервер, поэтому сначала необходимо установить другой разделитель
  • вы не можете использовать динамическое имя файла как в outfile, как вы пытались это сделать здесь

С большим количеством Google-поиска я пришел к следующему решению, которое работает с моим 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
...