循环遍历结果行并将列数据存储到存储过程变量mysql中

时间:2012-10-13 21:37:48

标签: mysql loops stored-procedures

我试图在mysql中学习存储过程。我知道下面的例子不需要SP,但这只是为了我的学习目的 - 只是为了理解如何循环遍历行,并选择行内的特定列数据。

假设表上的SELECT从表中返回5条记录,结构如下 -

表名:t1 列:c1,c2,c3

我想遍历5行中的每一行,并且对于每一行,我想将列单元格数据存储到SP变量varc1,varc2,varc3中,以便varc1 = c1,varc2 = c2,varc3 = C3。我将使用这些varc1,varc2,varc3进行循环内的进一步计算。

我假设需要一个存储过程,但我没有在进行行迭代,然后从循环中考虑的行中的每一列中选择数据时采用该方法。

对mysql /存储过程来说很新。 谢谢!

3 个答案:

答案 0 :(得分:3)

正如您所知,您的要求对大多数问题来说是一种特别低效的解决方案。但是,既然你特意要求它,并且(非常偶尔)它是解决问题的唯一方法(或者你个人有时间弄清楚如何解决问题的唯一方法)。以下是您可以按照自己的要求做的事情:

创建你的t1表,例如:

CREATE TABLE t1(id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, C1 INT, C2 INT, C3 INT);

执行您描述的SELECT,例如:

INSERT INTO  t1 SELECT NULL,c1,c2,c3 FROM the_table; 

现在这里是你的按行分类的“ReeBAR”低效存储过程:

为您的程序准备空间并设置分隔符:

DROP PROCEDURE IF EXISTS ReeBAR;
DELIMITER ;;

编写程序:

CREATE PROCEDURE ReeBAR()
BEGIN
DECLARE n INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
DECLARE varc1 INT DEFAULT 0;
DECLARE varc2 INT DEFAULT 0;
DECLARE varc3 INT DEFAULT 0;
SELECT COUNT(*) into n FROM t1;
set i=1;
WHILE i<=n DO 
  SELECT c1 FROM t1 WHERE id=i INTO varc1; 
  SELECT c2 FROM t1 WHERE id=i INTO varc2;
  SELECT c3 FROM t1 WHERE id=i INTO varc3;
  --queries which couldnt be made into set based queries go here---
  SET i = i + 1;
END WHILE;
End;

或者,如果你的id列不顺序,你可以使用下面的游标表单。

CREATE PROCEDURE ReeBAR()
BEGIN
  DECLARE cursor_ID INT;
  DECLARE cursor_VAL VARCHAR;
  DECLARE done INT DEFAULT FALSE;
  DECLARE cursor_i CURSOR FOR SELECT c1,c2,c3 FROM t1;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  DECLARE varc1 INT DEFAULT 0;
  DECLARE varc2 INT DEFAULT 0;
  DECLARE varc3 INT DEFAULT 0;
  OPEN cursor_i;
  read_loop: LOOP
    FETCH cursor_i INTO varc1, varc2, varc3;
    IF done THEN
      LEAVE read_loop;
    END IF;
    --queries which couldnt be made into set based queries go here---
  END LOOP;
  CLOSE cursor_i;
END;

不要忘记“结束”您使用的程序并重置分隔符

;;
DELIMITER ;

最后运行你的ReBAR程序

CALL ReeBAR();

(代码未经测试)

答案 1 :(得分:1)

使用CURSORS和循环迭代它。 http://dev.mysql.com/doc/refman/5.0/en/cursors.html。希望这有帮助!

答案 2 :(得分:0)

对于循环记录,您可以参考MySQL Cursor Loop或者如果您想在mysql存储过程中进行常规循环,可以参考Mysql Store Procedure