Oracle PL/SQL LOOP с пример

Какво представляват Loops?

Циклите позволяват определена част от кода в програма да бъде изпълнена желания брой пъти.

В този урок ще видим концепцията за цикъл в PL/SQL и потока на управление в цикли.

Въведение в концепцията за цикли

Концепцията за цикли осигурява следното предимство при кодирането.

  • Повторна употреба на кода
  • Намален размер на кода
  • Лесен поток на управление
  • Намалена сложност

Диаграмата по-долу показва нагледно концепцията за зацикляне

Oracle PL/SQL LOOP

В горната диаграма условието за цикъл ще бъде проверено и докато условието за цикъл е изпълнено, блокът за изпълнение ще бъде изпълнен.

Във всяка итерация променливата на брояча на цикъла, която действително решава условието на цикъла, трябва да се промени, за да накара контролния изход от цикъла. В някои случаи тази променлива на брояча на цикъл е оператор за увеличаване/намаляване за предварително дефиниран брой, а в някои случаи е условие за търсене, което продължава да изпълнява блока, докато не го удовлетвори.

Изявления за контрол на контура

Преди да научите концепцията за циклите, е задължително да научите операторите за контрол на цикъла. Инструкциите за контрол на цикъл са тези, които всъщност контролират потока на изпълнение вътре в цикъла. По-долу е подробното описание на изразите за контрол на цикъла.

ПРОДЪЛЖАВАТ

Тази ключова дума изпраща инструкция до PL/SQL машината, че когато PL/SQL машината срещне тази ключова дума в цикъла, тя ще пропусне оставащия код в блока за изпълнение на кода и следващата итерация ще започне незабавно. Това ще се използва главно, ако кодът вътре в цикъла иска да бъде пропуснат за определени стойности на итерация.

ИЗХОД / ИЗЛЕЗ КОГА

Тази ключова дума изпраща инструкция към PL/SQL машината, че когато PL/SQL машината срещне тази ключова дума, тя веднага ще излезе от текущия цикъл. Ако PL/SQL машината срещне EXIT във вложен цикъл, тогава тя ще излезе от цикъла, в който е била дефинирана, т.е. във вложени цикли, даването на EXIT във вътрешния цикъл ще излезе само от контрола от вътрешния цикъл, но не от външния контур. 'EXIT WHEN' е последвано от израз, който дава булев резултат. Ако резултатът е TRUE, контролата ще ИЗЛЕЗЕ.

GOTO

Този оператор ще прехвърли контрола към етикетирания оператор (“GOTO ;”). Това има следните ограничения

  • Прехвърлянето на контрол може да се извърши само в рамките на подпрограмите.
  • Прехвърлянето на контрол не може да се извърши от частта за обработка на изключения към частта за изпълнение

Използването на този израз не се препоръчва, освен ако няма други алтернативи, тъй като проследяването на контрола на кода ще бъде много трудно в програмата поради прехвърлянето на контрол от една част към друга част.

Видове цикъл в PL/SQL

PL / SQL осигурява следните три вида цикли

Основен оператор за цикъл

Този оператор за цикъл е най-простата структура на цикъл в PL/SQL. Блокът за изпълнение започва с ключовата дума „LOOP“ и завършва с ключовата дума „END LOOP“.

Условието за изход трябва да бъде дадено вътре в този блок за изпълнение, така че да контролира излизането от цикъла.

Необходимо е ключовата дума EXIT да бъде дадена изрично в частта за изпълнение, за да излезете от цикъла.

Основен оператор за цикъл

 LOOP
<execution block starts>
<EXIT condition based on developer criteria> 
<execution_block_ends>
END LOOP;

Обяснение на синтаксиса:

  • В горния синтаксис ключовата дума 'LOOP' маркира началото на цикъла, а 'END LOOP' маркира края на цикъла.
  • Блокът за изпълнение съдържа целия код, който трябва да бъде изпълнен, включително условието EXIT.
  • Частта за изпълнение може да съдържа произволен оператор за изпълнение.

Забележка: Основният оператор за цикъл без ключова дума EXIT ще бъде БЕЗКРАЙЕН ЦИКЛ, който никога няма да спре.

Пример 1: В този пример ще отпечатаме число от 1 до 5, като използваме основен оператор за цикъл. За целта ще изпълним следния код.

Основен оператор за цикъл

