FOR в PL/SQL. Введение
Если WHILE это про контроль, то FOR это про чистоту кода. Это самый читаемый цикл Oracle. Когда знаешь сколько итераций нужно — лучше инструмента не найти.
FOR особенно хорош потому что:
- не требует ручного счётчика
- исключает ошибки инкремента
- читабельнее WHILE
- идеален для курсоров
- упрощает batch обработку
Синтаксис FOR
FOR i IN 1..10 LOOP
statements;
END LOOP;Базовый пример
BEGIN
FOR i IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE(i);
END LOOP;
END;100 примеров использования FOR
1. Простой числовой цикл
BEGIN
FOR i IN 1..10 LOOP
NULL;
END LOOP;
END;2. Вывод чисел
BEGIN
FOR i IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE(i);
END LOOP;
END;3. Квадраты чисел
BEGIN
FOR i IN 1..6 LOOP
DBMS_OUTPUT.PUT_LINE(i*i);
END LOOP;
END;4. Кубы
BEGIN
FOR i IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE(i*i*i);
END LOOP;
END;5. Сумма диапазона
DECLARE
s NUMBER:=0;
BEGIN
FOR i IN 1..10 LOOP
s:=s+i;
END LOOP;
END;6. Чётные числа
BEGIN
FOR i IN 1..10 LOOP
IF MOD(i,2)=0 THEN
DBMS_OUTPUT.PUT_LINE(i);
END IF;
END LOOP;
END;7. Нечётные числа
BEGIN
FOR i IN 1..10 LOOP
IF MOD(i,2)=1 THEN
DBMS_OUTPUT.PUT_LINE(i);
END IF;
END LOOP;
END;8. Умножение значений
DECLARE
v NUMBER:=1;
BEGIN
FOR i IN 1..5 LOOP
v:=v*2;
END LOOP;
END;9. Генерация строк
BEGIN
FOR i IN 1..3 LOOP
DBMS_OUTPUT.PUT_LINE('row');
END LOOP;
END;10. Итерация диапазона
BEGIN
FOR i IN 5..15 LOOP
NULL;
END LOOP;
END;11. Уменьшение через REVERSE
BEGIN
FOR i IN REVERSE 1..10 LOOP
DBMS_OUTPUT.PUT_LINE(i);
END LOOP;
END;12. Обратный диапазон
BEGIN
FOR i IN REVERSE 5..9 LOOP
NULL;
END LOOP;
END;13. Генерация ID
BEGIN
FOR i IN 100..105 LOOP
DBMS_OUTPUT.PUT_LINE(i);
END LOOP;
END;14. Проверка условий
BEGIN
FOR i IN 1..10 LOOP
IF i=5 THEN
NULL;
END IF;
END LOOP;
END;15. EXIT внутри FOR
BEGIN
FOR i IN 1..20 LOOP
EXIT WHEN i=8;
END LOOP;
END;16. CONTINUE логика
BEGIN
FOR i IN 1..10 LOOP
CONTINUE WHEN i<5;
END LOOP;
END;17. Счётчик попыток
BEGIN
FOR i IN 1..3 LOOP
DBMS_OUTPUT.PUT_LINE('try');
END LOOP;
END;18. Генерация дат
BEGIN
FOR i IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE(SYSDATE+i);
END LOOP;
END;19. Подсчёт дней
BEGIN
FOR i IN 1..30 LOOP
NULL;
END LOOP;
END;20. Ограничение операций
BEGIN
FOR i IN 1..7 LOOP
NULL;
END LOOP;
END;Еще 20 примеров
21. Cursor FOR loop
BEGIN
FOR r IN (SELECT LEVEL n FROM dual CONNECT BY LEVEL<5)
LOOP
DBMS_OUTPUT.PUT_LINE(r.n);
END LOOP;
END;22. Обход SELECT
BEGIN
FOR r IN (SELECT 1 n FROM dual)
LOOP
NULL;
END LOOP;
END;23. Cursor сумма
DECLARE
s NUMBER:=0;
BEGIN
FOR r IN (SELECT LEVEL n FROM dual CONNECT BY LEVEL<6)
LOOP
s:=s+r.n;
END LOOP;
END;24. Обработка строк
BEGIN
FOR r IN (SELECT 'A' v FROM dual)
LOOP
DBMS_OUTPUT.PUT_LINE(r.v);
END LOOP;
END;25. Генерация записей
BEGIN
FOR r IN (SELECT LEVEL n FROM dual CONNECT BY LEVEL<4)
LOOP
NULL;
END LOOP;
END;26. Nested FOR
BEGIN
FOR i IN 1..3 LOOP
FOR j IN 1..2 LOOP
NULL;
END LOOP;
END LOOP;
END;27. Таблица умножения
BEGIN
FOR i IN 1..3 LOOP
FOR j IN 1..3 LOOP
DBMS_OUTPUT.PUT_LINE(i*j);
END LOOP;
END LOOP;
END;28. Генерация сетки
BEGIN
FOR i IN 1..2 LOOP
FOR j IN 1..2 LOOP
NULL;
END LOOP;
END LOOP;
END;29. Cursor reverse обработка
BEGIN
FOR i IN REVERSE 1..5 LOOP
NULL;
END LOOP;
END;30. Итерация диапазона
BEGIN
FOR i IN 10..15 LOOP
NULL;
END LOOP;
END;Еще 20 примеров
31. Увеличение значения в цикле
DECLARE
v NUMBER:=0;
BEGIN
FOR i IN 1..10 LOOP
v:=v+i;
END LOOP;
END;32. Подсчёт итераций
DECLARE
c NUMBER:=0;
BEGIN
FOR i IN 1..15 LOOP
c:=c+1;
END LOOP;
END;33. Генерация процентов
DECLARE
p NUMBER:=0;
BEGIN
FOR i IN 1..10 LOOP
p:=p+10;
END LOOP;
END;34. Проверка значений
BEGIN
FOR i IN 1..8 LOOP
IF i>4 THEN
NULL;
END IF;
END LOOP;
END;35. Генерация диапазона
BEGIN
FOR i IN 50..60 LOOP
NULL;
END LOOP;
END;36. Рост коэффициента
DECLARE
k NUMBER:=1;
BEGIN
FOR i IN 1..5 LOOP
k:=k*2;
END LOOP;
END;37. Снижение значения
DECLARE
v NUMBER:=100;
BEGIN
FOR i IN 1..5 LOOP
v:=v-10;
END LOOP;
END;38. Генерация логов
BEGIN
FOR i IN 1..4 LOOP
DBMS_OUTPUT.PUT_LINE('log');
END LOOP;
END;39. Ограничение операций
BEGIN
FOR i IN 1..6 LOOP
NULL;
END LOOP;
END;40. Итерация значений
BEGIN
FOR i IN 3..9 LOOP
NULL;
END LOOP;
END;Еще 20 примеров
41. Обход коллекции
DECLARE
TYPE t IS TABLE OF NUMBER;
a t:=t(10,20,30);
BEGIN
FOR i IN 1..a.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(a(i));
END LOOP;
END;42. Обработка массива строк
DECLARE
TYPE t IS TABLE OF VARCHAR2(5);
a t:=t('A','B');
BEGIN
FOR i IN 1..a.COUNT LOOP
NULL;
END LOOP;
END;43. Nested loops
BEGIN
FOR i IN 1..2 LOOP
FOR j IN 1..3 LOOP
NULL;
END LOOP;
END LOOP;
END;44. Двойная итерация
BEGIN
FOR i IN 1..4 LOOP
FOR j IN 1..2 LOOP
DBMS_OUTPUT.PUT_LINE(i+j);
END LOOP;
END LOOP;
END;45. Таблица умножения
BEGIN
FOR i IN 1..3 LOOP
FOR j IN 1..3 LOOP
NULL;
END LOOP;
END LOOP;
END;46. Cursor FOR с фильтром
BEGIN
FOR r IN (SELECT LEVEL n FROM dual CONNECT BY LEVEL<10)
LOOP
IF r.n>5 THEN
NULL;
END IF;
END LOOP;
END;47. Подсчёт строк cursor
DECLARE
c NUMBER:=0;
BEGIN
FOR r IN (SELECT LEVEL FROM dual CONNECT BY LEVEL<7)
LOOP
c:=c+1;
END LOOP;
END;48. Генерация ID cursor
BEGIN
FOR r IN (SELECT LEVEL+100 id FROM dual CONNECT BY LEVEL<5)
LOOP
NULL;
END LOOP;
END;49. Cursor обработка дат
BEGIN
FOR r IN (SELECT SYSDATE+LEVEL d FROM dual CONNECT BY LEVEL<4)
LOOP
NULL;
END LOOP;
END;50. Cursor проверка
BEGIN
FOR r IN (SELECT 1 n FROM dual)
LOOP
NULL;
END LOOP;
END;Еще 20 примеров
51. Reverse итерация
BEGIN
FOR i IN REVERSE 1..6 LOOP
NULL;
END LOOP;
END;52. Reverse вывод
BEGIN
FOR i IN REVERSE 1..5 LOOP
DBMS_OUTPUT.PUT_LINE(i);
END LOOP;
END;53. Reverse диапазон
BEGIN
FOR i IN REVERSE 10..15 LOOP
NULL;
END LOOP;
END;54. Проверка reverse условия
BEGIN
FOR i IN REVERSE 1..10 LOOP
IF i<5 THEN
NULL;
END IF;
END LOOP;
END;55. Reverse nested
BEGIN
FOR i IN REVERSE 1..3 LOOP
FOR j IN 1..2 LOOP
NULL;
END LOOP;
END LOOP;
END;56. Генерация batch
BEGIN
FOR i IN 1..12 LOOP
NULL;
END LOOP;
END;57. Проверка этапов
BEGIN
FOR i IN 1..5 LOOP
NULL;
END LOOP;
END;58. Генерация сегментов
BEGIN
FOR i IN 1..8 LOOP
NULL;
END LOOP;
END;59. Подсчёт задач
BEGIN
FOR i IN 1..9 LOOP
NULL;
END LOOP;
END;60. Контроль операций
BEGIN
FOR i IN 1..11 LOOP
NULL;
END LOOP;
END;Еще 20 примеров
61. Генерация шагов
BEGIN
FOR i IN 5..25 LOOP
NULL;
END LOOP;
END;62. Проверка лимита
BEGIN
FOR i IN 1..20 LOOP
EXIT WHEN i=10;
END LOOP;
END;63. CONTINUE использование
BEGIN
FOR i IN 1..10 LOOP
CONTINUE WHEN i<6;
END LOOP;
END;64. Cursor EXIT
BEGIN
FOR r IN (SELECT LEVEL n FROM dual CONNECT BY LEVEL<10)
LOOP
EXIT WHEN r.n=4;
END LOOP;
END;65. Генерация строк
BEGIN
FOR i IN 1..3 LOOP
DBMS_OUTPUT.PUT_LINE('data');
END LOOP;
END;66. Подсчёт файлов
BEGIN
FOR i IN 1..14 LOOP
NULL;
END LOOP;
END;67. Проверка очереди
BEGIN
FOR i IN 1..6 LOOP
NULL;
END LOOP;
END;68. Генерация процессов
BEGIN
FOR i IN 1..7 LOOP
NULL;
END LOOP;
END;69. Контроль статусов
BEGIN
FOR i IN 1..5 LOOP
NULL;
END LOOP;
END;70. Генерация операций
BEGIN
FOR i IN 1..13 LOOP
NULL;
END LOOP;
END;Еще 20 примеров
71. Подсчёт проверок
BEGIN
FOR i IN 1..16 LOOP
NULL;
END LOOP;
END;72. Генерация блоков
BEGIN
FOR i IN 1..18 LOOP
NULL;
END LOOP;
END;73. Проверка данных
BEGIN
FOR i IN 1..22 LOOP
NULL;
END LOOP;
END;74. Увеличение значения
DECLARE
v NUMBER:=0;
BEGIN
FOR i IN 1..10 LOOP
v:=v+2;
END LOOP;
END;75. Умножение результата
DECLARE
v NUMBER:=1;
BEGIN
FOR i IN 1..4 LOOP
v:=v*3;
END LOOP;
END;76. Проверка условий
BEGIN
FOR i IN 1..12 LOOP
IF i=9 THEN
NULL;
END IF;
END LOOP;
END;77. Генерация интервала
BEGIN
FOR i IN 20..30 LOOP
NULL;
END LOOP;
END;78. Контроль итераций
BEGIN
FOR i IN 1..17 LOOP
NULL;
END LOOP;
END;79. Генерация диапазона
BEGIN
FOR i IN 2..12 LOOP
NULL;
END LOOP;
END;80. Проверка операций
BEGIN
FOR i IN 1..19 LOOP
NULL;
END LOOP;
END;81. Подсчёт элементов
BEGIN
FOR i IN 1..21 LOOP
NULL;
END LOOP;
END;82. Генерация этапов
BEGIN
FOR i IN 1..23 LOOP
NULL;
END LOOP;
END;83. Контроль шагов
BEGIN
FOR i IN 1..24 LOOP
NULL;
END LOOP;
END;84. Генерация уровней
BEGIN
FOR i IN 1..26 LOOP
NULL;
END LOOP;
END;85. Проверка циклов
BEGIN
FOR i IN 1..28 LOOP
NULL;
END LOOP;
END;86. Итерация данных
BEGIN
FOR i IN 1..29 LOOP
NULL;
END LOOP;
END;87. Генерация позиций
BEGIN
FOR i IN 1..31 LOOP
NULL;
END LOOP;
END;88. Контроль диапазона
BEGIN
FOR i IN 1..33 LOOP
NULL;
END LOOP;
END;89. Проверка количества
BEGIN
FOR i IN 1..35 LOOP
NULL;
END LOOP;
END;90. Генерация значений
BEGIN
FOR i IN 1..37 LOOP
NULL;
END LOOP;
END;91. Контроль данных
BEGIN
FOR i IN 1..39 LOOP
NULL;
END LOOP;
END;92. Итерация записей
BEGIN
FOR i IN 1..41 LOOP
NULL;
END LOOP;
END;93. Генерация объектов
BEGIN
FOR i IN 1..43 LOOP
NULL;
END LOOP;
END;94. Контроль числа
BEGIN
FOR i IN 1..45 LOOP
NULL;
END LOOP;
END;95. Генерация операций
BEGIN
FOR i IN 1..47 LOOP
NULL;
END LOOP;
END;96. Проверка задач
BEGIN
FOR i IN 1..49 LOOP
NULL;
END LOOP;
END;97. Генерация итераций
BEGIN
FOR i IN 1..51 LOOP
NULL;
END LOOP;
END;98. Контроль процессов
BEGIN
FOR i IN 1..53 LOOP
NULL;
END LOOP;
END;99. Генерация проверок
BEGIN
FOR i IN 1..55 LOOP
NULL;
END LOOP;
END;100. Финальный цикл
BEGIN
FOR i IN 1..60 LOOP
NULL;
END LOOP;
END;