【问题标题】:Using for loop in MySql data set在 MySql 数据集中使用 for 循环
【发布时间】:2013-05-28 04:36:24
【问题描述】:

如何在 MySQL 数据集中使用 for 循环?

FOR x IN (SELECT column FROM table_name WHERE column_2 = input_val) 
LOOP
    sum_total := sum_total + x.column ;
END LOOP;

这是我过去在 oracle 中循环数据集的示例。

在 MySql 中如何实现?

【问题讨论】:

标签: mysql sql database plsql


【解决方案1】:

根本不循环怎么样。 毕竟是 SQL。

SELECT SUM(`column`) total
  FROM table_name 
  WHERE column_2 = <input_val>

否则使用CURSOR

现在,使用CURSOR 的等效循环看起来像

DELIMITER $$
CREATE PROCEDURE sp_loop(IN input_val INT)
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE sum_current, sum_total INT DEFAULT 0;
  DECLARE cur1 CURSOR FOR SELECT column1 FROM table_name WHERE column2 = input_val;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur1;

  read_loop: LOOP
    FETCH cur1 INTO sum_current;
    IF done THEN
      LEAVE read_loop;
    END IF;
    SET sum_total = sum_total + sum_current;
  END LOOP;

  CLOSE cur1;
  SELECT sum_total;
END$$
DELIMITER ;

这里是SQLFiddle

【讨论】:

  • 我不是要求替代查询,实际上我想要 for 循环的实际工作方式......无论如何,谢谢
  • +1 用于鼓励基于集合的操作...Sql Engine 针对基于集合的操作而不是基于游标的操作进行了优化.....
  • @hsuk AFAIK 您可以仅使用光标在 MySql 中实现它。查看更新的答案。
  • @hsuk 到底有没有帮助?
  • 谢谢兄弟,它有帮助,但我想知道除了使用光标之外是否可以做任何其他事情
【解决方案2】:
DROP PROCEDURE IF EXISTS  `foo`.`usp_cursor_example`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `foo`.`usp_cursor_example`(
  IN name_in VARCHAR(255)
)
READS SQL DATA
BEGIN

  DECLARE name_val VARCHAR(255);
  DECLARE status_update_val VARCHAR(255);

  -- Declare variables used just for cursor and loop control
  DECLARE no_more_rows BOOLEAN;
  DECLARE loop_cntr INT DEFAULT 0;
  DECLARE num_rows INT DEFAULT 0;

  -- Declare the cursor
  DECLARE friends_cur CURSOR FOR
    SELECT
        name
      , status_update
    FROM foo.friend_status
    WHERE name = name_in;

  -- Declare 'handlers' for exceptions
  DECLARE CONTINUE HANDLER FOR NOT FOUND
    SET no_more_rows = TRUE;


  OPEN friends_cur;
  select FOUND_ROWS() into num_rows;

  the_loop: LOOP

    FETCH  friends_cur
    INTO   name_val
    ,      status_update_val;


    IF no_more_rows THEN
        CLOSE friends_cur;
        LEAVE the_loop;
    END IF;

    select name_val, status_update_val;

    -- count the number of times looped
    SET loop_cntr = loop_cntr + 1;

  END LOOP the_loop;

  -- 'print' the output so we can see they are the same
  select num_rows, loop_cntr;

END
DELIMITER ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    相关资源
    最近更新 更多