Mysql
 sql >> Database >  >> RDS >> Mysql

Ciclo di set di risultati in MySQL

Qualcosa del genere dovrebbe fare il trucco (tuttavia, leggi dopo lo snippet per maggiori informazioni)

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

Alcune cose da considerare...

Per quanto riguarda lo snippet sopra:

  • potrebbe voler passare parte della query alla Stored Procedure, magari in particolare i criteri di ricerca, per renderla più generica.
  • Se questo metodo deve essere chiamato da più sessioni, ecc. potrebbe voler passare un ID di sessione per creare un nome di tabella temporaneo univoco (in realtà una preoccupazione non necessaria poiché sessioni diverse non condividono lo stesso spazio dei nomi di file temporanei; vedere il commento di Gruber, sotto)
  • Alcune parti come le dichiarazioni delle variabili, la query SELECT ecc. devono essere specificate correttamente

Più in generale:cercando di evitare di aver bisogno di un cursore .

Ho chiamato di proposito la variabile del cursore curs[e], perché i cursori sono una benedizione mista. Possono aiutarci a implementare regole di business complicate che possono essere difficili da esprimere nella forma dichiarativa di SQL, ma poi ci portano a usare la forma procedurale (imperativa) di SQL, che è una caratteristica generale di SQL che non è né molto amichevole/ espressivo, dal punto di vista della programmazione e spesso meno efficiente dal punto di vista delle prestazioni.

Forse puoi cercare di esprimere la trasformazione e il filtraggio desiderati nel contesto di una query SQL "semplice" (dichiarativa).