Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Ergebnismengen in MySQL durchlaufen

So etwas sollte ausreichen (Lesen Sie jedoch nach dem Snippet für weitere Informationen)

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

Ein paar Dinge zu beachten...

Bezüglich des obigen Snippets:

  • Möglicherweise möchten Sie einen Teil der Abfrage an die gespeicherte Prozedur übergeben, vielleicht insbesondere die Suchkriterien, um sie allgemeiner zu machen.
  • Wenn diese Methode von mehreren Sitzungen usw. aufgerufen werden soll, möchten Sie möglicherweise eine Art Sitzungs-ID übergeben, um einen eindeutigen temporären Tabellennamen zu erstellen (eigentlich unnötige Bedenken, da verschiedene Sitzungen nicht denselben temporären Dateinamensraum teilen; siehe Kommentar von Gruber, unten)
  • Einige Teile wie die Variablendeklarationen, die SELECT-Abfrage usw. müssen richtig angegeben werden

Allgemeiner:versuchen, einen Cursor zu vermeiden .

Ich habe die Cursor-Variable absichtlich curs[e] genannt, weil Cursors zweischneidig sind. Sie können uns dabei helfen, komplizierte Geschäftsregeln zu implementieren, die in der deklarativen Form von SQL möglicherweise schwierig auszudrücken sind, aber es bringt uns dann dazu, die prozedurale (imperative) Form von SQL zu verwenden, die ein allgemeines Merkmal von SQL ist, das weder sehr freundlich ist noch ausdrucksstark, programmiertechnisch und oft weniger effizient in Bezug auf die Leistung.

Vielleicht können Sie versuchen, die gewünschte Transformation und Filterung im Kontext einer "einfachen" (deklarativen) SQL-Abfrage auszudrücken.