【问题标题】:(MySQL) Stored Procedure - Looping through result(MySQL)存储过程 - 循环结果
【发布时间】:2013-08-05 15:53:41
【问题描述】:

我们正在从 PostgreSQL 迁移到 MySQL。
基本上,我想在 MySQL 中循环一个结果。

SELECT col1 FROM table1;

LOOP THROUGH col1Result

SELECT myCol FROM table2 WHERE thisCol = col1Result

END LOOP;

我也找到了这个参考
http://dev.mysql.com/doc/refman/5.0/en/cursors.html
但是,我被这条线卡住了。

FETCH cur1 INTO a, b;

这不是将cur1 的每一个结果都放入变量ab 中吗? 如何确保我当前位于变量 a 的第一个索引上?

这是一个关于我将如何使用结果的示例(用 PostgreSQL 编写)。

FOR my_record IN

   SELECT DISTINCT col1
   FROM            table1
   WHERE           col2 = param1;

LOOP

   SELECT DISTINCT col4
   FROM            table2
   WHERE           col3 = my_record.col1;

   IF true THEN
      RAISE EXCEPTION '%', 'ERROR MESSAGE' || my_record.col1;
   END IF

   SELECT DISTINCT col5
   FROM            table3
   WHERE           col6 = my_record.col1;

   IF true THEN
      RAISE EXCEPTION '%', ERROR MESSAGE' || my_record.col1;
   END IF;

END LOOP;

【问题讨论】:

    标签: mysql loops stored-procedures iteration


    【解决方案1】:

    cur1 会读取每一行的结果。每次循环它都会获得下一行。所以它第一次循环时会得到第一行。 这将一直持续到循环中断或没有更多行可用(在这种情况下会出现无数据条件。

    请参阅this 了解更多信息。希望对您有所帮助。

    【讨论】:

    • 你好呜喵,谢谢。我将尝试该特定链接中给出的示例。
    • 欢迎您@MichaelArdan。如果(它有帮助)将其作为正确答案投票,那么它也可以帮助其他人;否则问更多; :)
    • 你好,Woofmeow 先生。我想知道给定示例中的“完成”是做什么的。我尝试了示例过程并最终出现错误:错误代码:1054。“字段列表”中的未知列“完成”。
    • 很酷@MichaelArdan,你一定是过度劳累了。我们都这样做:)
    【解决方案2】:

    既然可以使用连接进行处理,为什么还要使用循环?

    select mycol
    from table2 t2 join
         table1 t1
         on t1.col1 = t2.thiscol;
    

    这适用于 Postgres 和 MySQL。

    【讨论】:

    • 嗨,戈登,感谢您的反馈和建议。查看当前过程,将从中获取列的第一个 SELECT 语句至少包含 26 行。这包括多个 JOIN 和 WHERE 子句。该特定 SELECT 语句的结果将在整个过程循环中多次使用。如果我每次需要结果时都执行 SELECT 语句,那么维护过程对我来说会很苛刻。
    • 由于此评论框字符数超过,请看我的修改。
    猜你喜欢
    • 2015-07-20
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    相关资源
    最近更新 更多