PL/SQL Ders14 - Cursor
SQL ifadesi işlendiğinde Oracle context area denilen bir bellek bölgesi oluşturur. Bir cursor işte bu bellek bölgesine işaret eder. Cursor ifadenin işlenmesi için gerekli tüm bilgileri içerir. PL/SQL'de context area, cursor tarafından kontrol edilir. Cursor veri satırlarını ve select ifadeleri üzerindeki bilgileri içerir.
Bir cursor SQL ifadeleri ile döndürülen saturları işlemek , fetch etmek (getirmek) için kullanılır.
İki tip cursor vardır.
- Implicit Cursor (örtülü)
- Explicit Cursor (açık)
Implicit Cursor (örtülü) Oracle tarafından SQL ifade çalıştırıldığında eğer explicit cursor (açık) kullanılmıyorsa otomatik olarak oluşturulur.
INSERT, UPDATE, DELETE gibi DML ifadeleri çalıştırıldığında Oracle tarafından oluşturulan attributeler şunlardır.
- %FOUND : Eğer DML ifadelerinden oluşturulan komutlardan etkilenen bir satır varsa veya select ifadelerinden oluşturulan komutlardan geriye dönen en az bir satır varsa geriye true döndürür. Yoksa false döndürür.
- %NOTFOUND : Eğer DML ifadelerinden oluşturulan komutlardan etkilenen bir satır varsa veya select ifadelerinden oluşturulan komutlardan geriye dönen en az bir satır varsa geriye false döndürür. Yoksa true döndürür.
- %ISOPEN : Implicit cursor için her zaman false döndürür. Çünkü implicit cursorda SQL cursor işlem yapıldıktan sonra hemen kapatılır.
- %ROWCOUNT : DML ifadelerinden oluşturulan komutlarda kaç satırın etkilendiğini geri döndürür.
test.sql
CREATE TABLE test_personel(id int,ad varchar(20)); INSERT INTO test_personel VALUES(1,'enes1'); INSERT INTO test_personel VALUES(2,'enes2'); INSERT INTO test_personel VALUES(3,'enes3'); INSERT INTO test_personel VALUES(4,'enes4'); INSERT INTO test_personel VALUES(5,'enes5'); INSERT INTO test_personel VALUES(6,'enes6'); INSERT INTO test_personel VALUES(7,'enes7'); INSERT INTO test_personel VALUES(8,'enes8'); INSERT INTO test_personel VALUES(9,'enes9'); INSERT INTO test_personel VALUES(10,'enes10');
Worksheet14.sql
DECLARE BEGIN UPDATE test_personel SET id=id+10 WHERE id>5; IF SQL%NOTFOUND THEN dbms_output.put_line('islem basarisiz..'); ELSIF SQL%FOUND THEN dbms_output.put_line('islem basarili..'); END IF; dbms_output.put_line('degistirilen satir sayisi : '||SQL%ROWCOUNT); END;
Explicit Cursor (açık)
Explicit Cursor (açık) programcı tarafından context area üzerinde daha fazla kontrole sahip olmak için tanımlanır. Bu cursor PL/SQL bloğunun declaration kısmında tanımlanmalıdır.
3. Cursorla veri çekme
4. Cursoru kapatma
Cursor ile işlemler 4 aşamada gerçekleşir.
- Cursor oluşturma
- Cursoru açma
- Cursorla veri çekme
- Cursoru kapatma.
1. Cursor oluşturma
CURSOR cursorIsmi IS SelectSorgusu; |
2. Cursoru açma
OPEN cursorIsmi;
|
3. Cursorla veri çekme
FETCH cursorIsmi INTO
degiskenListesi
|
4. Cursoru kapatma
CLOSE cursorIsmi; |
Worksheet14_2.sql
DECLARE id test_personel.id%type; ad test_personel.ad%type; CURSOR crsr IS SELECT * FROM test_personel; BEGIN OPEN crsr; LOOP FETCH crsr into id,ad; EXIT WHEN crsr%notfound; dbms_output.put_line(id || ' ' || ad ); END LOOP; CLOSE crsr; END;
Yorumlar
Yorum Gönder