Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Fazendo um loop sobre conjuntos de resultados no MySQL


Algo assim deve funcionar (no entanto, leia após o trecho para mais informações)
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

Algumas coisas a serem consideradas...

Sobre o trecho acima:
  • pode querer passar parte da consulta para o procedimento armazenado, talvez principalmente os critérios de pesquisa, para torná-la mais genérica.
  • Se este método for chamado por várias sessões, etc., você pode querer passar um ID de sessão de classificação para criar um nome de tabela temporário exclusivo (preocupação realmente desnecessária, pois sessões diferentes não compartilham o mesmo namespace de arquivo temporário; veja o comentário de Gruber, abaixo)
  • Algumas partes, como as declarações de variáveis, a consulta SELECT, etc., precisam ser especificadas corretamente

De forma mais geral:tentando evitar a necessidade de um cursor .

Eu propositadamente nomeei a variável de cursor curs[e], porque os cursores são uma bênção mista. Eles podem nos ajudar a implementar regras de negócios complicadas que podem ser difíceis de expressar na forma declarativa do SQL, mas nos leva a usar a forma procedural (imperativa) do SQL, que é uma característica geral do SQL que não é muito amigável/ expressivo, em termos de programação e, muitas vezes, menos eficiente em termos de desempenho.

Talvez você possa procurar expressar a transformação e a filtragem desejadas no contexto de uma consulta SQL "simples" (declarativa).