5.2.10.7. Инструкция WHILE. MySQL: руководство профессионала

5.2.10.7. Инструкция WHILE. MySQL: руководство профессионала

ВикиЧтение

MySQL: руководство профессионала
Паутов Алексей В

Содержание

5.2.10.7. Инструкция WHILE

[begin_label:]

WHILE search_condition DO statement_list

END WHILE

[end_label]

Операторный список внутри инструкции WHILE повторен, пока search_condition равно true. Инструкция WHILE может быть помечена. Пример:

CREATE PROCEDURE dowhile()

BEGIN

DECLARE v1 INT DEFAULT 5;

WHILE v1 > 0 DO

SET v1 = v1 – 1;

END WHILE;

END

5.2.9.2. Инструкция OPEN

5.2.9.2. Инструкция OPEN OPEN cursor_nameЭта инструкция открывает предварительно объявленный

5.

2.9.3. Инструкция FETCH

5.2.9.3. Инструкция FETCH FETCH cursor_name INTO var_name [, var_name] …Эта инструкция выбирает следующую строку (если строка существует), используя определенный открытый курсор, и продвигает указатель курсора.Если больше нет доступных строк, происходит условие No Data со значением SQLSTATE 02000. Чтобы

5.2.9.4. Инструкция CLOSE

5.2.9.4. Инструкция CLOSE CLOSE cursor_nameЭта инструкция закрывает предварительно открытый курсор. Если курсор не закрыт явно, он все равно закроется в конце составной инструкции, в которой он был

5.2.10.1. Инструкция IF

5.2.10.1. Инструкция IF IF search_condition THEN statement_list[ELSEIF search_conditionTHEN statement_list] …[ELSE statement_list]END IFIF реализован как базисная условная конструкция. Если выражение search_condition истинно, соответствующий список инструкции SQL выполнен. Если пары search_condition не нашлось, будет выполнен операторный

5.2.10.2. Инструкция CASE

5.2.10.2. Инструкция CASE CASE case_value WHEN when_valueTHEN statement_list[WHEN when_value THEN statement_list] …[ELSE statement_list]END CASEИли: CASE WHEN search_condition THEN statement_list[WHEN search_condition THEN statement_list] …[ELSE statement_list]END CASEИнструкция CASE для сохраненных подпрограмм осуществляет сложную условную конструкцию. Если search_condition равно true,

5.2.10.4. Инструкция LEAVE

5.2.10.4. Инструкция LEAVE LEAVE labelЭта инструкция используется, чтобы из выйти любой помеченной конструкции управления потоком данных. Это может использоваться внутри BEGIN … END или же конструкций цикла (LOOP, REPEAT,

5.2.10.5. Инструкция ITERATE

5.

2.10.5. Инструкция ITERATE ITERATE labelITERATE может появляться только внутри инструкций LOOP, REPEAT и WHILE. ITERATE означает «выполнить цикл снова «.Пример:CREATE PROCEDURE doiterate(p1 INT)BEGINlabel1: LOOPSET p1 = p1 + 1;IF p1 < 10 THEN ITERATE label1;END IF;LEAVE label1;END LOOP label1;SET @x =

5.2.10.6. Инструкция REPEAT

5.2.10.6. Инструкция REPEAT [begin_label:]REPEAT statement_listUNTIL search_conditionEND REPEAT[end_label]Операторный список внутри инструкции REPEAT повторен, пока search_condition равно true. Таким образом, REPEAT всегда проходит цикл по крайней мере один раз. Перечень statement_list состоит из одной или большего числа инструкций.

5.2.10.7. Инструкция WHILE

5.2.10.7. Инструкция WHILE [begin_label:]WHILE search_condition DO statement_listEND WHILE[end_label]Операторный список внутри инструкции WHILE повторен, пока search_condition равно true. Инструкция WHILE может быть помечена. Пример:CREATE PROCEDURE dowhile()BEGINDECLARE v1 INT DEFAULT 5;WHILE v1 > 0 DO…SET v1 = v1 – 1;END

5.8. Инструкция break

0

Инструкция создания

Инструкция создания Рассмотрим создание экземпляра класса BOOK3. Это возможно только с помощью подпрограммы класса, являющегося клиентом BOOK3, как, например:class QUOTATION featuresource: BOOK3page: INTEGERmake_book is— Создание объекта BOOK3 и присоединение его к source.do… См. ниже …endendЭтот класс

Инструкция утверждения

Инструкция утверждения Утверждения, рассматриваемые до сих пор — предусловия, постусловия, инварианты, — это основные составляющие метода. Они устанавливают связь между конструкциями ОО-программных систем и теорией АТД, лежащей в основе метода.

Инварианты класса, в

Как настроить цикл WHILE с оператором IF в MySQL?

спросил

Изменено 1 год, 9 месяцев назад

Просмотрено 159 тысяч раз

Я хотел бы создать хранимую процедуру для MySQL, которая вычисляет количество рабочих или рабочих дней в месяце (рабочие дни с понедельника по пятницу).

Это синтаксическая ошибка, однако я не знаю, что это за синтаксическая ошибка. Все, что он говорит мне:

1064 — У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, для правильного синтаксиса для использования рядом с ‘ПОКА(@daycount < @totaldays) DO IF (WEEKDAY(@checkweekday) < 6) ТОГДА ' в строке 2

Моя синтаксическая ошибка в следующем:

 WHILE(@daycount < @totaldays) DO
      ЕСЛИ (НЕДЕНЬ(@checkweekday) < 6) ТО
 

Мой код:

 ВЫБЕРИТЕ МЕСЯЦ(CURDATE()) INTO @curmonth;
ВЫБЕРИТЕ ИМЯ МЕСЯЦА(CURDATE()) INTO @curmonthname;
ВЫБЕРИТЕ ДЕНЬ(LAST_DAY(CURDATE())) INTO @totaldays;
SELECT FIRST_DAY(CURDATE()) INTO @checkweekday;
ВЫБЕРИТЕ ДЕНЬ(@checkweekday) INTO @checkday;
УСТАНОВИТЬ @daycount = 0;
УСТАНОВИТЬ @рабочие дни = 0;
НАЧИНАТЬ
  ПОКА(@daycount < @totaldays) ДЕЛАТЬ
      ЕСЛИ (НЕДЕНЬ(@checkweekday) < 6) ТО
        SET @рабочие дни = @рабочие дни+1;
      КОНЕЦ ЕСЛИ;
      SET @daycount = @daycount+1;
      ВЫБЕРИТЕ ДОБАВИТЬ('@checkweekday', ИНТЕРВАЛ 1 ДЕНЬ) INTO @checkweekday;
  КОНЕЦ ПОКА;
КОНЕЦ;
ВЫБЕРИТЕ @рабочие дни;
    
 

Кто-нибудь может помочь?

ОБНОВЛЕНИЕ Я получаю ту же ошибку со следующим фрагментом кода, так что, вероятно, это как-то связано с этим:

 SET @workdays = 0;
ЕСЛИ (ДЕНЬ НЕД('2013-06-13') < 6) ТО
  SET @рабочие дни = @рабочие дни+1;
КОНЕЦ ЕСЛИ;
ВЫБЕРИТЕ @рабочие дни;
 
  • mysql
  • пока
3

Я обнаружил, что вы не можете иметь условные выражения вне хранимой процедуры в mysql. Вот почему синтаксическая ошибка. Как только я поставил нужный мне код между

 НАЧАЛО
ВЫБЕРИТЕ МЕСЯЦ (CURDATE()) INTO @curmonth;
ВЫБЕРИТЕ ИМЯ МЕСЯЦА(CURDATE()) INTO @curmonthname;
ВЫБЕРИТЕ ДЕНЬ(LAST_DAY(CURDATE())) INTO @totaldays;
SELECT FIRST_DAY(CURDATE()) INTO @checkweekday;
ВЫБЕРИТЕ ДЕНЬ(@checkweekday) INTO @checkday;
УСТАНОВИТЬ @daycount = 0;
УСТАНОВИТЬ @рабочие дни = 0;
  ПОКА(@daycount < @totaldays) ДЕЛАТЬ
    ЕСЛИ (НЕДЕНЬ(@checkweekday) < 5) ТО
      SET @рабочие дни = @рабочие дни+1;
    КОНЕЦ ЕСЛИ;
    SET @daycount = @daycount+1;
    ВЫБЕРИТЕ ДОБАВИТЬ(@checkweekday, ИНТЕРВАЛ 1 ДЕНЬ) INTO @checkweekday;
  КОНЕЦ ПОКА;
КОНЕЦ
 

Только для других :

Если вы не знаете, как создать подпрограмму в phpmyadmin, вы можете поместить это в разделитель SQL-запроса

 ;;
удалить процедуру, если она существует test2;;
создать процедуру test2()
начинать
выберите «Привет, мир»;
конец
;;
 

Запустить запрос. Это создаст хранимую процедуру или хранимую подпрограмму с именем test2.

Теперь перейдите на вкладку подпрограмм и отредактируйте хранимую процедуру так, как вам нужно. Я также предлагаю прочитать http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/, если вы начинаете с хранимых процедур.

Вам нужна функция first_day: Как получить первый день каждого соответствующего месяца в mysql?

Демонстрация работы процедуры Просто добавьте следующую строку ниже END WHILE и выше END

 SELECT @curmonth,@curmonthname,@totaldays,@daycount,@workdays,@checkweekday,@checkday;
 

Затем используйте следующий код в окне запроса SQL.

 call test2 /* или как вы изменили имя хранимой процедуры на */
 

ПРИМЕЧАНИЕ: Если вы используете этот код, имейте в виду, что этот код не учитывает национальные праздники (или любые праздники в этом отношении).

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.

Цикл SQL WHILE с простыми примерами

Цикл SQL WHILE дает нам преимущество многократного выполнения операторов SQL до тех пор, пока указанный результат условия не окажется ложным.

В следующих разделах этой статьи мы будем использовать больше блок-схем, чтобы объяснить понятия и примеры. По этой причине, во-первых, мы кратко объясним, что такое блок-схема. Блок-схема — это наглядный геометрический символ, помогающий наглядно объяснить алгоритмы. Блок-схема используется для простого проектирования и документирования алгоритмов. На блок-схеме каждый геометрический символ имеет разные значения.

Следующая блок-схема объясняет основную структуру цикла WHILE в SQL:

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

Синтаксис и пример цикла SQL WHILE

Синтаксис цикла WHILE в SQL выглядит следующим образом:

WHILE условие

НАЧАЛО

   {...операторы...}

КОНЕЦ

После этих объяснений мы приведем очень простой пример цикла WHILE в SQL. В приведенном ниже примере пример цикла WHILE запишет значение переменной десять раз, после чего цикл завершится:

1

2

3

4

5

6

7

DECLARE @Counter INT

SET @Counter=1

WHILE ( @Counter <= 10)

BEGIN

    PRINT 'Значение счетчика = ' + CONVERT(VARCHAR,@Counter)

    SET @Counter  = @Counter  + 1

КОНЕЦ

Теперь мы обработаем пример цикла WHILE построчно и детально изучим его.

В этой части кода мы объявляем переменную и присваиваем ей инициализирующее значение:

DECLARE @Counter INT

SET @Counter=1

Эта часть кода имеет указанное условие, что пока значение переменной не достигнет 10, цикл продолжается и выполняет оператор PRINT. В противном случае условие while не сработает и цикл завершится:

ПОКА ( @Counter <= 10)

В этой последней части кода мы выполнили оператор SQL, а затем увеличили значение переменной:

BEGIN

    PRINT 'Значение счетчика = ' + CONVERT(VARCHAR,@Counter)

    SET @Counter  = @Counter  + 1

END

Следующая блок-схема наглядно иллюстрирует этот пример цикла WHILE:

Бесконечный цикл SQL WHILE

В бесконечном цикле, также известном как бесконечный цикл, результат условия никогда не будет ложным, поэтому цикл никогда не заканчивается и может работать вечно. Представьте, что у нас есть цикл WHILE, и мы не увеличиваем значение переменной. В этом случае цикл выполняется бесконечно и никогда не заканчивается. Теперь мы реализуем этот сценарий с помощью следующего примера. Нам нужно учесть одну вещь, что мы не должны забывать отменять выполнение запроса вручную:

1

2

3

4

5

6

7

DECLARE @Counter INT

SET @Counter=1

WHILE ( @Counter <= 10)

BEGIN

    PRINT 'Кто-нибудь меня остановит!'

  

КОНЕЦ

На следующей блок-схеме очевидно, что значение переменной никогда не меняется; поэтому цикл никогда не заканчивается. Причина этой проблемы в том, что переменная всегда равна 1, поэтому условие возвращает true для каждой итерации цикла:

Оператор BREAK

Оператор BREAK используется в цикле SQL WHILE для немедленного выхода из текущей итерации цикла при возникновении определенных условий. Обычно оператор IF…ELSE используется для проверки того, произошло ли условие или нет. Дополнительные сведения об операторе IF…ELSE см. во вводной и обзорной статье инструкции SQL IF.

В следующем примере показано использование оператора BREAK в цикле WHILE:

1

2

3

4

5

6

7

8

9 9 0005

10

11

DECLARE @Counter INT

SET @Counter=1

WHILE ( @Counter <= 10)

BEGIN

  PRINT 'Значение счетчика = ' + CONVERT(VARCHAR,@Counter) 9 0005

  IF @Counter >=7

  НАЧАЛО

  BREAK

  END

    SET @Counter  = @Counter  + 1

END

В этом примере мы проверили значение переменной, и когда значение равно или больше 7, код вошел в блок IF…ELSE и выполнил оператор BREAK, поэтому он немедленно вышел из цикла. По этой причине в сообщении отображаются значения переменной до 7. Если условие оператора IF…ELSE не выполняется, цикл будет выполняться до тех пор, пока результат условия не станет ложным. Следующая блок-схема наглядно объясняет рабочую логику примера оператора BREAK:

Оператор ПРОДОЛЖИТЬ

Оператор CONTINUE используется в цикле SQL WHILE, чтобы остановить текущую итерацию цикла при возникновении определенных условий, а затем начать новую итерацию с начала цикла. Предположим, что мы хотим записать в цикле WHILE только четные числа. Чтобы решить эту проблему, мы можем использовать оператор CONTINUE . В следующем примере мы проверим, является ли значение переменной нечетным или четным. Если значение переменной нечетное, код входит в блоки операторов IF…ELSE и увеличивает значение переменной, выполняя CONTINUE и начинает новую итерацию:

1

2

3

4

5

6

7

8

9 9 0005

10

11

12

13

DECLARE @Counter INT

SET @Counter=1

WHILE ( @Counter <= 20)

BEGIN

 

  IF @Counter % 2 =1 90 005

  НАЧАЛО

  SET @Counter  = @Counter  + 1

  CONTINUE

  END

    PRINT 'Значение счетчика = ' + CONVERT(VARCHAR,@Counter)

    SET @Counter  = @Counter  + 1

КОНЕЦ

Следующая блок-схема наглядно объясняет рабочую логику примера оператора CONTINUE:

Чтение записей таблицы через цикл WHILE

В следующем примере мы будем читать данные таблицы построчно. Сначала мы создадим пример таблицы:

1

2

3

4

5

6

7

8

9 9 0005

10

11

12

13

14

15

16

ИСПОЛЬЗОВАТЬ tempdb

GO

УДАЛИТЬ ТАБЛИЦУ, ЕСЛИ СУЩЕСТВУЕТ SampleTable

CREATE TABLE SampleTable

(Id INT, CountryName NVARCHAR(100), ReadStatus TINYINT)

GO

INSERT INTO SampleTable (Id, CountryName, ReadStatus)

Значения (1, ' Германия', 0),

        (2, 'Франция', 0),

        (3, 'Италия', 0),

    (4, 'Нидерланды', 0) ,

       (5, 'Польша', 0)

 

 

 

  SELECT * FROM SampleTable

На этом шаге мы будем читать все данные построчно с помощью цикла WHILE:

1

2

3

4

5

6

7

8

9 9 0005

10

11

12

13

14

15

16

17 9000 5

USE tempdb

GO

 

DECLARE @Counter INT , @MaxId INT,

        @CountryName NVARCHAR(100)

SELECT @Counter = min(Id) , @MaxId = max(Id)

FROM SampleTable

900 02 WHILE(@Counter IS NOT NULL

      AND @Counter <= @MaxId)

BEGIN

   SELECT @CountryName = CountryName

   FROM SampleTable WHERE Id = @Counter

900 02     

   PRINT CONVERT(VARCHAR,@Counter) + '. название страны ' + @CountryName  

   SET @Counter  = @Counter  + 1        

КОНЕЦ

В этом примере мы читаем строки таблицы через цикл WHILE. Мы также можем разрабатывать более сложные и продвинутые циклы в зависимости от наших потребностей.

Заключение

В этой статье мы изучили цикл SQL WHILE на довольно простых примерах. Мы также виртуализировали и объяснили примеры блок-схемами. Цикл WHILE помогает нам выполнять итерационные операции в SQL Server. В то же время операторы BREAK и CONTINUE могут использоваться для управления итерацией цикла WHILE в SQL Server.

  • Автор
  • Последние сообщения

Esat Erkec

Esat Erkec — специалист по SQL Server, который начал свою карьеру более 8 лет назад в качестве разработчика программного обеспечения. Он является сертифицированным экспертом по решениям Microsoft для SQL Server.

Большая часть его карьеры была посвящена администрированию и разработке баз данных SQL Server.