DECLARE 
a NUMBER:=1; 
BEGIN
dbms_output.put_line('Program started.');
LOOP
dbms_output.put_line(a);
a:=a+1;
EXIT WHEN a>5;
END LOOP;
dbms_output.put_line('Program completed');
END:
/

Обяснение на кода:

  • Кодов ред 2: Деклариране на променливата 'a' като тип данни 'NUMBER' и инициализиране със стойност '1'.
  • Кодов ред 4: Отпечатване на съобщението „Програмата стартира“.
  • Кодов ред 5: Ключовата дума 'LOOP' маркира началото на цикъла.
  • Кодов ред 6: Отпечатва стойността на 'a'.
  • Кодов ред 7: Увеличава стойността на 'a' с +1.
  • Кодов ред 8: Проверява дали стойността на 'a' е по-голяма от 5.
  • Кодов ред 9: Ключовата дума 'END LOOP' маркира края на блока за изпълнение.
  • Кодът от ред 6 до ред 8 ще продължи да се изпълнява, докато 'a' достигне стойност 6, тъй като условието ще върне TRUE и контролата ще ИЗЛЕЗЕ от цикъла.
  • Кодов ред 10: Отпечатване на съобщението „Програмата е завършена“

Етикетиране на контури

В PL/SQL циклите могат да бъдат етикетирани. Етикетът трябва да бъде ограден между “<<” и “>>”. Етикетирането на цикли, особено във вложени кодове на цикли, ще даде повече четливост. Етикетът може да бъде даден в команда EXIT за излизане от този конкретен цикъл. Използвайки етикет, контролът може да бъде направен така, че да излиза директно от външния цикъл на вложените цикли от произволно място вътре в циклите, като се даде командата за изход, последвана от етикет на външен цикъл.

Етикетиране на контури

<<OUTER_LOOP>>
LOOP 
	<execution_block_starts>
	.
	<<INNER_LOOP>>
	LOOP --inner
		<execution_part>
	END LOOP;
	.
	<executi_block_ends>
END LOOP;

Обяснение на синтаксиса:

  • В горния синтаксис изходящият цикъл има още един цикъл вътре в него.
  • „< >' и '< >' са етикетите на тези цикли.

Пример 1: В този пример ще отпечатаме число, започващо от 1, като използваме Basic оператор за цикъл. Всяко число ще бъде отпечатано толкова пъти, колкото е стойността му. Горната граница на серията е фиксирана в частта за декларация на програмата. Нека научим как можем да използваме концепцията за етикет, за да постигнем това. За целта ще изпълним следния код

Етикетиране на контуриЕтикетиране на контури

DECLARE
a NUMBER:=0;
b NUMBER;
upper-limit NUMBER :=4;
BEGIN
dbms_output.put_line(‘Program started.' ); 
«outerloop»‭	‬
LOOP 
a:=a+1;
b:=l;
«inner loop»
LOOP
EXIT outer_loop WHEN a > upper_limit;
dbms_output.put_line(a);
b:=b+l;
EXIT inner_loop WHEN b>a;
END LOOP;
END LOOP;
dbms_output.put_line('Program completed.');
END;
/

Обяснение на кода:

  • Кодов ред 2-3: Деклариране на променливите 'a' и 'b' като тип данни 'NUMBER'.
  • Кодов ред 4: Деклариране на променливата 'upper_limit' като тип данни 'NUMBER' със стойност '4'
  • Кодов ред 6: Отпечатване на съобщението „Програмата стартира“.
  • Кодов ред 7: Външният контур е означен като „outer_loop“
  • Кодов ред 9: Стойността на 'a' се увеличава с 1.
  • Кодов ред 11: Вътрешният цикъл е означен като „inner_loop“.
  • Кодов ред 13: Условие EXIT, което проверява дали стойността „a“ е по-висока от стойността „upper_limit“. Ако не, тогава ще отиде по-далеч, в противен случай излиза директно от външния цикъл.
  • Кодов ред 14: Отпечатване на стойността на „b“.
  • Кодов ред 15: Увеличава стойността на 'b' с +1.
  • Кодов ред 16: Условие EXIT, което проверява дали стойността на 'b' е по-висока от 'a'. Ако е така, то ще излезе от управлението от вътрешния цикъл.
  • Кодов ред 14: Отпечатване на съобщението „Програмата е завършена“

Oбобщение

Контур Основен цикъл
Критерии за ИЗХОД Излезте, когато срещнете ключовата дума 'EXIT' в частта за изпълнение
употреба Добре е да се използва, когато излизането не се основава на конкретно условие.