gpt4 book ai didi

mysql - 在 MySQL 中循环结果集

转载 作者:行者123 更新时间:2023-11-29 21:42:09 25 4
gpt4 key购买 nike

我正在尝试在 MySQL 中编写一个存储过程,它将执行一个稍微简单的选择查询,然后循环结果以决定是否执行其他查询、数据转换或完全丢弃数据。实际上,我想实现这个:

$result = mysql_query("SELECT something FROM somewhere WHERE some stuff");
while ($row = mysql_fetch_assoc($result)) {
// check values of certain fields, decide to perform more queries, or not
// tack it all into the returning result set
}

只是,我只想在 MySQL 中使用它,因此可以将其作为过程调用。我知道对于触发器来说,有 FOR EACH ROW ...语法,但我找不到任何类似的内容可以在 CREATE TRIGGER ... 之外使用句法。我已经通读了 MySQL 中的一些循环机制,但到目前为止我所能想象的就是我会实现这样的东西:

SET @S = 1;
LOOP
SELECT * FROM somewhere WHERE some_conditions LIMIT @S, 1
-- IF NO RESULTS THEN
LEAVE
-- DO SOMETHING
SET @S = @S + 1;
END LOOP

尽管这一点在我的脑海里还是有些模糊。

作为引用,虽然我认为这不一定相关,但初始查询将把四个表连接在一起以形成层次权限模型,然后根据特定权限在链上的高度,它将检索有关应继承该权限的子代的其他信息。

最佳答案

这样的事情应该可以解决问题(但是,请阅读代码片段以获取更多信息)

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, var2, var3;

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

需要考虑的一些事项...

关于上面的代码片段:

  • 可能希望将部分查询传递给存储过程,尤其是搜索条件,以使其更加通用。
  • 如果这个方法要被多个 session 调用,那么可能需要传递一个 session ID 来创建一个唯一的临时表名称(实际上是不必要的关注,因为不同的 session 不共享相同的临时文件命名空间;请参阅注释格鲁伯,如下)
  • 需要正确指定一些部分,例如变量声明、SELECT 查询等

更一般地说:尝试避免需要光标

我特意将游标变量命名为 curs[e],因为游标是喜忧参半的。它们可以帮助我们实现复杂的业务规则,这些规则可能很难用 SQL 的声明式形式来表达,但它随后让我们使用 SQL 的过程式(命令式)形式,这是 SQL 的一个普遍特征,但它既不是很友好/富有表现力、编程方面,但性能方面通常效率较低。

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

关于mysql - 在 MySQL 中循环结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34403106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com