Цикличное выполнение по наборам результатов в MySQL

Это не становится более простым, чем использование каналов, которые поддерживаются на каждой ОС, которую я знаю и могу быть получен доступ на в значительной степени каждом языке.

Выезд этот учебное руководство.

59
задан tshepang 1 May 2014 в 07:03
поделиться

2 ответа

Что-то вроде этого должно помочь (однако, прочтите после фрагмента для получения дополнительной информации)

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

Несколько моментов, которые следует учитывать ...

Относительно фрагмента выше:

  • может потребоваться передать часть запроса в хранимую процедуру, возможно, в частности, критерии поиска, чтобы сделать его более универсальным.
  • Если этот метод должен вызываться несколькими сеансами и т. д., может потребоваться передать идентификатор сеанса сортировки в создать уникальное имя временной таблицы (на самом деле это ненужная проблема, поскольку разные сеансы не используют одно и то же пространство имен временных файлов; см. комментарий Грубера ниже)
  • Некоторые части, такие как объявления переменных, запрос SELECT и т. д., должны быть правильно указано

В более общем смысле: пытается избежать необходимости в курсоре .

Я специально назвал курсорную переменную curs [e], потому что курсоры - это смешанное благо.Они могут помочь нам реализовать сложные бизнес-правила, которые может быть трудно выразить в декларативной форме SQL, но затем это заставляет нас использовать процедурную (императивную) форму SQL, которая является общей особенностью SQL, которая не очень удобна / выразительный, с точки зрения программирования и часто менее эффективный с точки зрения производительности.

Возможно, вы можете попытаться выразить желаемое преобразование и фильтрацию в контексте «простого» (декларативного) SQL-запроса.

Может быть, вы сможете выразить желаемое преобразование и фильтрацию в контексте «простого» (декларативного) SQL-запроса.

Может быть, вы сможете выразить желаемое преобразование и фильтрацию в контексте «простого» (декларативного) SQL-запроса.

78
ответ дан 24 November 2019 в 18:29
поделиться

Использование курсоров.

Курсор можно рассматривать как буферизованный считыватель при чтении документа. Если вы думаете о каждой строке как о строке в документе, тогда вы читаете следующую строку, выполняете свои операции, а затем перемещаете курсор.

4
ответ дан 24 November 2019 в 18:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: