MySQL での結果セットのループ: カーソルと一時テーブルの使用
MySQL でストアド プロシージャを作成する場合、多くの場合ループ オーバーが必要になります。選択クエリの結果を取得し、データに基づいて追加の操作や条件分岐を実行します。カーソルは結果セットを反復処理する簡単な方法を提供しますが、必ずしも最も効率的または実用的なソリューションであるとは限りません。
この特定のシナリオでは、目標は、特定の基準に基づいて複数のテーブルからデータを選択し、取得した値に基づいて決定を行います。 1 つのアプローチは、カーソルを使用して一度に 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, 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
このプロシージャは、カーソルを使用して最初の選択クエリから行をフェッチし、特定の条件をチェックします。条件が満たされる場合、値は tblResults という名前の一時テーブルに挿入されます。すべての行を反復処理した後、プロシージャはフィルタリングされたデータを一時テーブルから選択します。
カーソルは特定のシナリオでは便利ですが、その制限を考慮することが重要です。これらはパフォーマンスのボトルネックを引き起こす可能性があり、一般に宣言型 SQL に比べて操作が困難です。可能であれば、カーソルの使用を避け、代わりにウィンドウ関数、共通テーブル式 (CTE)、またはストアド関数の使用などの代替ソリューションを検討することをお勧めします。
以上がMySQL で結果セットを効率的にループする方法: カーソルまたは一時テーブル?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。