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.
11 |
<kullanıcı tanımlı hata yakalama isimleri>] |
19 |
<hata durumu komutları>] |
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.
002 |
<p>isbastar date; <br> |
003 |
isi varchar2(80) := 'tezgahtar' ;<br> |
004 |
isci_bulundu boolean; <br> |
005 |
maas_artisi constant number(3,2) := 1.5; <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ç in tablonun 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> |
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 |
036 |
FOR sayac IN [REVERSE] başlangıç..bitiş |
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ç in veritabanı tarafından otomatik olarak açılan imleçlerdir. Yazılan her SQL iç in , SQL’ in yazım kontrollerini yapmak ve SQL’i çalıştırmak iç in hafızadan bir yer ayrılır. Bu ayrılan yer iç in standart 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 |
068 |
Silinen_kayit_sayisi number(5); |
076 |
silinen_kayit_sayisi:=SQL%ROWCOUNT; |
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 |
098 |
CURSOR <imleç adı> [(<parametre listesi>)] IS |
102 |
Kayıt_tipi_değişkeni <imleç adı>%ROWTYPE |
114 |
FETCH <imleç adı> INTO kayıt_tipdeğişkeni; |
116 |
EXIT WHEN <imleç adı>%NOTFOUND; |
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; |
130 |
CURSOR c2 RETURN bolum%ROWTYPE IS SELECT * FROM bolum WHERE bolumno = 10; |
132 |
CURSOR c3 (verilen_tarih DATE) IS |
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> |
Ders Sahibi;
Bilgisayar Dershanesi
Yorumlar
Yorum Yapabilmek İçin
Üye Girişi Yapmanız Gerekmektedir.
ETİKETLER