在MySQL中循环结果集

在MySQL中循环结果集,第1张

在MySQL中循环结果集

这样的事情应该可以解决问题(但是,请在摘要后阅读以获取更多信息)

CREATE PROCEDURE GetFilteredData()BEGIN  DECLARE bDone INT;  DECLARE var1 CHAr(16);    -- or approriate type  DECLARE Var2 INT;  DECLARE Var3 VARCHAr(50);  DECLARE curs CURSOR FOR  SELECt something FROM somewhere WHERe some stuff;  DECLARE ConTINUE HANDLER FOR NOT FOUND SET bDone = 1;  DROp TEMPORARY TABLE IF EXISTS tblResults;  CREATE TEMPORARY TABLE IF NOT EXISTS tblResults  (    --Fld1 type,    --Fld2 type,    --...  );  OPEN curs;  SET bDone = 0;  REPEAT    FETCH curs INTO var1,, b;    IF whatever_filtering_desired       -- here for whatever_transformation_may_be_desired       INSERT INTO tblResults VALUES (var1, var2, var3 ...);    END IF;  UNTIL bDone END REPEAT;  CLOSE curs;  SELECT * FROM tblResults;END

需要考虑的几件事…

关于以上代码段:

  • 可能希望将查询的一部分传递给存储过程,尤其是搜索条件,以使其更加通用。
  • 如果要由多个会话等调用此方法,则可能希望传递一个会话ID来创建唯一的临时表名(实际上是不必要的考虑,因为不同的会话不共享相同的临时文件名称空间;请参阅下面Gruber的评论) )
  • 需要正确指定一些部分,例如变量声明,SELECT查询等。

更一般而言: 尝试避免需要游标

我特意将游标变量命名为curs
[e],因为游标是一种混杂的祝福。它们可以帮助我们实施复杂的业务规则,而这些业务规则可能很难以SQL的声明形式来表达,但是它带给我们使用SQL的过程式(命令式)形式,这是SQL的一般功能,既不是非常友好/表现力,编程方面以及效率通常较低的方面。

也许您可以研究在“普通”(说明性)SQL查询的上下文中表达所需的转换和过滤。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/4976211.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-14
下一篇2022-11-14

发表评论

登录后才能评论

评论列表(0条)

    保存