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).