Algo como esto debería funcionar (sin embargo, lea después del fragmento para obtener más información)
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
Algunas cosas a tener en cuenta...
Con respecto al fragmento anterior:
- es posible que desee pasar parte de la consulta al procedimiento almacenado, tal vez en particular los criterios de búsqueda, para que sea más genérico.
- Si varias sesiones, etc., deben llamar a este método, es posible que desee pasar un ID de sesión para crear un nombre de tabla temporal único (en realidad, una preocupación innecesaria ya que las diferentes sesiones no comparten el mismo espacio de nombres de archivo temporal; consulte el comentario de Gruber, abajo)
- Algunas partes, como las declaraciones de variables, la consulta SELECT, etc., deben especificarse correctamente
En términos más generales:intentar evitar la necesidad de un cursor .
Llamé a propósito a la variable de cursor curs[e], porque los cursores son una bendición mixta. Pueden ayudarnos a implementar reglas comerciales complicadas que pueden ser difíciles de expresar en la forma declarativa de SQL, pero luego nos llevan a usar la forma de procedimiento (imperativa) de SQL, que es una característica general de SQL que no es muy amigable. expresivo, en cuanto a programación y, a menudo, menos eficiente en cuanto a rendimiento.
Tal vez pueda considerar expresar la transformación y el filtrado deseados en el contexto de una consulta SQL "simple" (declarativa).