sobota, 20 listopada 2010

Kurs Oracle PL/SQL. Pętle


Kiedy potrzebujemy jakąś czynność wykonać wielokrotnie, stosujemy pętle. Najprostszą pętlą jest pętla LOOP.

LOOP


Prezentowana niżej pętla nie posiada warunku wyjścia, będzie się wykonywać w nieskończoność lub do momentu wystąpienia jakiegoś błędu jak to widać w logu. Powtarzane są instrukcje znajdujące się pomiędzy klauzulami LOOP oraz END LOOP.





Aby pętla mogła się kiedyś zakończyć, musimy podać jej warunek wyjścia w jednej z dwóch form. Korzystając z klauzuli EXIT WHEN:


 
lub stosując warunek IF THEN z klauzulą EXIT:


WHILE


Pętla WHILE działa podobnie do pętli LOOP. W tym przypadku najpierw podajemy warunek wyjścia. Z Oraclowego na nasze poniższa konstrukcja oznacza „do czasu aż zmienna x jest mniejsza niż 20, wykonuj następujące czynności”. Musimy zwrócić uwagę by warunek został spełniony, inaczej pętla nam się „zawiesi”.
 


Po klauzuli WHILE podajemy warunek który określa stan dla którego pętla ma być wykonywana. Częstym błędem jest wstawianie tutaj warunku który ma spowodować wyjście. Działa to nieco „na opak” i warto zwrócić na to uwagę. Tą pętlę można również przerwać przy pomocy polecenia EXIT lub znanego ze zwyczajnej pętli LOOP warunku EXIT WHEN.


Pętla FOR


Pętlę tą stosuje się gdy wiemy ile dokładnie razy ma zostać wykonana. Możemy dokładnie określić liczbę jej powtórzeń. Można ten sam efekt uzyskać również przy pomocy pętli WHILE lub LOOP stosując iterator i warunek wyjścia, ale taka konstrukcja byłaby znacznie mniej czytelna i „aż prosi się o problemy” z tego powodu że musiałby być zastosowany jeden warunek wymagany dla tych pętli, oraz drugi od którego w rzeczywistości uzależnialibyśmy zakończenie powtórzeń pętli.
W poniższym przykładzie zaprezentowałem pętle typu FOR która ma zostać wykonana 6 razy. Proszę zauważyć, że zmienna „iterator” która powiększa się po każdym obrocie pętli nie jest wcześniej deklarowana. Zasięg tej zmiennej to wyłącznie pętla i nie możemy się do niej odnosić poza blokiem pętli.
Ponownie z oraclowego na nasze : „for iterator in 1..6 loop”oznacza „dopóki zmienna o nazwie iterator ma wartość zawartą w zbiorze od 1 do 6 wykonuj poniższe czynności. Iterator zwiększa się o jeden przy każdym cyklu. 


Domyślnie przy deklaracji zakresu najpierw podaje się wartość mniejszą a następnie większą a wartość iteratora maleje z każdym cyklem. Możemy to odwrócić stosując klauzulę REVERSE. W takim wypadku wartość iteratora będzie się zmniejszać.
(!) Kolejny często popełniany błąd: podawanie zakresu poczynając od wartości większej. Taka deklaracja spowoduje że pętla nie wykona się ani razu. Program zostanie skompilowany i programista nie zostanie poinformowany o tego typu błędzie, dlatego o tym piszę i dlatego trzeba na to uważać.


 
Tak jak i we wcześniej prezentowanych pętlach, także i tutaj możemy skorzystać z polecenia EXIT lub EXIT WHEN.





Ten temat omawiam na poniższych szkoleniach:
• Programowanie w PL/SQL
• Podstawy SQL i PL/SQL
Możesz w nich uczestniczyć, a jako czytelnik tego bloga otrzymasz 10% zniżki - poinformuj o tym fakcie konsultanta.

1 komentarz:

  1. "Domyślnie przy deklaracji zakresu najpierw podaje się wartość mniejszą a następnie większą a wartość iteratora maleje z każdym cyklem."

    Z tego co wiem, wartość iteratora standardowo powinna rosnąć a nie maleć, więc to chyba delikatna pomyłka;)

    OdpowiedzUsuń