Bir veya birden fazla işlem satırını, bir koşula bağlı olarak, belirli sayıda veya bir koşul sağlandığı sürece tekrarlayarak çalıştıran kalıplara döngü adı verilir. Yani aşağıda görünen şekil gibi koşulumuz sağlanıyorsa döngümüz devam edecek sağlanmıyorsa döngü sonlanacaktır.

PL/SQL Döngüler - PL/SQL LOOPS

Döngü Tipi Açıklama
PL/SQL Basic LOOP PL/SQL Temel LOOP yapısında koşulumuz sağlanmadığında loop içinden çıkma komutu ile döngümüzü bitiririz.
PL/SQL While LOOP WHILE LOOP mantığında ise basic loop ile aynı şekilde çalışır fakat burada şart sağlanmadan loop içine giremezsiniz basic loop içerisinde 1 defa girilmiş oluyor.
PL/SQL FOR LOOP FOR LOOP yapısında belirlediğimiz sayıda loop içinde dönebiliriz.
PL/SQL Nested loop İç içe loop kullanımı gerçekleştirebilriz.

PL/SQL Basic LOOP

Sintaksis aşagıdaki gibidir.Koşulumuz saglandıgı sürece döngü çalışmaya devam eder.

LOOP
	çalıştırılacak_komut
END LOOP;
DECLARE
   x number := 10;
BEGIN
-- Döngüye başla
   LOOP
      -- x in değerini ekrana basıyoruz
      dbms_output.put_line(x);
      x := x + 10;
      -- x 50 den büyükse döngüden çık
      IF x > 50 THEN
        exit;
      END IF;
   END LOOP;
   -- çıkış(exit) işleminden sonra x in değerini yazdır
   dbms_output.put_line('Çıkıştan sonra x in değeri : ' || x);
END;
/

IF şartının içindeki EXIT yerine EXIT WHEN ifadesinide kullanabiliriz.Örnegin;

DECLARE
   x number := 10;
BEGIN
-- Döngüye başla
   LOOP
      -- x in değerini ekrana basıyoruz
      dbms_output.put_line(x);
      x := x + 10;
      -- x 50 den büyükse döngüden çık
      exit WHEN x > 50;
   END LOOP;
   -- çıkış(exit) işleminden sonra x in değerini yazdır
   dbms_output.put_line('Çıkıştan sonra x in değeri : ' || x);
END;
/

PL/SQL While LOOP

Sintaksis aşagıdaki gibidir. While LOOP yapısının en önemli farkı şart sağlanmadan loop içine giremezsiniz basic loop içerisinde 1 defa girilmiş oluyor.

WHILE koşul  LOOP
	çalıştırılacak_komut
END LOOP;
DECLARE
   x number := 10;
BEGIN
-- x 50 den küçük olma koşulu sağlandığı sürece döngüyü
WHILE  (X < 50)
   LOOP
      -- x in değerini ekrana basıyoruz
      dbms_output.put_line(x);
      x := x +10 ;
   END LOOP;
   -- döngünün ardından x in değerini yazdır
   dbms_output.put_line('Döngüden sonra x in değeri : ' || x);
END;
/

PL/SQL FOR LOOP

FOR LOOP yapısıyla dögüyü belirli sayıda çalıştırırız.Sintaksisi aşagıdaki gibidir.

NOT : FOR LOOP ile çok sık kullanılacak iki nokta (..) ifadesine bakalım. (..)  sayesinde döngünün iki sayı arasındaki değerleri belirtmeden gerektiği kadar dönmesini sağlar.

FOR degişken  IN başlangıç_degeri .. bitiş_degeri LOOP
	çalıştırılacak_komut;
END LOOP;
DECLARE
   a number(2);
BEGIN
 -- a değeri 10 dan başlayıp 20 de dahil sayısınca dönmesini sağlar
   FOR a in 10 .. 20 LOOP
       -- a nın değerini her seferinde ekrana yazdır
       dbms_output.put_line('value of a: ' || a);
  END LOOP;
END;
/

NOT : REVERSE kelimesini kullanarak ilk degerin ve ikinci degerin yerini degiştirebiliriz.Örnegin;

DECLARE
   a number(2);
BEGIN
/* a değeri REVERSE kelimesi sayesinde 20 dan başlayıp 10 de dahil sayısınca dönmesini sağlar*/
   FOR a in REVERSE 10 .. 20 LOOP
       -- a nın değerini her seferinde ekrana yazdır
       dbms_output.put_line('value of a: ' || a);
  END LOOP;
END;
/

PL/SQL Nested loop

Aşagıdaki sintaksisleri kullanarak istediğimiz kadar iç içe döngü kullanabiliriz.

LOOP
	Sequence of statements1
	LOOP
		Sequenceofstatements2
	END LOOP;
END LOOP;
WHILE condition1  LOOP
	sequence_of_statements1
	WHILE condition2 LOOP
		sequence_of_statements2
	END LOOP;
END LOOP;
FOR counter1 IN initial_value1 .. final_value1 LOOP
	sequence_of_statements1
	FOR counter2 IN initial_value2 .. final_value2 LOOP
		sequence_of_statements2
	END LOOP;
END LOOP;
DECLARE
	x number :=0;
	y number :=0;
BEGIN
	WHILE (x<100) LOOP
		WHILE (y<10) LOOP
			dbms_output.put_line(x+y);
			y:=y+1;
		END LOOP;
		y:=0;
		x:=x+10;
	END LOOP;
END;
/

PL/SQL Koşul Kontrolleri

PL/SQL de koşul kontrollerini aşağıdakiler gibi yapabiliriz.

Kontrol İfadesi Açıklama
EXIT EXIT kullanarak, koşullu deyimin ve gövdenin geri kalanındaki kodun atlanması sağlanabilir. Böylece döngü acil bir şekilde bitirilmiş olur. Döngü içinde bir EXIT ile karşılaşıldığında döngü bitirilir ve kontrol döngüden sonra gelen ifadeye geçer.
CONTINUE EXIT komutunun, döngüyü kırmak için olduğundan bahsetmiştik. Bunun dışında işlem yapmadan döngüyü devam ettirmek gibi durumlara da ihtiyacımız vardır. Bunun içinde continue komutunu kullanırız.
GOTO Koyacağınız etiketler sayesinde, programın bir noktasından bir başka noktasına atlamanızı sağlar.GOTO, bir döngü değildir ancak döngü olarak kullanılabilir. GOTO, çalışabilmek için etiketlere ihtiyaç duyar.

GOTO deyimi tek başına da kullanılabilir. Fakat mantıksal bir sınama olmadan, goto yapısını kullanmanız, sonsuz döngüye neden olacaktır.

 

EXIT

PL/SQL Döngüler - PL/SQL LOOPS - PL/SQL EXIT

DECLARE
	a NUMBER(2) := 10 ;
BEGIN
	--a 20 olana kadar devam edecek
    LOOP
		dbms_output . put_line ( 'value of a: ' || a );
		a   := a + 1 ;
		IF a > 15 THEN
        --EXIT ifadesiyle birlikte LOOP a bakmadan dongu sonlandi
		EXIT ;
        END IF ;
	END LOOP ;
END ;
/
DECLARE
	a NUMBER(2) := 10 ;
BEGIN
	--a 20 olana kadar devam edecek
    WHILE a< 20 LOOP
		dbms_output . put_line ( 'value of a: ' || a );
		a   := a + 1 ;
		--EXIT ifadesiyle birlikte LOOP a bakmadan dongu sonlandi
		EXIT WHEN a > 15;
	END LOOP ;
END ;
/

CONTINUE

PL/SQL Döngüler - PL/SQL LOOPS - PL/SQL CONTINUE

DECLARE
   a   NUMBER (2) := 10;
BEGIN
   WHILE a < 20 LOOP
      DBMS_OUTPUT . put_line ( 'value of a: ' || a );
      a   := a + 1;
      IF a = 15 THEN
		a := a + 1;
          CONTINUE;
        END IF;
      END LOOP;
END;
/

GOTO

PL/SQL Döngüler - PL/SQL LOOPS - PL/SQL GOTO

DECLARE
   a   NUMBER (2) := 10;
BEGIN
  <<loopstart>>
   WHILE a < 20 LOOP
      DBMS_OUTPUT . put_line ( 'value of a:'|| a );
      a   := a + 1;
      IF a = 15 THEN
        a := a + 1;
        GOTO loopstart;
      END IF;
    END LOOP;
END;
/

Yararlı olması Dilegiyle …
Yazar : Mustafa Bektaş Tepe

Kaynaklar;
http://www.tutorialspoint.com/plsql/plsql_basic_syntax.htm
https://developersdaily.wordpress.com
http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/
https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/toc.htm
https://oracle-base.com/articles/misc/introduction-to-plsql

6,699 total views, 2 views today