sql >> Databáze >  >> RDS >> Mysql

Looping Over Result Sets v MySQL

Něco takového by mělo stačit (více informací si však přečtěte po úryvku)

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ěkolik věcí ke zvážení...

K výše uvedenému úryvku:

  • může chtít předat část dotazu do uložené procedury, možná zejména kritéria vyhledávání, aby byl obecnější.
  • Pokud má být tato metoda volána více relacemi atd., může chtít předat ID relace třídění, aby se vytvořil jedinečný název dočasné tabulky (ve skutečnosti zbytečné obavy, protože různé relace nesdílejí stejný jmenný prostor dočasného souboru; viz komentář od Gruber, níže)
  • Několik částí, jako jsou deklarace proměnných, dotaz SELECT atd., musí být správně specifikováno

Obecněji:snažte se vyhnout tomu, abyste potřebovali kurzor .

Záměrně jsem pojmenoval kurzorovou proměnnou curs[e], protože kurzory jsou smíšené požehnání. Mohou nám pomoci implementovat složitá obchodní pravidla, která může být obtížné vyjádřit v deklarativní formě SQL, ale pak nás přivádí k použití procedurální (imperativní) formy SQL, což je obecná vlastnost SQL, která není ani příliš přátelská/ expresivní, programátorsky a často méně efektivní z hlediska výkonu.

Možná se můžete podívat na vyjádření požadované transformace a filtrování v kontextu „prostého“ (deklarativního) SQL dotazu.



  1. Zjistěte, proč se nepodařilo odeslat e-mail na SQL Server (T-SQL)

  2. Jak odstranit záznam MySQL po určité době

  3. Připojení k databázi pomocí PHP

  4. Dávkové vložení/aktualizace MyBatis pro Oracle