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. Инструкция FETCH5.2.9.4. Инструкция CLOSE
5.2.9.4. Инструкция CLOSE CLOSE cursor_nameЭта инструкция закрывает предварительно открытый курсор. Если курсор не закрыт явно, он все равно закроется в конце составной инструкции, в которой он был
5.2.10.1. Инструкция IF
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.
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
Инструкция создания
Инструкция создания Рассмотрим создание экземпляра класса 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
- пока
Я обнаружил, что вы не можете иметь условные выражения вне хранимой процедуры в 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.
Вам нужна функция 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 NULLAND @Counter <= @MaxId) BEGIN SELECT @CountryName = CountryName FROM SampleTable WHERE Id = @Counter 900 02PRINT 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.