Циклы FOR и WHILE в PL/SQL

2 минуты на чтение

С начала лета я вплотную работаю с технологиями 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: Таблица в примере

Скриншот 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!
Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

Похожие записи:

Как я писал в прошлом посте (Различия между T-SQL и PL/SQL), в прошлом семестре я проходил курс по хранилищам данных. Изначально я собирался написать больше постов, но времени не было. В черновике уже долгое время лежит несколько постов, но когда я их доделаю ...
Прошлым летом я допинал бакалавра в Бизнес-информатике и в октябре начал магистратуру. На работе я использую систему управления базами данных от Oracle, на курсе Data Warehouse (хранилище данных) сейчас я работаю с SQL Server. В этом посту я опишу несколько ра...
Пакеты PL/SQL являются объектами базы данных (схемы), которые объединяют в себе связанные по смыслу подпрограммы (переменные, курсоры…). В этом посту рассмотрим простейший пример объявления пакета, его реализации и использования. Состоят пакеты из спецификаци...