sql >> Database >  >> RDS >> Mysql

Looping over resultatensets in MySQL

Iets als dit zou het lukken (lees echter na het fragment voor meer info)

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

Een paar dingen om te overwegen...

Over het bovenstaande fragment:

  • misschien wil je een deel van de zoekopdracht doorgeven aan de Opgeslagen procedure, misschien met name de zoekcriteria, om het algemener te maken.
  • Als deze methode moet worden aangeroepen door meerdere sessies, enz., wil je misschien een soort Sessie-ID doorgeven om een ​​unieke tijdelijke tabelnaam te maken (eigenlijk onnodige zorg aangezien verschillende sessies niet dezelfde tijdelijke bestandsnaamruimte delen; zie opmerking van Gruber, hieronder)
  • Een paar onderdelen zoals de variabele declaraties, de SELECT-query enz. moeten correct worden gespecificeerd

Meer in het algemeen:proberen te voorkomen dat je een cursor nodig hebt .

Ik heb de cursorvariabele curs[e] met opzet genoemd, omdat cursors een gemengde zegen zijn. Ze kunnen ons helpen bij het implementeren van gecompliceerde bedrijfsregels die misschien moeilijk uit te drukken zijn in de declaratieve vorm van SQL, maar het brengt ons vervolgens bij het gebruik van de procedurele (imperatieve) vorm van SQL, een algemeen kenmerk van SQL dat niet erg vriendelijk/ expressief, qua programmering en vaak minder efficiënt qua prestaties.

Misschien kun je kijken naar het uitdrukken van de gewenste transformatie en filtering in de context van een "gewone" (declaratieve) SQL-query.



  1. Hoe een kolomnaam of tabelnaam in SQL Server te hernoemen - SQL Server / T-SQL-zelfstudie, deel 36

  2. Scans van toewijzingsorders

  3. PostgreSQL - GROUP BY-clausule

  4. Meerdere indexen versus indexen met meerdere kolommen