Циклы WHILE
Цикл WHILE выполняется до тех пор, пока не будет выполнено заданное
условие. Синтаксис цикла WHILE имеет следующий вид:
□ WHILE у словие LOOP
операторы
END LOOP;
В следующем примере показан цикл WHILE, который выполняется до тех
пор, пока переменная v_counter меньше 6:
□ v _ c o u n t e r := 0;
WHILE v _ c o u n t e r < 6 LOOP
v _ c o u n t e r := v _ c o u n t e r + 1;
END LOOP;
Циклы FOR
Цикл FOR выполняется предварительно заданное число раз; количество
выполнений цикла определяется путем задания минимального и максимального
значений переменной цикла. После этого переменная цикла увеличивается
(или уменьшается) при каждом выполнении цикла. Синтаксис
цикла FOR имеет следующий вид:
П FOR переменная_цикла IN [REVERSE] н ижн я я _ гр а н и ц а . . верхняя_ граница LOOP
операторы
END LOOP;
где
■ переменная_цикла определяет переменную цикла. Можно использовать
для переменной цикла уже существующую переменную, либо
цикл может просто создать ее для вас (это происходит в том случае,
если указанной переменной не существует). Переменная цикла увеличивается
(или уменьшается, если используется ключевое слово
REVERSE) на 1 при каждом выполнении цикла;
■ REVERSE показывает, что переменная цикла должна уменьшаться при
каждом выполнении цикла. Переменная цикла инициализируется
значением верхней границы и уменьшается на 1 до тех пор, пока не
достигнет нижней границы. Нижняя граница должна быть указана
перед верхней границей;
■ нижняя_граница определяет нижнюю границу цикла. Переменная цикла
инициализируется этим значением, если только не использовано
ключевое слово REVERSE;
■ верхняя_граница определяет верхнюю границу цикла. Если использовано
ключевое слово REVERSE, переменная цикла инициализируется
этим значением.
В следующем примере показан цикл FOR. Переменная v_counter2 не была
объявлена явно - в этом случае цикл FOR автоматически создает ее как
переменную типа INTEGER:
360 Глава 11
□ FOR v_counter2 IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE(v_counter2);
END LOOP;
Следующий пример использует REVERSE:
□ FOR v_counter2 IN REVERSE 1..5 LOOP
DBMS_OUTPUT.PUT_LINE(v_counter2);
END LOOP;
В этом примере переменная цикла v_counter2 начнет изменяться со
значения 5 и, уменьшаясь при каждом выполнении цикла на 1 , дойдет до
конечного значения 1 .
Курсоры
Курсор используется для получения строк, возвращаемых запросом. Для
передачи строк в курсор используется запрос, после чего вы можете выбирать
строки из курсора по одной за один раз. При использовании курсора
можно использовать следующие пять шагов.
1. Объявить переменные для хранения значений столбцов из оператора
SELECT.
2. Объявить курсор, который содержит запрос.
3. Открыть курсор.
4. По одной выбрать строки из курсора и сохранить значения столбцов в
переменных, объявленных на шаге 1. Затем вы можете что-то сделать с
этими переменными, например, показать их на экране, использовать
при расчётах и т.п.
5. Закрыть курсор.
В следующих разделах вы более подробно изучите эти пять шагов. Вы
увидите простой пример, который получает столбцы product_id, name и
price из таблицы products.
Шаг 1: Объявить переменные для хранения значений столбцов
На первом шаге объявляются переменные для хранения значений столбцов.
Эти переменные должны быть совместимы с типами столбцов.
Совет Ранее вы уже видели, что использование %type приводит к автоматическому получению
типа столбца. Поэтому при использовании %TYPE переменные всегда будут правильного
типа.
В следующем примере объявляются три переменные для хранения
столбцов product_id, name и price таблицы products. Обратите внимание,
что %TYPE используется для автоматической установки типа переменных
на тот же тип, что и тип столбцов:
□ DECLARE
v_product_id products.product_id%TYPE;
Знакомство с программированием на PL/SQL 361
v_name products.name%TYPE;
v_price products.price%TYPE;
Шаг 2: Объявить курсор
Объявление курсора состоит из имени, назначаемого курсору, и запроса,
который нужно выполнить. Объявление курсора, как и все другие объявления,
помещается в секции объявлений. Синтаксис объявления курсора
имеет следующий вид:
□ CURSOR имя_курсора IS
onepaTop_SELECT;
где
■ имя_курсора определяет имя курсора;
■ onepaTop_SELECT - это текст запроса.
В следующем примере определяется курсор v_product_cursor, оператор
SELECT которого отбирает из таблицы products столбцы product_id, name и
price:
□ CURSOR v_product_cursor IS