Основы PL/SQL. Управляющие конструкции. Условия и циклы




Рассмотрим следующие операторы управления:

· операторы выбора (условного перехода/условия)

· операторы цикла.

Оператор выбора IF имеет следующий синтаксис.

IF условие THEN

команды;

[ELSIF условие THEN

команды;]

[ELSE

команды;]

END IF;

Оператор всегда должен заканчиваться ключевыми словами «END IF;». А условие всегда должно возвращать логическое значение.

Пример простого оператора IF.

DECLARE

myage number:=31;

BEGIN

IF myage < 11 THEN

DBMS_OUTPUT.PUT_LINE(' I am a child ');

END IF;

END;

В данном случае команды внутри оператора выполняться не будут, так как условие возвращает FALSE.

Также важно знать, что если условие возвращает NULL (неопределенное значение), то выполняется ветка ELSE (если она имеется).

Если переменная, с которой идет сравнение (простые операции сравнения >, <, = и т.п.) в условии не инициализирована значением, то есть пустая (равна NULL), то условие также вернет NULL.

При использовании комбинированных условий также важно учитывать пустые значения. Посмотрите на приведенные таблицы истинности.


Для логической операции AND результат будет ложным, если хотя бы одно из условий ложно, поэтому FALSE AND NULL = FALSE.

Для логической операции OR результат будет истинным, если хотя бы одно из условий истино, поэтому TRUE AND NULL = TRUE.

И отрицание пустого значения дает пустое значение, то есть NOT NULL = NULL.

Операторы цикла

Циклы позволяют выполнить одну команду или последовательность команд несколько раз. Имеется три типа циклов: простой цикл, цикл FOR, цикл WHILE.

Синтаксис простого цикла.

LOOP

команда1;

...

EXIT [WHEN выражение ];

END LOOP;

Все циклы всегда должны заканчиваться ключевой фразой «END LOOP;».

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

Также существует конструкция CONTINUE. Она предназначена для того, чтобы перепрыгнуть на следующую итерацию цикла. Ее синтаксис аналогичен синтаксису EXIT.

CONTINUE [WHEN выражение ];

Пример использования простого цикла.

DECLARE

countryid locations.country_id%TYPE:= 'CA';

loc_id locations.location_id%TYPE;

counter NUMBER(2):= 1;

new_city locations.city%TYPE:= 'Montreal';

BEGIN

SELECT MAX(location_id) INTO loc_id FROM locations

WHERE country_id = countryid;

LOOP

INSERT INTO locations(location_id, city, country_id)

VALUES((loc_id + counter), new_city, countryid);

counter:= counter + 1;

EXIT WHEN counter > 3;

END LOOP;

END;

Цикл WHILE используется для повторения последовательности команд в течение всего времени, пока выполняется условие (TRUE).

Синтаксис цикла WHILE.

WHILE условие LOOP

команда1;

команда2;

...

END LOOP;

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

Пример использования цикла WHILE.

DECLARE

countryid locations.country_id%TYPE:= 'CA';

loc_id locations.location_id%TYPE;

new_city locations.city%TYPE:= 'Montreal';

counter NUMBER:= 1;

BEGIN

SELECT MAX(location_id) INTO loc_id FROM locations

WHERE country_id = countryid;

WHILE counter <= 3 LOOP

INSERT INTO locations(location_id, city, country_id)

VALUES((loc_id + counter), new_city, countryid);

counter:= counter + 1;

END LOOP;

END;

Цикл FOR — это цикл с заданным количеством итераций. При этом объявление индекса (переменной цикла) не требуется (индекс описывается неявно). Обязательно требуется задание фразы 'нижняя_граница..верхняя_граница'.

Синтаксис цикла FOR.

FOR индекс IN [REVERSE]

нижняя_граница..верхняя_граница LOOP

команда1;

команда2;

...

END LOOP;

Нижняя граница и верхняя граница индекса цикла разделяется двумя точками, например «1..10». Фраза REVERSE позволяет индексу цикла уменьшаться от верхней границы к нижней. Важно знать, что ссылаться на индекс можно только внутри цикла; вне цикла он не определен. Нельзя использовать индекс в качестве переменной, в которую помещается результат присваивания. Ни одна из границ диапазона цикла не может быть неопределенной (NULL).

Пример использования цикла FOR.

DECLARE

countryid locations.country_id%TYPE:= 'CA';

loc_id locations.location_id%TYPE;

new_city locations.city%TYPE:= 'Montreal';

BEGIN

SELECT MAX(location_id) INTO loc_id

FROM locations

WHERE country_id = countryid;

FOR i IN 1..3 LOOP

INSERT INTO locations(location_id, city, country_id)

VALUES((loc_id + i), new_city, countryid);

END LOOP;

END;



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-03-31 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: