Üye Kayıt Üye Giriş

Oracle Veritabanına Kuşbakışı – 7.Ders


Oracle Veritabanına Kuşbakışı – 7.Ders

 

 

PL/SQL Bloklarının Yapısı

PL/SQL blok yapılı bir dildir. Her bir blok bir program ünitesini oluşturur. Pl/SQL blokları prosedür, fonksiyon ve normal blok olarak üçe ayrılır. Prosedür ve fonksiyon yapısı ileride ele ele alınmıştır. Şimdi burada normal bir blok yapısı işlenecektir. Bir PL/SQL bloğu seçimlik bir tanımlama bölümü, PL/SQL cümlelerinin yazıldığı bir bölüm ve hata yakalama bölümünden oluşur. Bloklara isim vermek zorunlu değildir. Eğer hazırlanan bir blok yeniden kullanılmak istiyorsa .sql uzantılı dosyalara saklanıp yeniden kullanılabilir.

* “[“ ve “]” işaretleri arasındaki alanların yazılması zorunlu değildir.

01 [<blok  başlığı>]
02  
03 [DECLARE
04  
05 <sabitler>
06  
07 <değişkenler>
08  
09 <imleçler>
10  
11 <kullanıcı tanımlı hata yakalama isimleri>]
12  
13 BEGIN
14  
15 <PL/SQL komutları>
16  
17 [ EXCEPTION
18  
19 <hata durumu komutları>]
20  
21 END;

Blok başlığı PL/SQL bloğunun prosedür, fonksiyon veya bir paket bloğu olup olmadığını belirler. Eğer bir başlık tanımlanmazsa bu isimsiz blok(anonymous) olarak adlandırılır. “Declare” kısmı diğer programlama dillerinde olduğu gibi değişken ve sabitlerin tanımlandığı kısımdır.

PL/SQL blokları içerisinde kullanılan tüm sabitler, değişkenler, imleçler ve kullanıcı tanımlı hata durumları “declare” kısmında tanımlanmalıdır. Burada sabit ve değişkenler şöyle tanımlanabilir:

1 <değişken adı> [constant] <veri tipi> [not null] [:= <ilk değer>];

SQL’de kullanılan tüm veri tipleri(SQL bölümünde anlatılmıştı) ve Boolean veri tipi burada kullanılabilir. Boolean tipte bir değişken “true”, “false” ve “null” değerlerini alabilir. “not null” yan cümlesi değişkenin mutlaka bir değer alması gerektiğini bildirir. Burada tanımlanan değişkenlere “:=” operatörü ile ilk değer atanabilir. Eğer bir ilk değer atanmazsa değişkenlerin alacağı ilk değer “null” ‘dur. Eğer “constant” ile tanımlama yapılırsa değişkenin değeri değiştirilemez.

001 <pre>DECLARE</pre>
002 <p>isbastar                         date;                           /* ilk değeri “null” */<br>
003 isi                     varchar2(80) := 'tezgahtar';<br>
004 isci_bulundu      boolean;                                   /* ilk değeri “null” */<br>
005 maas_artisi       constant number(3,2) := 1.5;      /* sabit */<br>
006 BEGIN ... END;<br>
007 Tanımlama kısmında değişkenlere bir veri tipi vermek yerine bir tablodaki bir alanın veri tipi değişkene aktarılabilir. Örneğin “isci.iscino%TYPE” şeklinde bir tanımlama ilgili değişkenin “isci” tablosundaki “iscino” değişkeni ile aynı veri tipinde olmasını sağlar. Tek bir değişken içintablonun bir alanının veri tipini almak yerine tablonun tüm alanlarının veri tipleri bir değişkene aktarılabilir. Örneğin “isci%ROWTYPE” ile istenen değişkene tablonun yapısı aynen aktarılabilir. Buna tıpkı Pascal’daki gibi “record” veri tipi denir. Burada eğer “tablo isci%ROWTYPE” şeklinde bir tanımlama yapılırsa tablo.iscino ya da tablo.isciadi şeklinde değişkenler kullanılabilir. Bu tür bir tanımlama imleç kullanırken kolaylık sağlar.</p>
008 <p>PL/SQL blokları içerisinde gerçekleştirilecek işlemler begin..end kelimeleri arasına yazılır. Burada dikkat edilmesi gereken bir husus vardır: PL/SQL blokları içerisinde veri tanımlama dili komutları(yani Create Table, Alter TableSpace, Drop User gibi) ve veri kontrol dili komutları(grant ve revoke gibi) kullanılamaz. Pl/SQL blokları içerisinde veri işleme dili komutları kullanılabilir. (Select, Update, Delete, Insert gibi) .</p>
009 <p>Hata durumları ya da aykırı durumlar olarak adlandırılan “exceptions” kısmında PL/SQL blokları arasında gerçekleşen bazı hataları kullanıcıya yansıtmadan kontrol etme ve gerekli işlemleri yapma olanağı vardır. Oracle tarafından tanımlanmış hata durumları olduğu gibi programcılar da hata durumları tanımlayabilirler.</p>
010 <h2>PL/SQL Akış Kontrolü</h2>
011 <p>Pl/SQL blokları içerisinde kosullu-koşulsuz dallanmalar ve döngüler kullanılabilir. Bu amaçla kullanılan yapıları burada inceleyeceğiz. PL/SQL’de iki tip kontrol yapısı vardır. Brincisi “IF” kontrol yapısı ve diğer “LOOP “ kontrol yapısı.</p>
012 <h3>IF Kontrol Yapısı</h3>
013 <p>PL/SQL içerisinde üç tip “IF” yapısı kullanılır:</p>
014 <p>1-) IF şart THEN                                    2-)IF şart THEN                                        3-)IF şart THEN</p>
015 <p>Komutlar                                  komutlar                                              komutlar</p>
016 <p>END IF                                ELSE                                                         ELSEIF şart</p>
017 <p>Şartın gerçekleşmemesi                                    komutlar</p>
018 <p>halindeki komutlar                            ENDIF</p>
019 <p>END IF</p>
020 <h3>LOOP Kontrol Yapısı</h3>
021 <p>PL/SQL içerisinde temel LOOP, FOR ve WHILE döngüleri vardır.</p>
022 <pre class="brush:csharp">LOOP
023  
024 Komut1
025  
026 .....
027  
028 KomutN
029  
030 GOTO etiket adı
031  
032 EXIT [WHEN şart]
033  
034 END LOOP
035  
036 FOR sayac IN [REVERSE] başlangıç..bitiş
037  
038 LOOP
039  
040 Komut1
041  
042 ...
043  
044 KomutN
045  
046 EXIT [WHEN şart]
047  
048 END LOOP
049  
050 WHILE şart LOOP
051  
052 Komut1
053  
054 ...
055  
056 KomutN
057  
058 END LOOP</pre>
059 <h2>İmleçler</h2>
060 <p>Birden fazla kaydın hafızaya getirilme işlemlerine imleç(cursor) açma denir. İmleç açma, özellikle veritabanındaki tablolardan kayıtların teker teker getirilmesinde faydalı olmaktadır. Kayıtlar teker teker getirilerek üzerinde işlemler yapılıp tekrar veritabanına kaydedilebilmektedir. Oracle, hafızada bu tip işlemleri yapabilmek için yer ayırmaktadır. İki çeşit imleç vardır:</p>
061 <p><strong>Kapalı İmleçler(Implicit Cursors):</strong> Yazılan her SELECT, INSERT, UPDATE ve DELETE komutları içinveritabanı tarafından otomatik olarak açılan imleçlerdir. Yazılan her SQL için, SQL’inyazım kontrollerini yapmak ve SQL’i çalıştırmak içinhafızadan bir yer ayrılır. Bu ayrılan yer içinstandart olarak tanımlanan imlece kapalı imleç denir.PL/SQL blokları arasında yazılan SQL komutları için, tanımlanan kapalı imlece ait özellikler geçerli olmaktadır. Yazılan her SQL için tanımlanan kapalı imleçlerin şu özellikleri kullanıma açıktır:</p>
062 <p>SQL%ISOPEN : SQL sonucu eğer imleç açık ise “true” değeri, kapalı ise “false” değeri döndürür.</p>
063 <p>SQL%ROWCOUNT : SQL cümlesi tarafında işlem gören kayıt sayısnı görüntüler.</p>
064 <p>SQL%FOUND : SQL sonucu en az bir kayıt işlem görmüşse “true”, hiç kayıt işlem görmemişse “false” döndürür.</p>
065 <p>SQL%NOTFOUND : SQL sonucu eğer hiçbir kayıt işlem görmemişse “true”, en az bir kayıt işlem görmüşse “false” değeri dödürür.</p>
066 <pre class="brush:csharp">DECLARE
067  
068 Silinen_kayit_sayisi       number(5);
069  
070 BEGIN
071  
072 delete from isci
073  
074 where bolum=10;
075  
076 silinen_kayit_sayisi:=SQL%ROWCOUNT;
077  
078 END;
079  
080 DECLARE
081  
082 delete from isci
083  
084 where bolum=10;
085  
086 if SQL%FOUND then
087  
088 commit;
089  
090 else
091  
092 rollback;
093  
094 END;</pre>
095 <p><strong>Açık İmleçler(Explicit Cursor):</strong> Kullanıcı tarafından belirli bir işi yapabilmek için açılan imleçlerdir. Özellikle fazla sayıda kayıtların bulunduğu tablolarda, silme, güncelleme ve benzer işlemlerde çok kullanışlı program parçalarıdır.</p>
096 <pre class="brush:csharp">DECLARE
097  
098 CURSOR <imleç adı> [(<parametre listesi>)] IS
099  
100 SQL cümlesi
101  
102 Kayıt_tipi_değişkeni      <imleç adı>%ROWTYPE
103  
104 Değişken_1       NUMBER;
105  
106 Değişken_2       NUMBER;
107  
108 BEGIN
109  
110 OPEN <imleç adı>
111  
112 LOOP
113  
114 FETCH <imleç adı> INTO kayıt_tipdeğişkeni;
115  
116 EXIT WHEN <imleç adı>%NOTFOUND;
117  
118 ........
119  
120 komutlar;
121  
122 END LOOP;
123  
124 CLOSE <imleç adı>;
125  
126 END;</pre>
127 <p>Burada imleç adı PL/SQL blokları içerisinde başka bir değişken adı olarak kullanılıyor olmamalıdır. Parametreler “<parametre adı> <veri tipi>” şeklinde bildirilmelidir. PL/SQL içerisinde kullanılan tüm veri tipleri parametreler için kullanılabilir.(char, varchar2, number, date, boolean ya da number veri tipinin integer, real gibi alt veri tipleri). Aşağıda farklı şekillerde açılmış imleç örnekleri verilmiştir:</p>
128 <pre class="brush:csharp">CURSOR c1 IS SELECT iscino, isciadi, isi, ucret FROM isci WHERE ucret > 2000;
129  
130 CURSOR c2 RETURN bolum%ROWTYPE IS  SELECT * FROM bolum WHERE bolumno = 10;
131  
132 CURSOR c3 (verilen_tarih DATE) IS
133  
134 SELECT iscino, ucret FROM isci WHERE isbastar > verilen_tarih;</pre>
135 <p>Eğer bir imleç açıldığında kayıtlar üzerinde değişiklik yapılacaksa, imleç tanımından sonra “for update[(<sütun(lar)>)]” şeklinde tanımlama yapılmalıdır. Böyle bir tanımlama yapıldığında imleç içerisindeki kayıtlar kilitlenir ve “commit” komutu uygulanana kadar diğer kullanıcılar bu kayıtlara erişemez.</p>
136 <h3>Hata Durumları</h3>
Bilgisayar Dershanesi Ders Sahibi;
Bilgisayar Dershanesi

Yorumlar

Yorum Yapabilmek İçin Üye Girişi Yapmanız Gerekmektedir.

ETİKETLER