WHILE в Oracle SQL. Введение
WHILE — один из самых аккуратных циклов Oracle. Он не просто выполняет код. Он делает это только пока выполняется условие. Это делает код безопасным, предсказуемым и очень читаемым.
Синтаксис
WHILE condition LOOP
statements;
END LOOP;Примеры использования WHILE
1. Простой инкремент
DECLARE
v NUMBER:=1;
BEGIN
WHILE v<=5 LOOP
v:=v+1;
END LOOP;
END;2. Декремент значения
DECLARE
v NUMBER:=10;
BEGIN
WHILE v>0 LOOP
v:=v-1;
END LOOP;
END;3. Сумма диапазона
DECLARE
i NUMBER:=1;
s NUMBER:=0;
BEGIN
WHILE i<=10 LOOP
s:=s+i;
i:=i+1;
END LOOP;
END;4. Удвоение значения
DECLARE
v NUMBER:=2;
BEGIN
WHILE v<100 LOOP
v:=v*2;
END LOOP;
END;5. Рост с шагом
DECLARE
v NUMBER:=0;
BEGIN
WHILE v<50 LOOP
v:=v+5;
END LOOP;
END;6. Уменьшение цены
DECLARE
price NUMBER:=500;
BEGIN
WHILE price>100 LOOP
price:=price-25;
END LOOP;
END;7. Проверка EXIT WHEN
DECLARE
v NUMBER:=1;
BEGIN
WHILE v<100 LOOP
EXIT WHEN v=10;
v:=v+1;
END LOOP;
END;8. Генерация номеров
DECLARE
id NUMBER:=100;
BEGIN
WHILE id<105 LOOP
DBMS_OUTPUT.PUT_LINE(id);
id:=id+1;
END LOOP;
END;9. Подсчёт попыток
DECLARE
tries NUMBER:=1;
BEGIN
WHILE tries<=3 LOOP
tries:=tries+1;
END LOOP;
END;10. Проверка лимита
DECLARE
v NUMBER:=20;
BEGIN
WHILE v<200 LOOP
v:=v+20;
END LOOP;
END;11. Квадраты чисел
DECLARE
i NUMBER:=1;
BEGIN
WHILE i<6 LOOP
DBMS_OUTPUT.PUT_LINE(i*i);
i:=i+1;
END LOOP;
END;12. Кубы
DECLARE
i NUMBER:=1;
BEGIN
WHILE i<5 LOOP
DBMS_OUTPUT.PUT_LINE(i*i*i);
i:=i+1;
END LOOP;
END;13. Деление до порога
DECLARE
v NUMBER:=1000;
BEGIN
WHILE v>10 LOOP
v:=v/2;
END LOOP;
END;14. Рост процентов
DECLARE
v NUMBER:=100;
BEGIN
WHILE v<150 LOOP
v:=v*1.05;
END LOOP;
END;15. Генерация строк
DECLARE
i NUMBER:=1;
BEGIN
WHILE i<4 LOOP
DBMS_OUTPUT.PUT_LINE('row');
i:=i+1;
END LOOP;
END;16. Ограничение количества
DECLARE
v NUMBER:=1;
BEGIN
WHILE v<25 LOOP
v:=v+3;
END LOOP;
END;17. Минимальный порог
DECLARE
v NUMBER:=5;
BEGIN
WHILE v<30 LOOP
v:=v+2;
END LOOP;
END;18. Умножение до лимита
DECLARE
v NUMBER:=3;
BEGIN
WHILE v<500 LOOP
v:=v*3;
END LOOP;
END;19. Снижение количества
DECLARE
qty NUMBER:=80;
BEGIN
WHILE qty>10 LOOP
qty:=qty-7;
END LOOP;
END;20. Проверка диапазона
DECLARE
v NUMBER:=15;
BEGIN
WHILE v<60 LOOP
v:=v+5;
END LOOP;
END;Еще 20 примеров
21. Итерация массива
DECLARE
TYPE t IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
a t;
i NUMBER:=1;
BEGIN
a(1):=10;
a(2):=20;
WHILE i<=2 LOOP
DBMS_OUTPUT.PUT_LINE(a(i));
i:=i+1;
END LOOP;
END;22. Обход коллекции
DECLARE
TYPE t IS TABLE OF VARCHAR2(10) INDEX BY PLS_INTEGER;
a t;
i NUMBER:=1;
BEGIN
a(1):='A';
a(2):='B';
WHILE i<=2 LOOP
i:=i+1;
END LOOP;
END;23. Генерация дат
DECLARE
d DATE:=SYSDATE;
i NUMBER:=1;
BEGIN
WHILE i<5 LOOP
DBMS_OUTPUT.PUT_LINE(d+i);
i:=i+1;
END LOOP;
END;24. Подсчёт дней
DECLARE
d DATE:=SYSDATE;
BEGIN
WHILE d<SYSDATE+10 LOOP
d:=d+1;
END LOOP;
END;25. Поиск значения
DECLARE
v NUMBER:=1;
BEGIN
WHILE v<100 LOOP
EXIT WHEN v=77;
v:=v+1;
END LOOP;
END;26. Batch счётчик
DECLARE
batch NUMBER:=1;
BEGIN
WHILE batch<10 LOOP
batch:=batch+1;
END LOOP;
END;27. Retry логика
DECLARE
t NUMBER:=1;
BEGIN
WHILE t<5 LOOP
t:=t+1;
END LOOP;
END;28. Проверка статуса
DECLARE
s NUMBER:=0;
BEGIN
WHILE s<3 LOOP
s:=s+1;
END LOOP;
END;29. Контроль загрузки
DECLARE
load NUMBER:=10;
BEGIN
WHILE load<100 LOOP
load:=load+10;
END LOOP;
END;30. Итерация до порога
DECLARE
v NUMBER:=7;
BEGIN
WHILE v<70 LOOP
v:=v+7;
END LOOP;
END;Еще 20 примеров
31. Увеличение депозита
DECLARE
dep NUMBER:=1000;
BEGIN
WHILE dep<2000 LOOP
dep:=dep+100;
END LOOP;
END;32. Уменьшение остатка
DECLARE
bal NUMBER:=900;
BEGIN
WHILE bal>300 LOOP
bal:=bal-50;
END LOOP;
END;33. Наращивание бонусов
DECLARE
b NUMBER:=0;
BEGIN
WHILE b<100 LOOP
b:=b+10;
END LOOP;
END;34. Подсчёт итераций
DECLARE
i NUMBER:=0;
BEGIN
WHILE i<15 LOOP
i:=i+1;
END LOOP;
END;35. Проверка флага
DECLARE
flag NUMBER:=0;
BEGIN
WHILE flag=0 LOOP
flag:=1;
END LOOP;
END;36. Рост коэффициента
DECLARE
k NUMBER:=1;
BEGIN
WHILE k<10 LOOP
k:=k*1.5;
END LOOP;
END;37. Деление бюджета
DECLARE
b NUMBER:=10000;
BEGIN
WHILE b>100 LOOP
b:=b/2;
END LOOP;
END;38. Генерация последовательности
DECLARE
v NUMBER:=5;
BEGIN
WHILE v<55 LOOP
DBMS_OUTPUT.PUT_LINE(v);
v:=v+5;
END LOOP;
END;39. Подсчёт заказов
DECLARE
cnt NUMBER:=1;
BEGIN
WHILE cnt<20 LOOP
cnt:=cnt+1;
END LOOP;
END;40. Увеличение лимита
DECLARE
l NUMBER:=100;
BEGIN
WHILE l<1000 LOOP
l:=l+100;
END LOOP;
END;Еще 20 примеров
41. Итерация курсора
DECLARE
CURSOR c IS SELECT LEVEL n FROM dual CONNECT BY LEVEL<5;
r c%ROWTYPE;
BEGIN
OPEN c;
FETCH c INTO r;
WHILE c%FOUND LOOP
FETCH c INTO r;
END LOOP;
CLOSE c;
END;42. Fetch обработка
DECLARE
CURSOR c IS SELECT 1 FROM dual;
v NUMBER;
BEGIN
OPEN c;
FETCH c INTO v;
WHILE c%FOUND LOOP
FETCH c INTO v;
END LOOP;
CLOSE c;
END;43. Обработка списка ID
DECLARE
TYPE t IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
a t;
i NUMBER:=1;
BEGIN
a(1):=5;
a(2):=9;
WHILE i<=2 LOOP
i:=i+1;
END LOOP;
END;44. Контроль batch
DECLARE
b NUMBER:=1;
BEGIN
WHILE b<8 LOOP
b:=b+1;
END LOOP;
END;45. Retry счётчик
DECLARE
r NUMBER:=1;
BEGIN
WHILE r<4 LOOP
r:=r+1;
END LOOP;
END;46. Контроль процесса
DECLARE
step NUMBER:=1;
BEGIN
WHILE step<6 LOOP
step:=step+1;
END LOOP;
END;47. Генерация тестовых чисел
DECLARE
v NUMBER:=11;
BEGIN
WHILE v<20 LOOP
v:=v+1;
END LOOP;
END;48. Увеличение версии
DECLARE
ver NUMBER:=1;
BEGIN
WHILE ver<5 LOOP
ver:=ver+1;
END LOOP;
END;49. Уменьшение веса
DECLARE
w NUMBER:=120;
BEGIN
WHILE w>80 LOOP
w:=w-2;
END LOOP;
END;50. Подсчёт символов
DECLARE
i NUMBER:=1;
BEGIN
WHILE i<10 LOOP
i:=i+1;
END LOOP;
END;Еще 20 примеров
51. Генерация процентов
DECLARE
p NUMBER:=5;
BEGIN
WHILE p<50 LOOP
p:=p+5;
END LOOP;
END;52. Проверка температуры
DECLARE
t NUMBER:=10;
BEGIN
WHILE t<30 LOOP
t:=t+2;
END LOOP;
END;53. Итерация задач
DECLARE
j NUMBER:=1;
BEGIN
WHILE j<12 LOOP
j:=j+1;
END LOOP;
END;54. Снижение нагрузки
DECLARE
l NUMBER:=90;
BEGIN
WHILE l>30 LOOP
l:=l-5;
END LOOP;
END;55. Увеличение скорости
DECLARE
s NUMBER:=20;
BEGIN
WHILE s<120 LOOP
s:=s+10;
END LOOP;
END;56. Контроль памяти
DECLARE
m NUMBER:=128;
BEGIN
WHILE m<1024 LOOP
m:=m*2;
END LOOP;
END;57. Проверка числа
DECLARE
n NUMBER:=3;
BEGIN
WHILE n<30 LOOP
n:=n+3;
END LOOP;
END;58. Генерация логов
DECLARE
i NUMBER:=1;
BEGIN
WHILE i<5 LOOP
DBMS_OUTPUT.PUT_LINE('log');
i:=i+1;
END LOOP;
END;59. Проверка активности
DECLARE
a NUMBER:=0;
BEGIN
WHILE a<1 LOOP
a:=1;
END LOOP;
END;60. Рост значения
DECLARE
v NUMBER:=9;
BEGIN
WHILE v<90 LOOP
v:=v+9;
END LOOP;
END;Еще 20 примеров
61. Увеличение таймера
DECLARE
t NUMBER:=1;
BEGIN
WHILE t<60 LOOP
t:=t+5;
END LOOP;
END;62. Обработка очереди
DECLARE
q NUMBER:=1;
BEGIN
WHILE q<7 LOOP
q:=q+1;
END LOOP;
END;63. Проверка этапов
DECLARE
s NUMBER:=1;
BEGIN
WHILE s<4 LOOP
s:=s+1;
END LOOP;
END;64. Генерация блоков
DECLARE
b NUMBER:=2;
BEGIN
WHILE b<32 LOOP
b:=b*2;
END LOOP;
END;65. Подсчёт файлов
DECLARE
f NUMBER:=1;
BEGIN
WHILE f<15 LOOP
f:=f+1;
END LOOP;
END;66. Уменьшение ошибок
DECLARE
e NUMBER:=50;
BEGIN
WHILE e>5 LOOP
e:=e-5;
END LOOP;
END;67. Итерация проверок
DECLARE
c NUMBER:=1;
BEGIN
WHILE c<9 LOOP
c:=c+1;
END LOOP;
END;68. Генерация диапазона
DECLARE
r NUMBER:=100;
BEGIN
WHILE r<150 LOOP
r:=r+5;
END LOOP;
END;69. Проверка попыток
DECLARE
a NUMBER:=1;
BEGIN
WHILE a<6 LOOP
a:=a+1;
END LOOP;
END;70. Рост значения
DECLARE
v NUMBER:=4;
BEGIN
WHILE v<40 LOOP
v:=v+4;
END LOOP;
END;Еще 20 примеров
71. Генерация парных чисел
DECLARE
v NUMBER:=2;
BEGIN
WHILE v<40 LOOP
v:=v+2;
END LOOP;
END;72. Контроль обработки
DECLARE
p NUMBER:=1;
BEGIN
WHILE p<10 LOOP
p:=p+1;
END LOOP;
END;73. Увеличение баллов
DECLARE
pts NUMBER:=10;
BEGIN
WHILE pts<100 LOOP
pts:=pts+10;
END LOOP;
END;74. Проверка нагрузки
DECLARE
l NUMBER:=5;
BEGIN
WHILE l<25 LOOP
l:=l+5;
END LOOP;
END;75. Генерация уровней
DECLARE
lvl NUMBER:=1;
BEGIN
WHILE lvl<6 LOOP
lvl:=lvl+1;
END LOOP;
END;76. Снижение цены
DECLARE
p NUMBER:=300;
BEGIN
WHILE p>150 LOOP
p:=p-15;
END LOOP;
END;77. Рост показателя
DECLARE
k NUMBER:=2;
BEGIN
WHILE k<64 LOOP
k:=k*2;
END LOOP;
END;78. Проверка пакетов
DECLARE
p NUMBER:=1;
BEGIN
WHILE p<12 LOOP
p:=p+1;
END LOOP;
END;79. Генерация записей
DECLARE
r NUMBER:=1;
BEGIN
WHILE r<30 LOOP
r:=r+3;
END LOOP;
END;80. Контроль операций
DECLARE
o NUMBER:=1;
BEGIN
WHILE o<5 LOOP
o:=o+1;
END LOOP;
END;Еще 20 примеров
81. Проверка времени
DECLARE
t NUMBER:=0;
BEGIN
WHILE t<24 LOOP
t:=t+1;
END LOOP;
END;82. Рост нагрузки
DECLARE
l NUMBER:=10;
BEGIN
WHILE l<100 LOOP
l:=l+10;
END LOOP;
END;83. Генерация сегментов
DECLARE
s NUMBER:=1;
BEGIN
WHILE s<16 LOOP
s:=s*2;
END LOOP;
END;84. Подсчёт циклов
DECLARE
c NUMBER:=1;
BEGIN
WHILE c<14 LOOP
c:=c+1;
END LOOP;
END;85. Проверка блоков
DECLARE
b NUMBER:=1;
BEGIN
WHILE b<9 LOOP
b:=b+1;
END LOOP;
END;86. Уменьшение значения
DECLARE
v NUMBER:=70;
BEGIN
WHILE v>35 LOOP
v:=v-5;
END LOOP;
END;87. Генерация шагов
DECLARE
s NUMBER:=5;
BEGIN
WHILE s<55 LOOP
s:=s+5;
END LOOP;
END;88. Контроль числа
DECLARE
n NUMBER:=8;
BEGIN
WHILE n<80 LOOP
n:=n+8;
END LOOP;
END;89. Проверка лимита
DECLARE
l NUMBER:=30;
BEGIN
WHILE l<300 LOOP
l:=l+30;
END LOOP;
END;90. Генерация диапазона
DECLARE
d NUMBER:=6;
BEGIN
WHILE d<60 LOOP
d:=d+6;
END LOOP;
END;91. Итерация проверки
DECLARE
i NUMBER:=1;
BEGIN
WHILE i<11 LOOP
i:=i+1;
END LOOP;
END;92. Подсчёт задач
DECLARE
t NUMBER:=1;
BEGIN
WHILE t<18 LOOP
t:=t+1;
END LOOP;
END;93. Увеличение ставки
DECLARE
r NUMBER:=5;
BEGIN
WHILE r<25 LOOP
r:=r+5;
END LOOP;
END;94. Проверка роста
DECLARE
g NUMBER:=2;
BEGIN
WHILE g<32 LOOP
g:=g*2;
END LOOP;
END;95. Генерация элементов
DECLARE
e NUMBER:=1;
BEGIN
WHILE e<13 LOOP
e:=e+1;
END LOOP;
END;96. Контроль значений
DECLARE
v NUMBER:=12;
BEGIN
WHILE v<120 LOOP
v:=v+12;
END LOOP;
END;97. Уменьшение нагрузки
DECLARE
l NUMBER:=200;
BEGIN
WHILE l>100 LOOP
l:=l-10;
END LOOP;
END;98. Проверка диапазона
DECLARE
d NUMBER:=14;
BEGIN
WHILE d<70 LOOP
d:=d+7;
END LOOP;
END;99. Генерация шагов
DECLARE
s NUMBER:=9;
BEGIN
WHILE s<90 LOOP
s:=s+9;
END LOOP;
END;100. Финальный счётчик
DECLARE
f NUMBER:=1;
BEGIN
WHILE f<101 LOOP
f:=f+1;
END LOOP;
END;Документация Oracle
🔜 Следующая статья:
WHENEVER в Oracle SQL*Plus — как управлять поведением скриптов при ошибках