sql >> Databasteknik >  >> RDS >> Mysql

Slinga över resultatuppsättningar i MySQL

Något sådant här borde göra susen (Läs dock efter utdraget för mer 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

Några saker att tänka på...

Angående utdraget ovan:

  • kan vilja skicka en del av frågan till den lagrade proceduren, kanske särskilt sökkriterierna, för att göra den mer allmän.
  • Om den här metoden ska anropas av flera sessioner etc. kanske du vill skicka ett sessions-ID av sort för att skapa ett unikt temporärt tabellnamn (faktiskt onödigt problem eftersom olika sessioner inte delar samma temporära filnamnutrymme; se kommentar av Gruber, nedan)
  • Några delar som variabeldeklarationer, SELECT-frågan etc. måste specificeras korrekt

Mer allmänt:försöker undvika att behöva en markör .

Jag döpte medvetet markörvariabeln till curs[e], eftersom markörer är en blandad välsignelse. De kan hjälpa oss att implementera komplicerade affärsregler som kan vara svåra att uttrycka i den deklarativa formen av SQL, men det för oss sedan att använda den processuella (imperativa) formen av SQL, som är en allmän egenskap hos SQL som inte heller är särskilt vänlig/ uttrycksfulla, programmeringsmässigt och ofta mindre effektiva prestationsmässigt.

Kanske kan du undersöka att uttrycka den önskade transformationen och filtreringen i samband med en "vanlig" (deklarativ) SQL-fråga.



  1. MariaDB JSON_DETAILED() Förklarad

  2. Utmaningslösningar för nummerseriegenerator – del 1

  3. Skillnader mellan MySql och MySqli i PHP

  4. Hur man ändrar kompatibilitetsnivån för en databas med T-SQL