Рассмотрим следующие операторы управления:
· операторы выбора (условного перехода/условия)
· операторы цикла.
Оператор выбора 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;