mysql循环处理结果集_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注释)

需要正确指定一些部分,如变量声明、选择查询等。

一般来说:

试图避免使用光标

.

我故意将光标变量命名为curs[e],因为光标是好坏参半的。它们可以帮助我们实现复杂的业务规则,这些业务规则可能很难用SQL的声明形式来表达,但随后它使我们使用了SQL的过程(命令)形式,这是SQL的一个一般特性,它既不友好/表达,也不明智地编程,而且往往在性能方面效率较低。

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

    原文作者:Fesgrome
    原文地址: https://blog.csdn.net/weixin_26750831/article/details/113156312
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