sql >> Base de Datos >  >> RDS >> Mysql

Bucle sobre conjuntos de resultados en MySQL

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).