Mysql
 sql >> Base de données >  >> RDS >> Mysql

Boucle sur les ensembles de résultats dans MySQL

Quelque chose comme ça devrait faire l'affaire (Cependant, lisez après l'extrait pour plus d'informations)

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

Quelques éléments à prendre en compte...

Concernant l'extrait ci-dessus :

  • peut vouloir transmettre une partie de la requête à la procédure stockée, peut-être en particulier les critères de recherche, pour la rendre plus générique.
  • Si cette méthode doit être appelée par plusieurs sessions, etc., vous voudrez peut-être transmettre un ID de session de sorte à créer un nom de table temporaire unique (préoccupation réellement inutile puisque différentes sessions ne partagent pas le même espace de noms de fichiers temporaires ; voir le commentaire de Gruber, ci-dessous)
  • Quelques parties telles que les déclarations de variables, la requête SELECT, etc. doivent être correctement spécifiées

Plus généralement :essayer d'éviter d'avoir besoin d'un curseur .

J'ai délibérément nommé la variable de curseur curs[e], car les curseurs sont une bénédiction mitigée. Ils peuvent nous aider à implémenter des règles métier compliquées qui peuvent être difficiles à exprimer sous la forme déclarative de SQL, mais cela nous amène ensuite à utiliser la forme procédurale (impérative) de SQL, qui est une caractéristique générale de SQL qui n'est ni très conviviale/ expressif, en termes de programmation et souvent moins efficace en termes de performances.

Vous pouvez peut-être envisager d'exprimer la transformation et le filtrage souhaités dans le contexte d'une requête SQL "simple" (déclarative).