Нещо подобно трябва да свърши работа (Въпреки това, прочетете след фрагмента за повече информация)
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
Няколко неща, които трябва да имате предвид...
Относно горния фрагмент:
- може да искате да прехвърлите част от заявката към Съхранената процедура, може би по-специално критериите за търсене, за да я направи по-обща.
- Ако този метод трябва да бъде извикан от множество сесии и т.н., може да искате да подадете идентификатор на сесия, за да създадете уникално име на временна таблица (всъщност ненужно притеснение, тъй като различните сесии не споделят едно и също пространство от имена на временен файл; вижте коментара от Грубер, по-долу)
- Няколко части, като декларациите на променливи, заявката SELECT и т.н., трябва да бъдат правилно посочени
По-общо:опитвате се да избегнете нуждата от курсор .
Нарочно нарекох променливата на курсора curs[e], защото курсорите са смесена благословия. Те могат да ни помогнат да внедрим сложни бизнес правила, които може да са трудни за изразяване в декларативната форма на SQL, но след това ни кара да използваме процедурната (императивна) форма на SQL, която е обща характеристика на SQL, която не е нито много приятелска/ изразителен, програмен и често по-малко ефективен по отношение на производителността.
Може би можете да разгледате изразяването на желаната трансформация и филтриране в контекста на „обикновена“ (декларативна) SQL заявка.