С начала лета я вплотную работаю с технологиями Oracle, как можно понять и по другим постам, в частности с процедурным расширением языка cтруктурированных запросов PL/SQL. Я решил написать пару записей на эту тему и начинаю с циклов.
Сначала рассмотрим простейший вариант цикла FOR, в котором посчитаем от одного до десяти и выведем значение переменной i. Скопируйте приведённый ниже блок PL/SQL и выполните его в Oracle SQL Developerб Apex SQL Workshop или другом инструменте для работы с базами данных на ваш выбор. (Примечание: Если процедура DBMS_OUTPUT.PUT_LINE не работает, включите вывод данных командойSET SERVEROUTPUT ON
.)
BEGIN FOR i IN 1..10 LOOP DBMS_OUTPUT.PUT_LINE('i = ' || i); END LOOP; END;
Чтобы сделать то же самое в цикле WHILE, нужно объявить (например) цифровую переменную и повышать счётчик при каждом шаге. В нашем случае переменная i имеет в начале значение 1 и в конце петли ей присваивается новое значение — на единицу больше. Цикл исполняется до тех пор, пока значение i ниже или равняется десяти.
DECLARE i NUMBER := 1; BEGIN WHILE i <= 10 LOOP DBMS_OUTPUT.PUT_LINE('i = ' || i); i := i + 1; END LOOP; END;
Если вы ищите в цикле только один результат и вам необязательно проходить цикл до конца, то его выполнение можно прервать оператором EXIT. Ниже всё тот же WHILE, но хотя в условии говорится, что считать будем до десяти, внутри петли цикл обрывается, когда переменная равняется трём.
DECLARE i NUMBER := 1; BEGIN WHILE i <= 10 LOOP DBMS_OUTPUT.PUT_LINE('i = ' || i); IF i = 3 THEN DBMS_OUTPUT.PUT_LINE('выход из цикла'); EXIT; END IF; i := i + 1; END LOOP; END;
Для последнего примера цикла FOR с запросом SQL понадобится простенькая таблица в базе данных, в моём примере с двумя колонками - в одной числа, в другой строки.
CREATE TABLE test_table( number_column NUMBER, text_column VARCHAR2(50) )
Таблица может содержать, например, такие данные.

Скриншот 1: Таблица в примере
В качестве аргумента оператору IN можно передать не только значения от и до, но и целый SQL-запрос. Выбранные через SELECT колонки (в примере number_column и text_column) можно использовать в петле через переменную i (i.number_column, i.text_column).
BEGIN FOR i IN ( SELECT number_column, text_column FROM test_table ORDER BY number_column ASC ) LOOP DBMS_OUTPUT.PUT_LINE( 'i.number_column = ' || i.number_column || ', i.text_column = ' || i.text_column ); END LOOP; END;Понравился пост? Поделись в соцсетях и подписывайся на аккаунты в Twitter и Facebook!