Maison > base de données > tutoriel mysql > Comment puis-je parcourir les ensembles de résultats dans MySQL ?

Comment puis-je parcourir les ensembles de résultats dans MySQL ?

Patricia Arquette
Libérer: 2024-11-15 13:07:02
original
1018 Les gens l'ont consulté

How Can I Loop Through Result Sets in MySQL?

Bouclage sur des ensembles de résultats dans MySQL

Cet article explore le concept de bouclage sur des ensembles de résultats dans MySQL, une opération fondamentale dans la programmation de bases de données. Notre objectif est d'émuler les fonctionnalités du code PHP suivant :

$result = mysql_query("SELECT something FROM somewhere WHERE some stuff");
while ($row = mysql_fetch_assoc($result)) {
    // check values of certain fields, decide to perform more queries, or not
    // tack it all into the returning result set
}
Copier après la connexion

Approche basée sur un curseur

MySQL fournit des curseurs pour itérer sur les ensembles de résultats. Cependant, il lui manque des fonctionnalités telles que la syntaxe FOR EACH ROW pour les implémentations de déclencheurs. Malgré cela, il est possible de créer une boucle basée sur un curseur en utilisant l'approche suivante :

SET @S = 1;
LOOP
    SELECT * FROM somewhere WHERE some_conditions LIMIT @S, 1
    -- IF NO RESULTS THEN
    LEAVE
    -- DO SOMETHING
    SET @S = @S + 1;
END LOOP
Copier après la connexion

Procédure stockée avec curseur

Une manière plus structurée de mettre en œuvre cela la logique passe par une procédure stockée qui utilise un curseur. Voici un exemple :

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
Copier après la connexion

Considérations

Bien que les curseurs puissent être utiles pour implémenter des règles métier complexes, ils présentent certains inconvénients. Par conséquent, il est recommandé d'envisager des méthodes alternatives, telles que l'expression des transformations et des filtres souhaités dans une seule requête SQL déclarative.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal