【问题标题】:MySQL foreach alternative for procedureMySQL foreach 替代过程
【发布时间】:2009-11-21 13:43:14
【问题描述】:

我的问题很简单。我有桌子sets 存储产品集(更多的产品看起来像在外面 - 例如计算机,鼠标和键盘。)它使用sets_products 表连接到M:N 到products 表。每个产品都可以有参数(再次连接 M:N)。

我有一个程序,它将所有参数生成为字符串(用于搜索缓存 - 例如 'hdd:120GB, LCD:1440:900, ..'),但现在我需要遍历集合的产品并调用该程序对于他们每个人。我不能在 PHP 中这样做,因为这是在触发器中使用的。

我想使用这样的东西(伪 SQL)

FOREACH(SELECT products_id FROM sets_products WHERE set_id = 1)
    generate_parameter_list(product_id,@result)
    @param = CONCAT(@param,",",@result);
END FOREACH;

这可以在 MySQL 中完成吗?

【问题讨论】:

  • 啊,我忘了问题本身 - 这可以在 MySQL 中完成吗?

标签: sql mysql stored-procedures foreach


【解决方案1】:

这是mysql reference for cursors。所以我猜它是这样的:

  DECLARE done INT DEFAULT 0;
  DECLARE products_id INT;
  DECLARE result varchar(4000);
  DECLARE cur1 CURSOR FOR SELECT products_id FROM sets_products WHERE set_id = 1;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

  OPEN cur1;

  REPEAT
    FETCH cur1 INTO products_id;
    IF NOT done THEN
      CALL generate_parameter_list(@product_id, @result);
      SET param = param + "," + result; -- not sure on this syntax
    END IF;
  UNTIL done END REPEAT;

  CLOSE cur1;

  -- now trim off the trailing , if desired

【讨论】:

  • 我需要使用 CALL procedure_name 并 DECLARE 每个使用的参数,但它有效。非常感谢。
  • 如果您在离开或继续循环时需要更大的灵活性,也可以使用SQL LOOP 语法而不是 REPEAT。
【解决方案2】:

这可以用 MySQL 来完成,尽管它非常不直观:

CREATE PROCEDURE p25 (OUT return_val INT)
BEGIN
  DECLARE a,b INT;
  DECLARE cur_1 CURSOR FOR SELECT s1 FROM t;
  DECLARE CONTINUE HANDLER FOR NOT FOUND
  SET b = 1;
  OPEN cur_1;
  REPEAT
    FETCH cur_1 INTO a;
    UNTIL b = 1
  END REPEAT;
  CLOSE cur_1;
  SET return_val = a;
END;//

查看本指南:mysql-storedprocedures.pdf

【讨论】:

  • 链接中的直观且编写良好的指南!
  • 我知道这是旧答案,但仍有人(如我)正在寻找它。 PDF 不再可用,但在这里我找到了很好的解释:mysqltutorial.org/mysql-cursor
猜你喜欢
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 2013-01-12
  • 2021-07-12
  • 2019-09-17
  • 1970-01-01
  • 2020-09-15
相关资源
最近更新 更多