在 MySQL 中循环结果集
本文探讨了在 MySQL 中循环结果集的概念,这是数据库编程中的基本操作。我们的目标是模拟以下 PHP 代码的功能:
$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 语法等功能。尽管如此,仍然可以使用以下方法创建基于游标的循环:
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
注意事项
虽然游标有助于实现复杂的业务规则,但它们也有一定的缺点。因此,建议考虑替代方法,例如在单个声明性 SQL 查询中表达所需的转换和过滤器。
以上是如何在 MySQL 中循环结果集?的详细内容。更多信息请关注PHP中文网其他相关文章!