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 中国語 Web サイトの他の関連記事を参照してください。