Veri Tabanı Yönetim Sistemleri (VTYS), birbirleriyle ilişkili veri ve programlar topluluğundan oluşmaktadır.

Veri topluluğu bir "veri tabanı" olarak değerlendirilir. Veri tabanı, bir kuruluşa ilişkin bilgilerin yer aldığı ortamdır. Veri tabanı

1

sistemleri, veri kümelerinin düzenli biçimde tutulduğu ve bu verilerin çeşitli yazılımlar aracılığıyla yönetildiği ortamlardır. Bu derste “veri tabanı programlama” konusunda bazı ileri konulara yer verilmektedir. Veri tabanı programlama, özellikle uygulama geliştiricilerin başvurdukları bir yoldur. Bir takım veri tabanı nesneleri bu yolla tanımlanarak, farklı programlarda yeniden kullanılabilmektedir. Özellikle fonksiyonlar, yordamlar ve paketlerin yaratılması önem taşımaktadır. Veri tabanı programlama, veri tabanı bağımlıdır. Bunun anlamı, her veri tabanı yazılımının kendi özel programlama dili bulunmaktadır. Bu derste, ORACLE veri tabanı göz önüne alınmış ve onun PL/SQL veri tabanı programlama dili üzerinde durulmuştur. İleri veri tabanı kavramlarını anlayabilmek için, öncelikle standart veri tabanı dili olan SQL’i iyi bilmek gerekiyor. Bunu sağlamak için dersin ilk dört bölümü SQL’e ayrılmıştır. Kalan bölümlerde ise PL/SQL ile veri tabanı programlaması işlenmektedir.

VERİ TABANI SİSTEMLERİNE VE SQL DİLİNE GİRİŞ
Bu bölümde; • • • • • Klasik Dosya Yapıları Veri Tabanı Sistemleri Veri Tabanı Sistemlerinin Üstünlükleri Veri Modelleri SQL Yapısal Sorgulama Dillerine Giriş

anlatılmaktadır.

Bölüm Hedefi
Bu bölümde veri tabanı sistemlerine kısa bir giriş yapılarak, SQL yapısal programlama dilinin esasları üzerinde durulacak ve aşağıda sıralanan konular incelenecektir: • • • • • • • Klasik dosya yapıları Veri tabanı sistemleri Veri tabanı sistemlerinin üstünlükleri SQL sorgulama diline giriş SELECT deyiminin temel yapısı Aritmetik ifadelerin sorgularda kullanımı Çift satırların denetlenmesi

2

• • • •

Karşılaştırma işleçleri Mantıksal işleçlerin kullanımı İşleçlerin işlem sırası Verinin sıralanması

1.1 Klasik Dosya Yapıları
Bilgisayarların ilk ortaya çıktığından bu yana hem donanım hem de yazılım alanında pek çok değişim ortaya çıkmıştır. Doğal olarak bu değişim, kuruluşların ve kişilerin gereksinimlerine daha iyi cevap verebilmek amacıyla ortaya çıkmaktadır. Pek çok kuruluşta eskiye oranla çok daha fazla veri üretildiğinden, geleneksel veri saklama ve işleme tekniklerinin yetersiz kaldığı gözlemlenmiştir. Veri saklama birimlerinde depolanan veri topluluklarına “dosya” (file) denir.

1.1.1 Kayıt ve Alan
Dosyalar kendi içinde kayıtlara bölünmüştür. Bir sınıftaki öğrenci listesini göz önüne alalım. Bu liste çok sayıda veri içerebilir. O halde, listenin ana bellekte tutulması söz konusu olamaz. Ana bellekte tutulduğu takdirde, bilgisayarın kapatılması durumunda bu bilgiler yok olacaktır. O halde bu verilerin kalıcı bir ortamda, örneğin sabit disk üzerinde yer alması gerekecektir. Disk üzerinde tutulan bu bilgiler, yeni öğrenci eklendiğinde büyüyecek veya çıkarıldığında küçülecektir. Ayrıca zaman zaman içeriği değişecektir. Bu listedeki her bir öğrenci bilgisi bir mantıksal kayıt oluşturur. Her kayıt da farklı bilgiler içerebilir. Örneğin; öğrencinin adı, baba adı, doğduğu yer vb gibi bilgileri içerebilir. Sayılan bu bilgilerin herbirine alan (field) adını veriyoruz.

3

1.1.2 Sıralı Dosyalar
Klasik bilgisayar dosyaları birbirinden bağımsız; muhasebe, stok, pazarlama, üretim ve diğer uygulamalarda kullanılmak üzere hazırlanır. Bu dosyalar, sıralı ya da doğrudan erişim yöntemleri kullanılarak işlenir. Sıralı erişimde, dosyanın tüm kayıtları tek tek taranarak istenilen kayıtlara ulaşılır. Doğrudan erişim yönteminde ise, kayıtlar tek tek sırayla okutulmaz, istenilen kayıda doğrudan erişerek işlenir. Sıralı dosyalar, bir başka deyişle ardışık dosyalar, içerdiği kayıtlara birinci kayıttan başlamak üzere sırayla erişim yapmak üzere tasarlanmış dosyalardır. Bu tür dosyaların kayıtlarına ardışık olarak erişilebilmesine karşılık, kayıtlar fiziksel olarak ardışık olmayabilir. Sıralı dosyaların herbir kayıtına ardışık olarak erişilmesi bazı durumlarda yararlı olmasına rağmen, bazı uygulamalarda sorunlar yaratır.

Örneğin; okuldaki tüm öğrencilerin tümü listelenecek ise, kayıtlara peşpeşe erişim söz konusudur. Bu durumda dosyanın sıralı olarak tasarlanmış olması sorun yaratmaz. Ancak sadece birkaç öğrencinin listelenmesi isteniliyorsa, tüm öğrencilerin okunarak bu listenin elde edilmesi uygun bir yöntem olmayacaktır. Söz konusu öğrencilere doğrudan erişilmesi en uygun yoldur.

1.1.3 İndeksli Dosyalar
Sıralı dosyalar konusunda belirtilen gereksinime karşılık vermek amacıyla doğrudan erişimli dosyalar kullanılır. Bu tür dosyalarda, her bir arama işlemi dosyanın başından itibaren yapılmaz. Belirlenen kayıtlara doğrudan erişilerek üzerinde işlem yapılır.

4

Doğrudan erişimli dosyaların en tanınmışı, indeksli dosyalar olarak bilinir. İndeksli dosyalar veya bir başka deyişle indeks sıralı dosyalar, veri dosyasından ayrı olarak bir indeks dosyasının oluşturulması ile birlikte hazırlanır. Bir dosya için oluşturulan indeks; söz konusu dosyanın anahtarları ile bu anahtarların disk üzerinde bulunduğu adresi içerir. Anahtar alan, erişimde kulanılmak üzere seçilen alan olarak değerlendirilir.

Örneğin; öğrenci dosyasında, öğrenci numarasını içeren alanının indeks alanı olarak tasarlandığını varsayalım. Herhangi bir öğrencinin bilgilerine ulaşmak söz konusu olduğunda; bu numara önce indeks üzerinde aranılarak bulunur ve söz konusu kayıda ilişkin adres bilgisi elde edilerek, bu adrese doğrudan erişilir.

1.1.4 Hesaba Dayalı Dosyalar
Bir diğer doğrudan erişimli dosya türü hesaba dayalı dosyalar (hashed files) olarak bilinir. Bu tür dosyalar, indeksli dosyalar gibi ayrı bir indeksin tutulmasını gerektirmez. Dosyanın herhangi bir kaydına doğrudan doğruya erişebilmek için bir hesaplama algoritması kullanır.

1.2 Veri Tabanı Sistemleri
Karmaşık dosya yapıları ve çok sayıda dosya arası ilişki ve kullanıcıların dosyalara erişimi söz konusu olduğunda, geleneksel dosya sisteminin yetersiz kaldığı görülmüştür. Bu sorunu çözmek üzere, veriyi saklama ve veriye erişim konusunda yeni yazılım teknolojilerine yönelme başlamış ve Veri Tabanı Yönetim Sistemleri (VTYS) yaklaşımı ortaya çıkmıştır.

5

birbirleriyle ilişkili veri ve programlar topluluğundan oluşmaktadır. veriye erişen uygulama programlarından bağımsızdır. 1. Veri tabanı sistemleri. kayıt desenleri ve dosya yapılarında ortaya çıkabilecek en ufak bir değişiklik bile uygulama programlarının değişmesine ve yeniden derlenmesine neden olmaktadır. Veri topluluğu bir “veri tabanı” olarak değerlendirilir. Veri tabanı bir kuruluşa ilişkin bilgilerin yer aldığı ortamdır.3 Veri Tabanı Sistemlerinin Üstünlükleri Veri tabanı kullanımı. Klasik dosya kullanımında ise. veri kümelerinin düzenli biçimde tutulduğu ve bu verilerin çeşitli yazılımlar aracılığıyla yönetildiği ortamlardır. Veri tabanı yönetim sistemleri (VTYS).Veri Tabanı Yönetim Sistemleri (VTYS) yaklaşımında veri girişi ve depolanması. 6 . Veri tabanı sistemleri bilgisayar sistemlerinin önemli bir bileşeni olarak değerlendirilir. geleneksel dosya kullanımına göre birçok yönden üstünlük sağlamaktadır.

7 .

8 .

Son zamanlarda ortaya çıkan Nesneye Yönelik Veri Modeli. kayıtların güncellenmesi. Sayılan bu veri modellerinin ilk ikisi şu anda kullanılmamaktadır.4 Veri Modelleri Veri Tabanı Yönetim Sistemleri belirli bir veri modeline dayanır. Başlıca veri modelleri yandaki animasyonda yer almaktadır. Sayılan bu tür işlemleri yerine getirmek için ilişkisel veri tabanı sistemlerinde SQL yapısal sorgulama dili olanakları kullanılır. İlişkisel Veri Modelidir. bu tablolara kayıt eklenmesi. kayıtların sorgulanması ve bunun gibi işlemlerin yerine getirilmesi gerekecektir. 9 . Veri Modellerini tekrar görmek için TEKRAR düğmesine tıklayınız 1. İlişkisel Veri Modeli ile birlikte bazı VTYS’lerde kullanılmaktadır. kullanılan kavramlar. Günümüzde kullanılan VTYS’lerin hemen hemen tümü ilişkisel veri modeline dayalıdır. Bir veri tabanı yapısının temelini veri modeli kavramı oluşturmaktadır. En yaygın kullanılanı ise.1. Veriyi mantıksal düzeyde düzenlemek için. Örneğin veri tabanı tablolarının yaratılması. Şu ana dek birçok veri modeli geliştirilmiştir. yapılar ve işlemler topluluğuna “Veri Modeli” denir.5 SQL Yapısal Sorgulama Diline Giriş Veri tabanı sistemlerinin oluşturulması ve bu veri tabanı üzerinde çeşitli işlemlerin yapılması söz konusu olacaktır.

10 . SQL 'in kendi özel kelimeleridir ve aynen bu şekilde ifade edilmelidir.1 Sorgulama İşlemleri SQL'de sorgulama işlemleri. SELECT [DISTINCT] { * | sütun.} FROM tablo..5. Tanım içinde bazı SQL anahtar kelimelerine yer verilmektedir.5.1 SELECT Deyiminin Yapısı SELECT deyimi en basit biçimde şu şekilde ifade edilmektedir. SELECT FROM SQL'in sorgulama deyimidir. Hangi tablonun sorgulanacağını ifade eder..1. SELECT deyimi yardımıyla yerine getirilir. . Bu anahtar kelimeler..1. SELECT deyimi temel olarak üç farklı işlemi yerine getirmek için kullanılır: 1.

Seçenekler birbirlerinden | işareti ile ayrılmaktadır.2 SELECT Yazım Kuralları SQL deyimleri düzenlenirken bazı kuralları ve önerileri göz önünde tutmak gerekmektedir. Bunlar SQL sözcüğü değildir. Tanımdaki her bir işaretin veya farklı gösterimin hangi anlama geldiğini aşağıdaki tablodan görebilirsiniz.. kullanıcı tarafından verilen isimleri ifade etmektedir. [] {.. birden fazla seçeneğin varlığını ve bu seçeneklerden birinin mutlaka seçilmesi gerektiğini ifade eder.|. tüm sütunları ifade eder. Tek bir sütunu değil.1.DISTINCT Çift kayıtları önleyen anahtar kelimedir. bu işaretler arasında tanımlanır. Aksi takdirde sorgu hata verir ve çalışmaz. SQL sorgu yazım kurallarını aşağıdaki animasyonu inceleyerek görebilirsiniz. Kullanılması zorunlu olmayan SQL sözcükleri. Altı çizili ve italik olan bu ifadeler. } * 1.5. 11 . Bu biçimde gösterilen ifadeler.

Bölümün adıdır.1. Sütun adı Açıklama Bölüm_no Bölüm_adı Bölüm numarasıdır. SELECT deyimi içinde sütun isimleri yerine. Örnek BÖLÜM isimli tablonun sütunları şunlardır. 12 .3 Tablonun Tüm Satırlarını Seçmek Bir tablonun tüm sütunlarını seçmek söz konusu ise. * işareti kullanılır.5.1.

daha izlenebilir olmasını sağlamak için şu şekilde de yazabiliriz. ! Sorguyu çalıştırmak için "Çalıştır" düğmesine tıklayınız. Sütun isimleri virgüllerle birbirlerinden ayrılır. 13 . Bu tablonun içerdiği tüm verileri görüntülemek istiyoruz.1.Konumu Bölümün bulunduğu yerin adıdır. SELECT deyimi içinde bu sütun isimlerine yer verilir.4 Belirli Sütunların Seçilmesi Tablo içinde belirlenen sütunların elde edilmesi söz konusu ise.5. 1. Bunun için aşağıda belirtilen SELECT deyimi düzenlenir: SELECT * FROM BÖLÜM. Bu deyimi. SELECT * FROM BÖLÜM. Sorgunun nasıl çalıştığını aşağıda görebilirsiniz.

SELECT BÖLÜM. Sorgunun nasıl çalıştığını aşağıda görebilirsiniz. yani BÖLÜM_NO ve BÖLÜM_ADI sütunlarını seçerek görüntülemek istiyoruz. BÖLÜM. 14 . Özellikle birden fazla tablo varsa bu yola başvurulur. Amacımıza uygun SELECT deyimi şu şekilde düzenlenebilir. SELECT BÖLÜM_NO.BÖLÜM_ADI FROM BÖLÜM.BÖLÜM_NO. tablo isimleriyle birlikte ifade edilebilir.Örnek BÖLÜM tablosunun sadece bölüm numaralarını ve bölüm isimlerini içeren sütunlarını. ! Sorguyu çalıştırmak için "Çalıştır" düğmesine tıklayınız. Bunun için. Sütun isimleri. BÖLÜM_ADI FROM BÖLÜM. tablo ismi her bir alanın başına eklenir ve araya bir nokta işareti konur.

Örneğin. sütun isimleri. ÜCRET+1500 FROM PERSONEL. Ayrıca ÜCRET sütununun içerdiği değere. SELECT deyimi içinde bir ifade tanımlandığında. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız.1. ADI. Örnek PERSONEL tablosunun PERSONEL ve ÜCRET isimli iki sütunu listelenecektir. 15 .2 Aritmetik İfadeler Aritmetik ifadeler. SELECT PERSONEL_NO. 1500 değeri eklenerek (yani ücretlere zam yapılıyor) ayrı bir sütun elde etmek istiyoruz. ÜCRET*12 biçiminde bir ifade tanımlanabilir.5. bir tablonun ÜCRET isimli sütunundaki sayısal değeri 12 ile çarpmak için. bu ifade ayrı bir sütun biçiminde yaratılmış olacaktır. sabit sayısal değerler ve aritmetik işleçlerden oluşur. Amacımıza uygun SELECT deyimi aşağıda görüldüğü biçimde düzenlenebilir.

! Aritmetik İşleçleri ve anlamlarını tekrar görmek için TEKRAR düğmesine 1.2.tıklayınız. Örnek 16 .1 Aritmetik İfadelerde İşlem Sırası Aritmetik işleçler.5. SELECT deyiminin FROM sözcüğü dışında herhangi bir yerinde kullanılabilir.

Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız ! Aritmetik İşleçlerin işlem sırasını tekrar görmek için TEKRAR düğmesine tıklayınız. Söz konusu hesaplamayı sağlayan ifade şu şekilde olacaktır. PERSONEL ve ÜCRET isimli iki sütunu listelenecektir. Yıllık ücrete 500 değerini eklemek istiyoruz. ADI.PERSONEL tablosunun. Amacımıza uygun SELECT deyimi şu şekilde olabilir. 17 . SELECT PERSONEL_NO. 12*ÜCRET+500 Buna göre * işlecinin önceliğinden dolayı önce 12 ile ÜCRET çarpılacak ve bulunan değere 500 eklenecektir. 12*ÜCRET+500 FROM PERSONEL. aylık ücret rakamını içermektedir. Burada ÜCRET.

1. 18 . Örnek Önceki kısımdaki örnekte 12*ÜCRET+500 biçiminde bir tanım yaparak. Önce parantez içindeki işlemler gerçekleştirilir.2. aritmetik ifadeler içinde diğer tüm işleçlere göre bir önceliğe sahiptir. Amacımıza uygun ifade şu şekilde olabilir: 12*(ÜCRET+500) Bu durumda. Amacımıza uygun SELECT deyimi şu şekilde olabilir.2 Aritmetik İfadelerde Parantezlerin Kullanımı Parantezler.5. yıllık ücrete zam yapmıştık. ücret sütununun içerdiği değere 500 eklenir ve bulunan değer 12 ile çarpılır. Bu kez aylık ücrete 500 zam yapmak istiyoruz.

12*(ÜCRET+500) FROM PERSONEL. SELECT deyimi çalıştırıldığında bu değerler boş olarak görüntülenir. Örnek 19 . Eğer bir sütun NULL değerler içeriyorsa. NULL Değer.5. bilinmeyen bir değer olarak kabul edilir. ADI. var olmayan.3 Aritmetik İfadelerde NULL Değerlerin Kullanımı NULL Değer. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 1. atanamayan. bir sıfır ya da boşluk olarak da değerlendirilmez.2.SELECT PERSONEL_NO.

Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 1. tanımlanan aritmetik ifade her satır için NULL değerler üretecektir. ÜCRET. ifade ne olursa olsun o satırlarla ilgili sonuç da NULL olarak elde edilir. SELECT deyiminin çalışması sonucu elde edilen listenin sütun başlıkları olacaktır. AS anahtar kelimesi bu amaçla kullanılır.5. deyimi çalıştırıldığında. SELECT ADI. 12*7000+NULL → NULL olduğu unutulmamalıdır. elde edilen sonuçlar yine sütunlar biçiminde olacaktır.KOMİSYON. Örneğin. 20 . KOMİSYON isimli sütunun NULL değerler içerdiği bilinmektedir.Eğer bir aritmetik ifade içinde NULL değer içeren bir sütun varsa. Bunun yerine.3 Sütunlar İçin Takma İsimler Kullanımı SELECT deyimi çalıştırıldığında. çıktı sütunlarına istenilen başlıklar atanabilir. O halde. 12*ÜCRET+KOMİSYON FROM PERSONEL. NULL ile yapılan hesaplamalara dikkat ediniz. Tablonun sütun isimleri. Eğer takma isim birden fazla kelimeden oluşuyorsa tırnak işaretleri arasında belirtilebilir.

Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 21 . ücret sütunu için AYLIK_ÜCRET takma isimlerini atayacağız. Ayrıca yıllık ücreti hesaplayarak bu sütuna da YILLIK_ÜCRET takma ismini vermek istiyoruz.Örnek PERSONEL tablosunun PERSONEL sütunu için İSİM. 12*ÜCRET+KOMİSYON AS YILLIK_ÜCRET FROM PERSONEL. ÜCRET AS AYLIK_ÜCRET. SELECT ADI AS İSİM. Amacımıza uygun SELECT deyimi şu şekilde olabilir.

1. SELECT deyimini ORACLE veri tabanı için şu şekilde düzenleyebiliriz. Örnek Personel adı ve görev bilgisini birleştirerek. Bu işlecin kulllanımı veri tabanlarında farklılık gösterebilir.5. MS Access veri tabanında ise (&) işleci aynı amaçla kullanılır.4 Sütun İçeriklerini Birleştirme Sütunların içerdikleri değerleri. Aynı amaca SELECT deyimini MS Access veri tabanında şu şekilde kullanarak ulaşabiliriz. iki sütun bilgisi arasına "-" işaretini yerleştirmek ve tek sütun biçiminde görüntülemek istiyoruz. Birleştirme işleci olarak (||) simgesi kullanılabilir. SELECT ADI || '-' || GÖREVİ AS ADI_GÖREVİ FROM PERSONEL. birbiriyle ya da bir başka karakter dizisi ile birleştirerek yeni değerler elde edilebilir. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 22 . Örneğin. ORACLE veri tabanında (||). SELECT ADI & "-" & GÖREVİ AS ADI_GÖREVİ FROM PERSONEL.

1. aynı değerlere sahip satırların görüntülenmesi engellenemez. PERSONEL tablosunun BÖLÜM_NO sütunu içerikleri aynen listelenir. SELECT deyimi DISTINCT anahtar kelimesi ile birlikte kullanılır. SELECT DISTINCT BÖLÜM_NO FROM PERSONEL. deyimi çalıştırıldığında. Örneğin. Eğer tekrarlı değerlerin sadece bir tanesinin elde edilmesi söz konusu ise. Bu sütunun içerdiği değerlerin çoğu birbirinin aynı olabilir.5. SELECT BÖLÜM_NO FROM PERSONEL. Örnek 23 .5 Aynı Değere Sahip Satırlar Bir SELECT deyimi çalıştırıldığında.

Bu sözcük SELECT deyimi içinde aşağıda gösterildiği biçimde yer alır.6 Verinin Sınırlandırılması Veri tabanından veriyi alma sırasında. aritmetik ifadeleri veya fonksiyonları içerebilir. literal değerleri. SELECT DISTINCT BÖLÜM_NO FROM PERSONEL.5. Tablonun belirli kısımlarını seçmek için WHERE sözcüğü kullanılır. tablonun tüm satırları yerine bir kısmı elde edilebilir. WHERE sözcüğü içinde tanımlanan koşul. sütun içindeki değerleri.PERSONEL tablosunun BÖLÜM_NO sütunundaki verileri tekrarlatmadan listelemek istiyoruz. satırlara bazı kısıtlamalar koyarak. 24 . Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 1. Bunun için aşağıda belirtilen yol izlenir.

GÖREVİ. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 1.6.1 Karşılaştırma İşleçleri WHERE sözcüğü içinde tanımlanan kısıtlama ifadelerinde. yani koşul ifadelerinde çeşitli karşılaştırma işleçleri kullanılır.5. SELECT ADI. Amacımıza uygun SELECT deyimi şu şekilde düzenlenebilir. 25 .Örnek PERSONEL tablosu içinde yer alan personel arasında görevi MEMUR olanları seçerek listelemek istiyoruz.BÖLÜM_NO FROM PERSONEL WHERE GÖREVİ='MEMUR'.

GÖREVİ. Amacımıza uyan SELECT deyimi şu şekildedir.düğmesine tıklayınız. ! Karşılaştırma İşleçlerini ve anlamlarını tekrar görmek için 'TEKRAR' Örnek Ücreti 2500'den daha az ya da eşit olan personeli seçerek listelemek istiyoruz. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 26 .ÜCRET FROM PERSONEL WHERE ÜCRET<=2500. SELECT ADI.

1. 27 .5. Aşağıdaki etkileşimli listeden bu işleçleri ve anlamlarını görebilirsiniz.6.2 Diğer Karşılaştırma İşleçleri Şu ana kadar öğrendiğimiz karşılaştırma işleçleri dışında. bazı özel amaçlarla kullanılabilecek başka karşılaştırma işleçleri de bulunmaktadır.

.5. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 28 . iki değer arasında kalan satırları belirlemek ve bir alt değer ile bir üst değer arasında kalan değerleri seçmek için kullanılabilir.1 BETWEEN … AND .2. SELECT ADI. İşleci Bu işleç.ÜCRET FROM PERSONEL WHERE ÜCRET BETWEEN 3000 AND 5000.1. Örnek Ücreti 3000 ile 5000 arasında olan personeli listelemek için SELECT deyimi şu şekilde kullanılabilir..6.

IN( liste) Örnek Görevi MEMUR veya PAZARLAMACI olan tüm personeli listelemek istiyoruz.6. SELECT ADI.GÖREVİ FROM PERSONEL WHERE GÖREVİ IN('MEMUR'. 'PAZARLAMACI').1. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 29 .2 IN İşleci Sütun değerlerinin.5. bir listedeki değerler ile karşılaştırılması söz konusu ise. Karakter ve tarih veri türleri. tırnak işareti arasında yer almalıdır. IN işleci herhangi bir veri türü için kullanılabilir. Bunun için IN işlecini kullanabiliriz. Liste içindeki değerler birbirlerinden virgüllerle ayrılır. SELECT deyimi ile birlikte IN işleci kullanılır.2.

2. adı "A" harfi ile başlayan personeli aramak gibi. GÖREVİ FROM PERSONEL WHERE ADI LIKE "A*".1. "S" harfi ile bitenler. "A" harfi ile başlayanlar.3 LIKE İşleci WHERE sözcüğü ile. sadece bir kısmını belirterek arayabiliriz. Bu tür amaçlar için LIKE işleci kullanılabilir. LIKE ile birlikte kullanılan (%) işareti yerine. bir sütunun değerini tam olarak değil.5. Örneğin. Bu operatör ile birlikte. Amacımıza uygun SELECT deyimi şu şekilde düzenlenebilir. (_) işareti ise herhangi bir tek karakteri simgeler. '%S' biçiminde ifade edilir. farklı amaçlar için (%) veya (_) işaretleri kullanılabilir. Bunlardan (%) işareti. MS Access'de (*) işareti kullanılır.6. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 30 . SELECT ADI. LIKE ( kural) Örnek Adı "A" harfi ile başlayan tüm personeli listelemek istiyoruz. 'A%' biçiminde. bu işaretten önce ya da sonra gelen karakterler için arama yapılacağını belirtir. Örneğin.

6. var olmayan. Komisyon almayan personelin bu sütunları NULL değerler içerdiği için.2.4 IS NULL İşleci NULL değeri. Eğer söz konusu tabloda NULL olmayan alanlar aranacak ise.1. Bunun yerine. Örnek PERSONEL tablosu içinde komisyon alan personeli listelemek istiyoruz. GÖREVİ. SELECT ADI. NULL olmayan değerleri seçerek amacımıza ulaşıyoruz. bu kez IS NOT NULL işlecine başvurmak gerekecektir. sütun değerlerinin NULL olup olmadığını denetlemek için IS NULL işleci kullanılır. atanamayan ve bilinmeyen bir değer olduğu için NULL ile ilgili karşılaştırmalarda (=) işleci kullanılamaz. 31 .KOMİSYON FROM PERSONEL WHERE KOMİSYON IS NOT NULL.5.

32 . Bu işleçlerden.3 Mantıksal İşleçler Koşulları içeren karşılaştırma işlemlerinde mantıksal işleçlere de yer verilebilir.Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 1. AND ve OR iki koşulu birlikte değerlendirmek üzere kullanılırlar.5.6.

Böylece her iki koşul için TRUE değerlerine sahip olan personel isimleri listelenir. SELECT ADI.1 AND İşleci AND işleci. GÖREVİ='MEMUR' koşulu doğru ise. şu şekilde olabilir. her iki koşulun doğruluk değeri TRUE ise istenen seçme işlemi gerçekleşir. bu koşul da TRUE değerini döndürür. ÜCRET>=2000 koşulu doğru olacaktır. Örnek Ücreti 2000'e eşit veya daha büyük ve işi MEMUR olan personeli listelemek istiyoruz. ÜCRET FROM PERSONEL WHERE ÜCRET>=2000 AND GÖREVİ='MEMUR'. Yani TRUE değerini döndürür.3. Aynı personelin görevi memur ise yani.1. iki koşulun yandaki doğruluk değeri tablosuna göre TRUE veya FALSE değerinin döndürülmesini sağlar. GÖREVİ.6. Amacımıza uygun SELECT deyimi.5. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 33 . Eğer belirli bir personelin ücreti 2000'e eşit veya daha fazla ise. Eğer.

Eğer.1. GÖREVİ.5.2 OR İşleci OR işleci. OR İşleci Doğruluk Tablosu Örnek Komisyon alan veya görevi MEMUR olan personeli listelemek istiyoruz. ÜCRET FROM PERSONEL WHERE KOMİSYON IS NOT NULL OR GÖREVİ='MEMUR'. Amacımıza uygun SELECT deyimi şu şekildedir. iki koşulun yandaki doğruluk değeri tablosuna göre TRUE veya FALSE değerinin döndürülmesini sağlar. SELECT ADI. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 34 . her iki koşulun doğruluk değeri TRUE ise istenen seçme işlemi gerçekleşir.3.6.

1.5. ŞEF veya PAZARLAMACI olmayan personeli listelemek için aşağıdaki SELECT deyimi kullanılabilir. 'PAZARLAMACI').3. bir koşulun doğruluk değeri TRUE ise FALSE. FALSE ise TRUE değerini döndürmesini sağlar. NULL ve BETWEEN işleçleriyle birlikte kullanılabilir. SELECT ADI. LIKE.6. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 35 . NOT İşleci Doğruluk Tablosu Örnek Mesleği MEMUR. GÖREVİ FROM PERSONEL WHERE GÖREVİ NOT IN('MEMUR'.3 NOT İşleci NOT işleci. Bu işleç IN. 'ŞEF'.

Bu işleçlerin dışında. Örnek 1 Aşağıdaki SELECT deyimini göz önüne alalım: SELECT ADI.1. Yani öncelikle parantez içindeki işlemler yapılır. parantezler de kullanılabilir.ÜCRET FROM PERSONEL 36 .5.6.4 İşleçlerin İşlem Sırası WHERE sözcüğü içinde yer alan işleçler. GÖREVİ.3. Parantezler tüm işleçlere göre bir önceliğe sahiptir. ! İşleçlerin işlem sıralarını tekrar görmek için 'TEKRAR' düğmesine tıklayınız. ardından da yandaki tabloya göre işlem sırası uygulanır. yanda gösterilen sıraya göre işlem görürler.

6.. Parantezlerin öncelik sırasına sahip olduğunu unutmayınız.WHERE GÖREVİ='MEMUR' OR GÖREVİ='ŞEF' AND ÜCRET>3000. Ardından geriye kalan koşulu göz önüne alıyoruz. "Görevi ŞEF olanlar ve ücreti 3000'den fazla olanlar veya görevi MEMUR olanların seçimi" Örnek 2 Görevi. İşleçlerin öncelik sırasını göz önüne alarak değerlendirme yapmamız gerekiyor. GÖREVİ.. SELECT ADI.} FROM tablo [WHERE koşul [ORDER BY {sütun.4 Sıralama İşlemleri Tabloların satırlarının. O halde aşağıda belirtildiği biçimde iki koşuldan söz edilebilir. 37 . AND işlecini ilgilendiren koşulu öncelikle değerlendirmemiz gerekiyor. şöyle bir seçme işlemiyle karşılaşırız.5. 1) Görevi ŞEF olanlar ve ücreti 3000'den fazla olanlar 2) Görevi MEMUR olanlar Bu iki koşulu öncelik sıralarını göz önüne alarak birleştirirsek. AND işleci OR dan daha öncelikli olduğu için.ÜCRET FROM PERSONEL WHERE (GÖREVİ='MEMUR' OR GÖREVİ='ŞEF') AND ÜCRET>3000. SELECT [DISTINCT] { * | sütun. 1.. herhangi bir sütuna göre sıralı olarak elde edilmesi söz konusu ise. ŞEF veya MEMUR olanlar ve ücreti 3000'den fazla olanların seçimini yapacak SELECT deyimini yazınız. . SELECT deyimi ORDER BY sözcükleri ile birlikte kullanılır. Sıralama sözcükleri de dahil olmak üzere SELECT deyimi şu şekilde tanımlanır. ifade} [ASC | DESC] ].

GÖREVİ.Örnek 1 Personeli işe giriş tarihine göre sıralamak istiyoruz. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 38 . GİRİŞ_TARİHİ FROM PERSONEL ORDER BY GİRİŞ_TARİHİ. Bunun için SELECT deyimi şu şekilde düzenlenebilir. SELECT ADI.

bölümleri ve ücretleri birlikte sıralamız söz konusudur. SELECT BÖLÜM_NO. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 39 . ÜCRET FROM PERSONEL ORDER BY BÖLÜM_NO. SELECT deyimi şu şekilde düzenlenebilir. ADI. Bu durumda.Örnek 2 Bu kez personeli ücretine göre her bölüm içinde sıralamak istiyoruz. ÜCRET DESC.

40 .

41 .

42 .

43 .

44 .

45 .

46 .

1. Bu bilgilere dayalı olarak fonksiyon. Fonksiyon Nedir ? Fonksiyonlar veya bir başka deyişle işlevler. Bir fonksiyon. Bölüm Hedefi Bu bölümde aşağıda belirtilen konular ele alınarak incelenecektir: • • • • • Fonksiyon nedir ? SQL fonksiyonları İç içe fonksiyonlar Grup fonksiyonları Gruplama işlemleri 2. çeşitli argümanları girdi olarak alıp bir sonuç üreten hazır bileşenlerdir. SQL'e bazı güçlü özellikler katan olanaklar olarak değerlendirilir.FONKSİYONLARIN KULLANIMI VE GRUPLAMA İŞLEMLERİ Bu bölümde. 47 . fonksiyonun adını ve gerekli argümanları tanımlaması yeterlidir. bir sonuç döndürür (üretir). aynen programlama dillerinde olduğu gibi. • • • • • • Fonksiyon SQL Fonksiyonları Tek Satır Fonksiyonları İç İçe Fonksiyonlar Grup Fonksiyonları Gruplama İşlemleri anlatılmaktadır. SQL fonksiyonları. Kullanıcının. kullanıcıya bazı özel işlemleri ve hesaplamaları otomatik olarak sağlar.

2.2 SQL Fonksiyonları SQL fonksiyonları iki ana grup altında incelenmektedir: 48 .

ANSI SQL'in tüm özelliklerini barındıran ORACLE veri tabanı üzerinde çalıştığımızı varsayarak. fonksiyonları ona göre anlatacağız. 2. Tek satır fonksiyonlarını aşağıda belirtildiği biçimde tanımlıyoruz. 49 . aksi söylenmedikçe "fonksiyon" sözcüğü ile tek satır fonksiyonlarından söz edildiği anlaşılacaktır.Tek satır fonksiyonları.3 Tek Satır Fonksiyonları Tek satır fonksiyonları. tablonun her bir satırına uygulanan fonksiyonlardır. Çoklu satır fonksiyonları ise. Tek satır fonksiyonlarının birçok türü bulunmaktadır. Ancak bazı fonksiyonları tüm veri tabanlarının desteklemediğini göreceksiniz. Bu derste. bir grup satıra uygulanır ve sonuç buna göre elde edilir. tablonun bir satırı için uygulanır ve her satır için bir sonuç üretilir. Burada anlatılan SQL standart ANSI SQL 'dir.

Katarları (karakter dizileri) birleştirmek için kullanılır. Bu fonksiyonların en çok kullanılanlarını şu şekilde sıralayabiliriz. Alfabetik karakterleri büyük harflere dönüştür.1 Karakter Fonksiyonları Karakter fonksiyonları. diğerlerini ise küçük harfe çevirir. pozisyonundan itibaren n karakterinden yeni bir katar oluşturur. Bu ismi değiştiremeyiz. karakter verileri girdi olarak alan. Herhangi bir tabloya ilişkin sütun adı Herhangi bir karakter dizisi ya da hesaplama ifadesi Fonksiyonla birlikte kullanılabilecek argümanlar 2. 50 . Örneğin LOWER bir fonksiyon ismidir. Bir katarın m.fonksiyon sütun ifade argümanlar Herhangi bir SQL fonksiyonunu simgeler. Alfabetik karakterleri küçük harflere dönüştür.3. karakter ya da sayısal değerler döndürebilen fonksiyonlardır. (||) ile aynı görevi yapar. Alfabetik karakterlerin birincisini büyük harfe.

1. a.3. MS Access'de bu fonksiyonların bazıları farklı biçimdedir. SELECT LCASE(ADI) AS İSİMLER FROM PERSONEL WHERE BÖLÜM_NO=10 OR GÖREVİ='PAZARLAMACI' Yukarıdaki SELECT deyimi MS Access veri tabanı için düzenlenmiştir. Bu fonksiyonlar. Örnek PERSONEL tablosunda personel isimleri büyük harflerle yazdırılmış olarak yer almaktadır. bir karakterin büyük harfe ya da küçük harfe dönüştürülmesi söz konusu olduğunda kullanılabilir. ORACLE veri tabanı için verilmiştir.Bir sütunun ya da katarın içerdiği karakter sayısını döndürür. Bu eğitimde bahsedilen fonksiyonlar.1 LOWER() ve UPPER() Fonksiyonları Bu fonksiyonlar. LOWER() Fonksiyonu LOWER() fonksiyonu. bir karakter katarının tüm harflerini küçük harflere dönüştürür. MS Access veri tabanında LOWER() fonksiyonu yerine LCASE() fonksiyonu kullanılmaktadır. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 51 . 2. bazı veri tabanlarında farklılık gösterebilir. Bu isimleri küçük harflerle görüntülemek için SELECT deyimi şu şekilde düzenlenebilir. Örneğin.

MS Access veri tabanında LEN() fonksiyonu kullanılır. 2.b. 52 .2 LENGTH() Fonksiyonu Bir karakter katarın kaç karakterden oluştuğunu veya uzunluğunu bulmak amacıyla ORACLE veri tabanında LENGTH(). bir sayısal değer döndürür.1. UPPER () Fonksiyonu UPPER() fonksiyonu. Lenght() fonksiyonu. bir karakter katarındaki tüm harfleri büyük harflere çevirir.3.

LEN(ADI) AS İSİMLER FROM PERSONEL.Örnek Personel isimlerinin kaç karakterden oluştuğunu bulmak istiyoruz. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 2. sayısal veriler alır ve yine sayısal sonuçlar üretirler. SELECT ADI.2 Sayısal Fonksiyonlar Sayısal veriler üzerinde çeşitli işlemleri gerçekleştirmek üzere özel fonksiyonlar bulunmaktadır. 53 . Sayısal fonksiyonlar. Bu amaçla SELECT deyimi şu şekilde kullanılabilir.3.

54 . İki sayısal değerin.3.1 ROUND() Fonksiyonu ROUND() fonksiyonu.2. m ve n 'nin birbirine bölümünden elde edilen kalanı döndürür.Bu fonksiyonların en çok kullanılanlarını şu şekilde sıralayabiliriz: Sayısal değeri yuvarlatmak amacıyla kullanılır. 7. bir n ondalık hanesine göre yapılır. Sayısal değeri belirtilen ondalığa göre budamak (kesmek) amacıyla kullanılır. Yuvarlatma işlemi. bir sütun değerinin veya bir ifadenin içerdiği sayısal değerin yuvarlatılması amacıyla kullanılır.

Amacımıza uygun SELECT deyimi şu şekilde olacaktır. Görevi MEMUR olanlar için. yuvarlatma sonunda elde edilecek tamsayının ondalık hanesi olmayacaktır. ROUND() fonksiyonu şu şekilde tanımlanır.Eğer n sıfır ise veya fonksiyon içinde belirtilmemiş ise.2) AS GÜNLÜK FROM PERSONEL WHERE GÖREVİ='MEMUR'. SELECT ADI. Örnek PERSONEL tablosunun ÜCRET sütunundaki bilgiler aylık ücretleri kapsamaktadır. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 55 .ÜCRET AS AYLIK. ROUND(ÜCRET/30. aylık ücretleri 30'a bölerek günlük ücretleri bulmak ve sonucu 2 ondalık haneye göre yuvarlatmak istiyoruz.

O andaki tarih ve zaman bilgisini elde etmek amacıyla kullanılır. Belirlenen tarihe ilişkin ayın son gününü bulmak için kullanılır. Belirli bir tarih bilgisine n ay ilave edildiğinde hangi tarihe ulaşılacağını belirler. 56 . Bu fonksiyonların en çok kullanılanlarından biri SYSDATE fonksiyonudur.3. Diğer tarih fonksiyonlarını aşağıdaki tablo üzerinde görebilirsiniz. Bu fonksiyonun herhangi bir argümanı bulunmamaktadır.3 Tarih Fonksiyonları Tarih işlemlerinde kullanılan bazı tarih fonksiyonlarından söz edilebilir. Haftanın belirli bir gününün. bir sonra hangi tarihe karşılık geldiğini bulmak için kullanılır. Örnek 1 Personelin işe giriş tarihinden bu zamana kadar olan süreyi ay olarak hesaplatmak istiyoruz. Fonksiyon İşlevi İki tarih arasında kaç aylık bir süre olduğunu saptar. Amacımıza uygun SELECT deyimi şu şekilde olabilir.2.

3. MONTHS_BETWEEN(SYSDATE. SELECT ADI. GİRİŞ_TAR. GİRİŞ_TAR. Bu fonksiyonları aşağıdaki tabloda görebilirsiniz. 2. SELECT ADI. LAST_DAY(GİRİŞ_TAR) FROM PERSONEL. Bir karakter katarının içerdiği sayısal değerleri istenildiği gibi biçimlendirilerek sayısal veri türüne dönüştürmek için kullanılır.GİRİŞ_TAR) AS AY FROM PERSONEL. Fonksiyon İşlevi Tarih veya sayısal bilginin istenildiği gibi biçimlendirilerek karakter dizisine dönüştürülmesini sağlar.4. SELECT ADI. Örnek 2 İşe giriş süresi 200 aydan daha az olan personeli listelemek için şu şekilde bir sorgu yapılabilir.1 TO_CHAR Fonksiyonu 57 . Örnek 4 Personelin işe giriş tarihlerini göz önüne alarak her bir tarihin ait olduğu ayın en son gününü belirleyen sorgu ifadesi şu şekilde olabilir.3.SELECT ADI.GİRİŞ_TAR.6) FROM PERSONEL. MONTHS_BETWEEN (SYSDATE. ADD_MONTHS (GİRİŞ_TAR. GİRİŞ_TAR.GİRİŞ_TAR)<200. Bir karakter katarının içerdiği tarih verilerini istenildiği gibi biçimlendirilerek tarih veri türüne dönüştürmek için kullanılır.4 Dönüştürme Fonksiyonları Karakter. sayısal ve tarih verilerinin birbirlerine dönüştürülmesi ve özellikle biçimlendirme işlemlerinde çeşitli fonksiyonlardan yararlanılır. 2.GİRİŞ_TAR) AS AY FROM PERSONEL WHERE MONTHS_BETWEEN(SYSDATE. Örnek 3 Personelin işe giriş tarihinden 6 ay sonrasının hangi tarihe karşılık geldiğini hesaplayan bir sorgu şu şekilde oluşturulabilir.

tarih veya sayısal bilginin istenildiği gibi biçimlendirilerek karakter dizisine dönüştürülmesini sağlar. Örneğin. Eğer. 2002 Yılın rakamlarla değil. Üç karakterden oluşur. yani bir katara dönüştürmek söz konusu ise. Aşağıdaki canlandırmada TO_CHAR fonksiyonu. Biçimlendirme ifadesi. bir sayısal değeri biçimlendirerek karakter dizisine çeviriyor. Tarihle ilgili biçimlendirme ifadesi. bazı biçimlendirme elemanlarından ve kurallardan oluşur. bir sayısal değerin karakter katarına dönüştürülmesi isteniyorsa. Günün tam adı 58 . tek tırnaklar arasında yazılır ve büyük küçük harf ayrımına karşı duyarlıdır.Bu fonksiyon. İki farklı uygulama alanı bulunmaktadır. Tarih ile ilgili biçimlendirme ifadelerinde aşağıdaki tanımlardan yararlanılır. tanımı uygulanır. tanımı kullanılır. okunduğu gibi yazılması İki haneli ay bilgisi Ayın tam adı İki haneli gün bilgisi Haftanın günü. Eleman YYYY YEAR MM MONTH DD DY DAY Anlamı Dört haneli yıl bilgisi. Eğer tarih bilgisini karakter dizisine.

PM HH MI SS Anlamı Meridyen göstergesi Günün saati Dakika bilgisi Saniye bilgisi Sayısal değerleri kullanan TO_CHAR() fonksiyonu. Ayrıca ücret rakamının sol tarafına ($) işaretini yerleştireceğiz. Bu fonksiyon şu şekilde tanımlanır. Örnek 1 Personelin işe giriş tarihlerini MM/YY biçiminde elde etmek için şu şekilde bir sorgu düzenlenebilir. Yerel para işaretini yerleştirir.4. 59 . Örnek 2 Personel ücretlerini. Ondalık hanesini gösterir. Sıfır değerini ifade eder.3. binler hanesinden ayırarak elde etmek istiyoruz. Aşağıdaki canlandırmada.TO_CHAR(GİRİŞ_TAR. Amacımıza uygun sorgu şu şekilde düzenlenebilir.999') FROM PERSONEL. Binler hanesini gösterir.'$99. Eleman AM. .Zamanla ilgili biçimlendirme ifadeleri ise aşağıdaki elemanlardan oluşabilir. Eleman 9 0 $ L . Dolar işaretini yerleştirir. SELECT ADI. sayısal veri türüne dönüştürmek için TO_NUMBER() fonksiyonu kullanılır.TO_CHAR(ÜCRET. TO_NUMBER() fonksiyonu bir karakter katarı girdisini sayısal veri türüne çeviriyor.2 TO_NUMBER Fonksiyonu Karakter alan olarak tanımlanmış bir sütunun içerdiği sayısal değerleri.'MM/YY') FROM PERSONEL. SELECT ADI. Anlamı Sayısal değeri ifade eder. 2. aşağıdaki tabloda yer alan biçimlendirme elemanlarını kullanabilir.

60 . Aşağıdaki canlandırma TO_DATE() fonksiyonun çalışma prensibini anlatmaktadır. . Biçimlendirme ifadesi içinde. Sıfır değerini ifade eder.3. Ondalık hanesini gösterir.3 TO_DATE Fonksiyonu Karakter dizisi olarak saklanan ifadeleri tarih bilgisine çevirmek söz konusu olduğunda TO_DATE() fonksiyonuna başvurulur. Sayısal değeri ifade eder. Bu fonksiyon şu şekilde tanımlanır. Dolar işaretini yerleştirir. TO_CHAR() fonksiyonu için geçerli olan biçimlendirme ifadeleri kullanılabilir. TO_CHAR() fonksiyonunda olduğu gibi. Eleman Anlamı 9 0 $ L . Binler hanesini gösterir 2. aşağıda yer alan işaretler kullanılarak düzenlenir.Biçimlendirme ifadesi. Yerel para işaretini yerleştirir.4.

SELECT ADI. 2. NVL() fonksiyonu şu şekilde tanımlanır. Ancak burada SQL'in önemli iki fonksiyonu üzerinde duracağız. 1980" biçiminde olabilir. Bu fonksiyonlar.3. NVL() fonksiyonu. GİRİŞ_TAR FROM PERSONEL WHERE GİRİŞ_TAR=TO_DATE('OCAK 1. fonksiyon isimleri yazılı düğmelere tıklayınız.3.Örnek İşe giriş tarihlerine göre PERSONEL tablosunu sorgulayacağız. bir başka ifadenin görüntülenmesi sağlanabilir. NULL değerler yerine bir başka değerin yer almasını sağlar. YYYY'). ! Fonksiyonların görevlerini öğrenmek için. SQL fonksiyonlarının bir kısmını sonraki bölümde gruplama fonksiyonları olarak ele alarak inceleyeceğiz. 2.MONTH DD. NULL değer ile karşılaşıldığında.1980'. Arama ifadesi "Ocak 1. Bu ifadeyi SELECT deyiminin yorumlayabileceği bir biçime dönüştürmek gerekiyor.5. Bunun yerine.5 Genel Fonksiyonlar Bu bölümde daha önce gördüğümüz fonksiyonların dışında SQL'in birçok fonksiyonu bulunmaktadır. SELECT deyimi ile yapılan sorgularda bu içerik boş olarak görüntüleniyordu. 61 . Amacımıza uygun SELECT deyimi şu şekilde olabilir. NVL() ve DECODE() fonksiyonlarıdır.1 NVL() Fonksiyonu Bir sütunun içeriği NULL ise.

! NVL() fonksiyonunun EVET ve HAYIR durumlarında çalışma şeklini görmek için. NVL() fonksiyonunu kullanmamız söz konusudur.NVL(GİRİŞ_TAR.0) FROM PERSONEL.GİRİŞ_TAR. NULL değerler içeren sütunlar üzerinde aritmetik işlemler yapamayız. aylık ücret bilgisi.KOMİSYON. Ancak pek çok personelin komisyon bilgisi NULL değerler içermektedir. Amacımıza uygun SELECT deyimi şu şekilde olmalıdır.'01-01-2002') FROM PERSONEL. Örnek 1 Yıllık toplam ücretleri hesaplamak istiyoruz. 12 ile çarpılacak ve bulunan sonuca komisyon miktarı eklenecektir. Bunun için. SELECT ADI. O halde. Örnek 2 İşe giriş tarihleri NULL olan personel için '01-01-2002' tarihini işe başladığı tarih olarak görüntüleyen SELECT deyimi şu şekilde olabilir. SELECT ADI.ÜCRET*12+NVL(KOMİSYON.ÜCRET. 62 . EVET ve HAYIR düğmelerine tıklayınız. NULL değerler yerine 0 değerini yerleştirerek hesaplamalar yapılabilir.

5. GÖREVİ. görev olarak "GÖREVİ BELİRLENMEDİ" mesajını görüntüleyen SELECT deyimi şu şekilde olabilir. 2. Onun yerine. SELECT ADI.Örnek 3 Görevi henüz belli olmayan personel için.3..ELSE denetim deyimlerinin SQL içinde tam karşılığı olabilecek bir deyim yoktur. 63 .. aynı işlevi yerine getirmek üzere DECODE() fonksiyonundan yararlanılır. NVL(GÖREVİ.THEN.'GÖREVİ BELİRLENMEDİ') FROM PERSONEL.2 DECODE() Fonksiyonu Programlama dillerinde kullanılan CASE veya IF. Bu fonksiyon şu şekilde tanımlanır.

4 İç İçe Fonksiyonlar Bir SELECT deyimi içinde herhangi bir fonksiyonun nasıl kullanılabildiğini gördük. ardından elde edilen sonuç dıştaki fonksiyon tarafından kullanılır. …) biçiminde bir tanım yapılabilir. Örneğin. Bazı uygulamalarda. İç içe fonksiyonlarda. ÜCRET) AS "YENİ ÜCRETLER" FROM PERSONEL.'MEMUR'. ADIM 2 ve ADIM 3 düğmelerine tıklayınız.Örnek Personel arasında görevi.10. Diğerlerinde ise herhangi bir değişiklik olmayacaktır. önce iç taraftaki fonksiyon işlem görür. 2. 'MÜDÜR'ÜCRET*1. ÜCRET*1.ÜCRET*1. Bu işlemleri yerine getirmek üzere aşağıdaki SELECT deyimini düzenliyoruz. 'ŞEF'.0). bir fonksiyonun içinde bir başka fonksiyona yer vermek gerekebilir. MEMUR olanlara %10. SELECT ADI.GÖREVİ. MÜDÜR olanlara ise. DECODE(GÖREVİ.20. 64 . %20 zam yapılacaktır.15. ! Adımların sonuçlarını görmek için ADIM 1. DECODE(TRUNC(ücret. ŞEF olanlara %15.ÜCRET. Burada DECODE() fonksiyonu içinde TRUNC() fonksiyonunun kullanıldığı görülüyor.

Bir tablonun tüm satırları için grup fonksiyonu uygulanacak ise. "çoklu satır" ya da bir başka deyişle "grup fonksiyonlarından" söz edilir. 65 . tablonun bir satırına uygulanabiliyor ve buna karşılık gelen bir sonuç satırı elde edilebiliyordu. Bir grup satıra bir fonksiyonun uygulanması söz konusu ise.5 Grup Fonksiyonları Tek satır fonksiyonları. GROUP BY sözcüğü yardımıyla da alt gruplara uygulanabilir. Grup fonksiyonları tablonun tüm satırlarına uygulanabildiği gibi. SELECT deyimi aşağıda belirtildiği biçimde kullanılır.2.

2.1 AVG() Fonksiyonu Herhangi bir sütunun içerdiği sayısal değerlerin aritmetik ortalamasını hesaplamak amacıyla. Bu fonksiyonun uygulandığı sütunun veri türü sayısal olmalıdır. Ücretlerin ortalamasını bulmak için şöyle bir yol izlenir. 66 . AVG() fonksiyonu kullanılır.5. Örnek 1 Personel ücretlerini göz önüne alalım.

Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız Örnek 2 Personel arasında görevi MEMUR olanların ortalama ücreti aşağıda gösterildiği biçimde hesaplanabilir. SELECT AVG (ÜCRET) AS ORTALAMA. SELECT AVG (ÜCRET) AS ORTALAMA FROM PERSONEL. 67 .SELECT AVG (ÜCRET) AS ORTALAMA FROM PERSONEL. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız Örnek 1 Personel ücretlerini göz önüne alalım. FROM PERSONEL WHERE GÖREVİ='MEMUR'. Ücretlerin ortalamasını bulmak için şöyle bir yol izlenir.

Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 68 .2 SUM() Fonksiyonu Sütunların içerdiği sayısal değerleri toplamak amacıyla SUM() fonksiyonundan yararlanılır.2. SELECT SUM(ÜCRET) AS TOPLAM FROM PERSONEL. Örnek Tüm personel ücretlerinin toplamını hesaplayan SELECT deyimi aşağıda gösterildiği biçimde oluşturulabilir.5.

grup fonksiyonlarının bunlara uygulanması sağlanabilir. ücret toplamını ve ortalama ücretleri hesaplayan SELECT deyimi şu şekilde oluşturulabilir. grup fonksiyonu(sütun) FROM tablo [WHERE koşul] [GROUP BY sütun] [ORDER BY sütun]. her bölüm için personel sayısını. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 69 . SELECT BÖLÜM_NO. Böyle bir amaçla SELECT deyimi içinde GROUP BY sözcüğünden yararlanılır. SUM(ÜCRET) AS TOPLAM_ÜCRET FROM PERSONEL GROUP BY BÖLÜM_NO. SUM(ÜCRET) AS TOPLAM. SELECT sütun. Bunun için.COUNT(ADI) AS SAYI. PERSONEL tablosunda bulunan personel ücretlerini.6 Gruplama İşlemleri Bir tablonun satırları gruplara ayrılarak. Bölüm_No'suna göre gruplayıp her bölümdeki toplam personel harcamalarını bulabiliriz. Örnek PERSONEL tablosunu göz önüne alarak.2. SELECT BÖLÜM_NO. AVG(ÜCRET) AS ORTALAMA FROM PERSONEL GROUP BY BÖLÜM_NO.

GROUP BY sözcüğü olmadan aşağıda gösterildiği biçimde. GROUP BY içinde belirtilen sütun isimleri. burada belirtilen sütunlara göre artan sırada olduğu varsayılır. Bu son sorgu. sütun isimleri ve grup fonksiyonu ile birlikte kullanılamaz. SELECT BÖLÜM_NO. Ancak grup fonksiyonları.2. biçiminde bir tanım yapılamaz. sütun isimleri ile birlikte kullanılabilirler. Sırayı test yönde değiştirmek söz konusu ise ORDER BY kullanılır.1 GROUP BY Kullanırken Dikkat Edilecek Noktalar SELECT deyimi içinde grup fonksiyonları. Örneğin. SELECT BÖLÜM_NO. grup fonksiyonu içinde yer almak zorunda değildir. her bölümün numarası ve ortalama ücretlerini birlikte elde etmek için SELECT deyimi şu şekilde oluşturulabilir. her bir bölüm numarasını ve bu bölümlerdeki personel sayısını vermektedir. Örneğin. GROUP BY içinde belirtilen sütun isimleri .6. COUNT(*) FROM PERSONEL GROUP BY BÖLÜM_NO. GROUP BY ile birlikte sütunların takma isimleri kullanılamaz. SELECT BÖLÜM_NO. SELECT listesinde yer almak zorunda 70 . COUNT(*) FROM PERSONEL. GROUP BY ie tanımlanan grupların. AVG(ÜCRET) FROM PERSONEL GROUP BY BÖLÜM_NO. Böyle bir amaca ancak aşağıda gösterildiği biçimde varılabilir.

bölüm numarasına göre oluşturulan grupta.değildir.2 Birden Fazla Sütuna Göre Gruplama GROUP BY ile bir sütuna göre gruplama yapılabildiği gibi. SUM (ÜCRET) AS TOPLAM_ÜCRET FROM PERSONEL GROUP BY BÖLÜM_NO. SELECT BÖLÜM_NO.GÖREVİ.6. Örnek Her bölümü ve bölüm içindeki görevlere göre personeli gruplayarak bu bazda ücret toplamları elde etmek amacıyla SELECT deyimi şu şekilde düzenlenebilir. SELECT AVG(ÜCRET) FROM PERSONEL GROUP BY BÖLÜM_NO. Örneğin. yani her bölümün ücret ortalamalarının görüntülenmesi için şöyle bir tanım yapılabilir. 2. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 71 .GÖREVİ. birden fazla sütun için de gruplama yapılabilir.

2. bölüm bazında yapılan bir işlemin.6. Ancak bu deyim istenildiği biçimde çalışmayacak ve bir hatalı durumla karşılaşılacaktır çünkü. 72 . Bunun için aşağıda gösterildiği biçimde bir tanım yapılabilir. Amacımıza uygun SELECT deyimi şu şekilde olabilir. MAX(ÜCRET) AS EN_ÇOK FROM PERSONEL GROUP BY BÖLÜM_NO HAVING AVG(ÜCRET)>3500. grup koşulları WHERE içinde tanımlanamaz. SELECT BÖLÜM_NO. Onun yerine HAVING sözcüğü kullanılır. bölüm ücret ortalamasının 2000'den büyük ise gerçekleştirilmesi istenebilir. SELECT BÖLÜM_NO. Bu sözcük SELECT deyimi içinde şu şekilde tanımlanır. doğal olarak grup bazında bazı sınırlamalar söz konusu olabilir. Ortalama ücreti 3500'den daha fazla olan bölümlerin bölüm numarası ve o bölümdeki en yüksek ücret miktarı görüntülenecektir. AVG(ÜCRET) FROM PERSONEL WHERE AVG(ÜCRET)>2000 GROUP BY BÖLÜM_NO. Örneğin.3 Grup Koşullarının Kullanımı Grup işlemleri yerine getirilirken. Örnek 1 PERSONEL tablosunu göz önüne alalım.

Amacımıza uygun SELECT deyimi şu şekilde düzenlenebilir. SUM(ÜCRET) AS TOPLAM FROM PERSONEL WHERE GÖREVİ <>'PAZARLAMACI' GROUP BY GÖREVİ HAVING SUM(ÜCRET)>5000 ORDER BY SUM(ÜCRET). SELECT GÖREVİ. Sonuçlar en düşük ücret toplamından büyüğe doğru sıralı olacaktır.Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız Örnek 2 PAZARLAMA bölümü dışında çalışan personeli görevlerine göre gruplandırılarak ücretleri toplanacak ve toplam ücreti 5000 den fazla olanlar seçilecektir. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 73 .

74 .

75 .

76 .

77 .

78 .

79 .

80 .1 Çoklu Tabloların Kullanımı Bazı uygulamalarda veri birden fazla tablo üzerinde yer alabilir. KONUM sütunu BÖLÜM tablosundadır. Bu bölümde PERSONEL ve BÖLÜM tablolarını bu amaçla kullanacağız. Bölüm Hedefi Bu bölümde aşağıda sıralanan konular ele alınarak incelenecektir: • • • • • • • • • • • Sorgularda birden fazla tablo kullanımı Tabloların birleştirilmesi Birleştirme türleri "Eşiti olan birleştirme" nedir ? Eşiti olmayan birleştirme Dış birleştirme Kendine birleştirme Küme operatörleriyle birleştirme Alt sorgular nasıl oluşturulur ? Çoklu satır alt sorguları FROM sözcüğü içinde alt sorgu tanımlama 3. • • • PERSONEL_NO sütunu PERSONEL tablosu üzerindedir.ÇOKLU TABLOLAR VE KARMAŞIK SORGULAR Bu bölümde. Bu tablo verileri birleştirilerek sonuçlar elde edilir. BÖLÜM_NO sütunu hem PERSONEL hem de BÖLÜM tablosu üzerinde vardır. • • • • • • • • • Çoklu Tabloların Kullanımı Tabloların Birleştirilmesi Kartezyen Çarpım Birleştirme Türleri Küme İşleçlerini Kullanarak Birleştirme Alt Sorgu Kavramı Çoklu Satır Alt Sorgusu Çok Sütunlu Alt Sorgular FROM Sözcüğü İçinde Alt Sorgu Tanımlama anlatılmaktadır.

81 .2 Tabloların Birleştirilmesi Birden fazla tablonun ele alınarak.Bu iki tablo arasında ortak olan BÖLÜM_NO sütunları aracılığıyla bir ilişki kurulur ve her iki tablo verilerinden oluşan bir sonuç elde edilir. birleştirilmesi ve tek bir sonucun üretilmesi söz konusu olabilir. Birleştirme işlemi. tabloların aynı değerler içeren sütunları kullanılmak suretiyle yapılır. Bu işleme "birleştirme" (join) denir. Birleştirme işlemi şu şekilde tanımlanır. 3. ! "Birleştir" düğmesine tıklayınız.

BÖLÜM tablosunda ise 5 satır varsa. Örneğin. her iki tablonun hangi sütunları kullanılarak birleştirileceğini belirler. Sütun isimlerinin ön tarafına. Örnek PERSONEL ve BÖLÜM tablolarını göz önüne alalım. Bu koşul. ADI. Sadece iki tablo değil n sayıda tablo da birleştirilebilir. dört adet tabloyu birleştirmekiçin en az üç birleştirme koşulu olmalıdır. Bunun dışında. 3. Yani. iki tabloyu birleştirmek için bir birleştirme koşulunun düzenlenmesi gerekiyor. sonuç olarak bir kartezyen çarpım elde edilir. söz konusu sütunların hangi tablodan geldiğini belirtmek mümkün olamayacak ve bu durumda SELECT deyimi çalışmayacaktır. PERSONEL ve BÖLÜM tabloları birleştirilerek bir sonuç elde edilir. Ancak. her iki tablodaki satırların sayısının birbirleriyle çarpımı kadar satırdan oluşan bir sonuç elde edilir. PERSONEL tablosunda 20. BÖLÜM Bu sorgu çalıştırıldığında. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 82 . yine kartezyen çarpımdan söz edilir. birleştirilmiş birincil anahtara sahip tablolar için geçerli olmayacaktır. Ancak bu durumda en az (n-1) birleştirme koşulu tanımlanmalıdır. Bu koşul. herhangi bir birleştirme koşulu tanımlanmadığı için. bu şekildeki bir sorgu sonucunda 20x5=100 satordan oluşan bir sonuç bulunur. Özellikle her iki tablodaki sütun isimleri aynı ise. Bu iki tabloyu aşağıda görüldüğü biçimde birleştirmek istiyoruz.3 Kartezyen Çarpım İki tablo arasında birleştirme koşulu tanımlanmamış ise. birleştirme koşulu geçersiz ise ve birinci tablodaki tüm satırlar ikinci tablodaki tüm satırlarla birleştirilemiyorsa.Tanımdan görüldüğü gibi. tablo isimlerinin yazılması yararlı olacaktır. SELECT PERSONEL_NO.BÖLÜM_ADI FROM PERSONEL.

Bu birleştirme türlerinin herbirini ayrıntılı biçimde ele alarak inceleyeceğiz.4 Birleştirme Türleri Tabloları farklı şekillerde birleştirme olanağı bulunmaktadır. tabloları birleştirme türleri verilmiştir. Solda.4.3. 3. ! Birleştirme türlerini tekrar görmek için 'TEKRAR' düğmesine tıklayınız.1 Eşiti Olan Birleştirme 83 .

PERSONEL tablosu. PERSONEL. bu birleşme işlemine tabi tutulacak tabloları belirlemektedir. PERSONEL_NO. PERSONEL tablosunun BÖLÜM_NO sütunu içeriği ile BÖLÜM tablosunun BÖLÜM_NO sütunu içeriğinin karşılaştırılmasına neden olacaktır. Bu birleştirme aşağıda belirtildiği biçimde gerçekleştirilir. WHERE deyimi içinde tanımlanan koşul. Bu durumda PERSONEL tablosundan.Bu tür birleştirmelere "basit birleştirme". Bir personelin çalıştığı bölümün adını elde etmek için. Yani her iki tablo arasındaki BÖLÜM_NO sütununun içerdiği değerlerin eşit olması durumunda birleştirme gerçekleştirilmiş olur. 3. "eşiti olan birleştirme" ya da "iç birleştirme" isimleri verilmektedir. Örneğin. SELECT listesinde belirlenen sütunlar görüntülenecektir. BÖLÜM_NO ve KONUM isimli sütunlarının alınacağı anlaşılmaktadır. PERSONEL tablosundan alınan sütunlar PERSONEL ön ekiyle tanımlanmıştır.1 Eşiti Olan Birleştirme İle Kayıtların Seçilmesi Eşiti olan birleştirmelere örnek olarak aşağıdaki sorguyu düzenliyoruz. BÖLÜM tablosundan ise.BÖLÜM_NO. PERSONEL_ADI.PERSONEL_NO gibi. Bu koşul gerçekleştiği takdirde. 84 . FROM sözcüğü ardından yazılan tablo isimleri.1.4. Bu deyim şu şekilde yorumlanacaktır. BÖLÜM tablosunun BÖLÜM_NO isimli sütununun içeriği ile karşılaştırılır.

PERSONEL_NO. yukarıda belirtildiği gibi.P.PERSONEL.ADI. tablo isimleri ile birlikte belirtilmesi zorunluluğu yoktur.KONUM FROM PERSONEL.BÖLÜM_NO.PERSONEL_NO.KONUM FROM PERSONEL P. PERSONEL. Bu.4.2 Sütun İsimlerindeki Belirsizlik Birleştirme işleminde. BÖLÜM tablosuna ise.BÖLÜM. P. Örneğin.4. Bu durumda SELECT deyimi hata mesajı verecektir. bu sütunun hangi tablodan alınacağı belirtilmemiştir. B takma ismini vererek aynı sorguyu aşağıda gösterildiği biçimde düzenleyebiliriz. Sadece bir tabloda yer alan sütun isimlerinin.BÖLÜM_ADI.3 Tablolar için Takma İsimlerin Kullanımı Birleştirme işlemlerinde.BÖLÜM WHERE PERSONEL. Örneğin. bölüm numarası ve bölümünün konumunu listelemek için şöyle bir sorgu tanımlanabilir: 85 .B. ilgili tablo ile gösterilebildiğini gördük.BÖLÜM_NO=B.BÖLÜM_NO ve BÖLÜM. PERSONEL. her iki tablodaki alan isimlerinin aynı olması durumunda sorun yaratacaktır.BÖLÜM_NO.BÖLÜM_NO yerine sadece BÖLÜM_NO yazılsaydı. Bu tür bir tanıma FROM sözcüğü içinde yer verilir.BÖLÜM_NO. WHERE sözcüğü içinde başka koşullara da yer verilebilir.1.BÖLÜM.4 AND İşlecinin Kullanımı Birleştirme koşuluna ek olarak.B. 3. SELECT deyiminin herhangi bir yerinde. SELECT listesindeki her bir sütunun. SQL bunu yorumlayamayacaktı çünkü.4.BÖLÜM_NO. BEGÜM isimli personelin.BÖLÜM_ADI. SELECT PERSONEL. Sorgu içinde PERSONEL tablosuna P. Tablonun gerçek isminin hemen ardından bir boşluk bırakılarak takma isim tanımlanır. Özellikle uzun tablo isimlerinde bu tür sorguları ifade etmek zorluklar yaratabilir. birden fazla tablo kullanıldığı için.BÖLÜM_NO=BÖLÜM. gerçek tablo ismi yerine bu takma isim kullanılabilir.1.ADI. SELECT P. 3. adı.3. personel numarası.BÖLÜM B WHERE P. Örnek Aşağıdaki SELECT deyimini göz önüne alalım.1. Gerçek tablo isimleri yerine daha kısa tablo isimleri vermek mümkündür. sütun isimleri ilgili tablo isimleriyle birlikte kullanılıyordu.

SELECT P.PERSONEL_NO,P.ADI,B.BÖLÜM_ADI,B.KONUM FROM PERSONEL P, BÖLÜM B WHERE P.BÖLÜM_NO=B.BÖLÜM_NO AND P.ADI='BEGÜM';

3.4.2 Eşiti Olmayan Birleştirme
Eşiti olan birleştirmelerde, iki tablonun belirlenen iki sütununun içeriği karşılaştırılıyor ve her iki sütunda aynı değerle karşılaşınca ilgili bilgiler listeleniyordu. Eğer, birinci tablonun bir sütununa ikinci tabloda doğrudan uyan bir sütun yoksa, eşiti olmayan birleştirmelerden söz edilir.

3.4.3 Dış Birleştirme
Eşiti olan birleştirmelerde; bir tablonun bir sütununun içerdiği değerler, diğer tablonun ilgili sütununda eşleştiriliyor ve ancak eşleşebilen değerler birleştiriliyordu. Doğal olarak, eşleşemeyen satırlar birleştirilemeyecek ve sonuca dahil edilemeyecektir. Eğer bu şekilde eşleşemeyen kayıtların da sonuca dahil edilmesi isteniliyorsa; dış birleştirme yönteminin uygulanması gerekecektir. Örneğin, PERSONEL ve BÖLÜM tablolarının aşağıda gösterildiği biçimde olduğunu varsayalım.

86

Bu iki tablo incelendiğinde, BÖLÜM tablosunda yer alan REKLAM bölümünde herhangi bir personelin çalışmadığı görülecektir. İki tablo; eşiti olan birleştirme yöntemine göre birleştirilirse, sonuç içinde bu bölüm adı görüntülenmeyecektir. Böyle durumlarda eşleşmeyen kayıtları da birleştirme işlemine katmak için; dış birleştirme yöntemi uygulanır.

3.4.3.1 Dış Birleştirme Nasıl Tanımlanır ?
Dış birleştirmeler, eşleşmeyen kayıtlar hangi tabloda yer alıyorsa ona bağlı olarak iki farklı biçimde düzenlenebilir: SELECT tablo1.sütun1, tablo2.sütun2 FROM tablo1, tablo2 WHERE tablo1.sütun1(+)=tablo2.sütun2 veya SELECT tablo1.sütun1, tablo2.sütun2 FROM tablo1, tablo2 WHERE tablo1.sütun1=tablo2.sütun2(+) Tanımda (+) işaretlerinin yer alması, dış birleşme olayının olduğunu göstermektedir. Bu işaret eksik bilginin olduğu tarafa yerleştirilir. Örnek

87

PERSONEL ve BÖLÜM tablolarını göz önüne alalım. BÖLÜM tablosunda yer alan, ancak PERSONEL tablosunda yer almayan ve REKLAM bilgisini içeren bir satır bulunmaktadır. Bu iki tabloyu, karşılaşmayan kayıtları da görüntüleyecek biçimde birleştirmek ve sonucu listelemek istiyoruz. Bunun için aşağıdaki yol izlenir: SELECT P.ADI,P.BÖLÜM_NO,B.BÖLÜM_ADI FROM PERSONEL P,BÖLÜM B WHERE P.BÖLÜM_NO(+)=B.BÖLÜM_NO; Bilgi eksikliği PERSONEL tablosundadır çünkü, BÖLÜM tablosunda yer alan REKLAM satırı, PERSONEL tablosunda yoktur. O halde (+) işareti, PERSONEL tablosunun ilgili sütunu yanında tanımlanmıştır. Bu işlemin aynısını MS Jet SQL'de gerçekleştirmek için biraz daha farklı tanım yapmak gerekiyor. Bu tür bir dış birleşme için LEFT JOIN…ON sözcükleri kullanılır. SELECT P.ADI, B.BÖLÜM_ADI FROM BÖLÜM B LEFT JOIN PERSONEL P ON B.BÖLÜM_NO = P.BÖLÜM_NO;

Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız

88

3.4.4 Kendine Birleştirme
Bazı uygulamalarda birleştirme işlemi, iki ayrı tablo yerine tek bir tablodaki veriler kullanılarak yapılır. Örneğin, PERSONEL tablosunu aşağıda görüldüğü gibi, iki farklı tablo biçiminde düşünebiliriz. Böylece bu iki tabloyu birleştirerek çeşitli sonuçlar elde etmek imkânımız vardır.

Örnek PERSONEL tablosunun YÖNETİCİSİ başlıklı sütunu; her bir personelin yöneticisinin, personel numarasını içermektedir. Hangi yöneticilerin hangi personel ile çalıştığını belirlemek istiyoruz. Bu amaçla SELECT deyimi şu şekilde düzenlenebilir: SELECT P.PERSONEL_NO AS NO, P.ADI AS PERSONEL, Y.ADI AS YÖNETİCİSİ FROM PERSONEL P, PERSONEL Y WHERE Y.PERSONEL_NO=P.YÖNETİCİSİ;

Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız

89

3.5 Küme İşleçlerini Kullanarak Birleştirme
SQL deyimleri içinde küme işlemlerini temel alarak, çeşitli sorgulamalar yapılabilir. Bu tür sorgularda küme işleçlerinden yararlanılır. Küme işleçleri sayesinde birden fazla tablo birleştirilerek sonuçlar alınabilir.

! SQL'de kullanılan küme işleçlerini tekrar görmek için 'TEKRAR' düğmesine tıklayınız.

90

Bu deyim çalıştırıldığında. A={Adı "A" harfi ile başlayan personel} B={Görevi "M" harfi ile başlayan personel} Bu durumda sorgu içinde. SELECT deyimi şu şekilde düzenlenir: SELECT ADI.1 UNION ve UNION ALL İşleçleri UNION işleci. GÖREVİ FROM PERSONEL WHERE GÖREVİ LIKE 'M%'. İkincisi ise. Bunlardan birincisi. verilen koşul ifadesine uygun olarak çift kayıtları göz ardı eder ve her iki kümedeki tüm kayıtları seçer. 91 .3. adı "A" ile başlayanları veya görevi "M" ile başlayanları topluca listelemek istiyoruz. UNION işlecinin kullanılması gerektiği anlaşılmaktadır. UNION ALL işleci kullanılır. görevi "M" harfi ile başlayanların oluşturduğu kümedir. GÖREVİ FROM PERSONEL WHERE ADI LIKE 'A%' UNION SELECT ADI. Eğer çift kayıtların da görüntülenmesi isteniliyorsa. çift kayıtlar görüntülenmez. verilen koşul ifadesine uygun olarak çift kayıtlar da dahil olmak üzere. Union İşlecinin Etkisi Örnek PERSONEL tablosunda. Buna karşılık. tüm kayıtların seçilmesi söz konusu ise.5. UNION ALL işleci kullanılır. birbirinin aynı olan yani. adının ilk harfi "A" ile başlayan personelin oluşturduğu kümedir. Burada iki ayrı koşuldan söz edilebilir.

3.5.2 INTERSECT İşleci
Her iki koşula da uygun kayıtları elde etmek için; INTERSECT işleci kullanılır. Bu işleç, iki kümenin ara kesiti olarak düşünülür ve iki bölgedeki kayıtların seçilmesini sağlar.

INTERSECT İşlecinin Etkisi
Örnek PERSONEL tablosunda, adı "A" ile başlayanları ve görevi "M" ile başlayan kayıtları bulacağız. Amacımıza uygun SELECT deyimi şu şekilde olabilir: SELECT ADI, GÖREVİ FROM PERSONEL WHERE ADI LIKE 'A%' INTERSECT SELECT ADI, GÖREVİ FROM PERSONEL WHERE GÖREVİ LIKE 'M%';

3.5.3 MINUS İşleci
Birinci kümede olan, ikinci kümede olmayan kayıtları seçmek amacıyla; MINUS işlecinden yararlanılabilir.

92

MINUS İşlecinin Etkisi
Örnek Adı "A" ile başlayan ancak işi, "M" ile başlamayan kayıtları listelemek gerektiğinde; MINUS işlecine başvurulur. Bunun anlamı, birinci sorguda ismi "A" ile başlayanlar; ikinci sorguda da işi, "M" ile başlayanlar aranılacaktır. MINUS işleci, bu iki küme arasındaki farkı ortaya çıkaracaktır. A={Adı "A" harfi ile başlayanlar} B={Görev adı "M" harfi ile başlayanlar} Amacımıza uygun SELECT deyimi şu şekilde düzenlenebilir: SELECT ADI, GÖREVİ FROM PERSONEL WHERE ADI LIKE 'A%' MINUS SELECT ADI, GÖREVİ FROM PERSONEL WHERE GÖREVİ LIKE 'M%';

3.6 Alt Sorgu Kavramı
Şu ana kadar ele alarak incelediğimiz tüm sorgular; önceki bölümde öğrendiğimiz işleçler yardımıyla yapılan birleştirmeler dışında, tek bir ana sorgudan oluşuyordu. Dolayısıyla, sorgu içinde sadece bir SELECT deyimine yer veriliyordu. Uygulamada, bir sorgudan elde edilen sonuç, bir diğer sorguyu ilgilendirebilir. Bu gibi durumlarda alt sorgular ya da bir başka deyişle iç sorgular kullanılır. Şu soruyu göz önüne alalım: "Hangi personelin ücreti, "HALİT" isimli personelin ücretinden daha fazladır?" Bu problemi iki farklı sorguya ayırmak mümkündür: Sorgu 1: "HALİT" isimli personelin aylık ücreti nedir? Sorgu2: Hangi personelin ücreti, "HALİT" isimli personelin ücretinden daha fazladır?

93

Yukarıdaki iki sorguyu aşağıdaki şekilde analiz ederek bir sorgu biçimine döndürebiliriz. Alt sorgular bu amaçla tanımlanır.

3.6.1 Alt Sorgunun Tanımlanması
Bir alt sorgu aşağıda gösterildiği biçimde tanımlanır:

SELECT liste FROM tablo WHERE ifade işleç (SELECT liste FROM tablo);

Tanımda görüldüğü gibi, iki SELECT deyimi ile bir farklı sorgu tanımlanmıştır. Bu iki sorgu birbirine WHERE koşul sözcüğü içinde bağlanmıştır. Bir alt sorgu, aşağıdaki sözcükler içinde kullanılabilir: • • • Örnek Personel numarası "110" olan personelin ücretinden daha fazla ücret alan personel isimlerini listelemek istiyoruz. Amacımıza uygun SELECT deyimi şu şekilde olabilir: SELECT ADI,ÜCRET FROM PERSONEL WHERE ÜCRET > ( SELECT ÜCRET FROM PERSONEL WHERE PERSONEL_NO=110 ); WHERE HAVING FROM

94

Bu sorgu çalıştırıldığında, şöyle bir yol izlenecektir:

a. Alt sorgu Personel numarası "110" olan personelin ücretini bulacaktır. Bu ücret;
"5000" dir.

b. Elde edilen ücret bilgisi ana sorgudaki WHERE sözcüğü içinde yerine konulacaktır. c.
Yani ana sorgunun WHERE koşulu şu şekli almış olacaktır: WHERE ÜCRET > 5000 Ana sorgu bu şekilde çalışır. Yani ücreti "5000" den fazla olan personelin listesi görüntülenir.

Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız

3.6.2 Alt Sorgu Düzenleme Kuralları
Alt sorgular düzenlenirken aşağıdaki kurallara uymak gerekmektedir:

95

3.6.3 Tek Satır Alt Sorguları
Sadece bir değer döndüren alt sorgulardır. İç taraftaki SELECT deyiminden sadece tek bir değer elde edilir. Bu sorgularda soldaki animasyonda yer alan işleçler kullanılır.

! Karşılaştırma İşleçleri ve anlamlarını tekrar görmek için TEKRAR düğmesine tıklayınız.

96

GÖREVİ.Örnek 1 Personel numarası "140" olan personelle aynı göreve sahip olan personelin isimlerini listelemek istiyoruz. SELECT ADI.ÜCRET FROM PERSONEL WHERE GÖREVİ = (SELECT GÖREVİ FROM PERSONEL WHERE PERSONEL_NO=155) 97 .GÖREVİ FROM PERSONEL WHERE GÖREVİ = (SELECT GÖREVİ FROM PERSONEL WHERE PERSONEL_NO=140). Bu sorgu çalıştırıldığında. Ana sorgu ise görevi "ŞEF" olanları sorgular. yani "ŞEF" değeri elde edilir. alt sorgu sonucunda "140" numaralı personelin görevi. Amacımıza aşağıdaki sorgu yardımıyla ulaşabiliriz: SELECT ADI. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız Örnek 2 Personel numarası "155" olan personelle aynı göreve sahip olan ve "350" numaralı personelin ücretinden daha fazla ücret alan personeli listelemek istiyoruz.

6.4 Grup Fonksiyonlarının Kullanımı Grup fonksiyonları sadece bir değer döndürdüğü için. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 3.AND ÜCRET> (SELECT ÜCRET FROM PERSONEL WHERE PERSONEL_NO=350). 98 . bu tür fonksiyonlar tek satır alt sorgularında kullanılabilir.

bulunan değer ana sorgu içinde bu ücrete göre seçilecektir. Bu sorgu doğal olarak alt sorgularla yapılabilir.ÜCRET FROM PERSONEL WHERE ÜCRET = (SELECT MIN(ÜCRET) FROM PERSONEL). Önce alt sorgu içinde en az ücret alan personel belirlenecek. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 99 .Örnek Personel arasında en az ücret alanları listelemek istiyoruz. Amacımıza uygun SELECT deyimi şu şekilde olabilir: SELECT ADI.

100 . doğal olarak grup koşullarının tanımlanması gerekebilecektir. Yani HAVING sözcüğü de kullanılacaktır.6.5 HAVING ile Grup Koşullarının Tanımlanması Ana sorgu grup fonksiyonu içeriyorsa. Bu durumda SELECT deyimi şu şekli alacaktır: SELECT liste FROM tablo GROUP BY sütun HAVING fonksiyon işleç (SELECT fonksiyon FROM tablo).3.

Amacımıza ulaşmak için şu şekilde bir akıl yürüteceğiz: : a) "20" numaralı bölümün en az ücret alan personeli belirlenecektir. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 101 . diğer tüm bölümlerin en düşük ücretleriyle karşılaştırılacak c) Eğer bu değer bölümlerin en düşük ücretlerinden daha küçük ise ilgili bölüm listelenecektir.Örnek En düşük ücreti "20" numaralı bölümün en düşük ücretinden daha büyük olan bölümleri listelemek istiyoruz.MIN(ÜCRET) AS ENAZ_ÜCRET FROM PERSONEL GROUP BY BÖLÜM_NO HAVING MIN(ÜCRET) > (SELECT MIN(ÜCRET) FROM PERSONEL WHERE BÖLÜM_NO=20). Belirtilen bu adımlara uygun SELECT deyimi şu şekilde olabilir: SELECT BÖLÜM_NO. b) Bulunan bu değer.

6. sadece bir değer üreterek. 102 . onu ana sorguya aktarır. bunu bozabilecek tanımlardan kaçınmak gerekiyor. Aksi takdirde söz konusu sorgu çalışmaz. çoklu satır alt sorgularını tanımlamak gerekiyor. Eğer alt sorgu tek satırlı alt sorgu olarak düşünülüyorsa.3.5 Alt Sorgularda Hatalı Çalışma Durumu Tek satır alt sorgularının yapısını ve özelliklerini biliyoruz. Eğer alt sorgunun birden fazla değer üretmesi söz konusu ise. Bu tür alt fonksiyonlar.

ADI FROM PERSONEL WHERE ÜCRET > (SELECT MIN(ÜCRET) FROM PERSONEL).7 Çoklu Satır Alt Sorgusu Alt sorgudan bir satır yerine. daha fazla sayıda satır elde ediliyorsa.Örnek Aşağıdaki alt sorguyu göz önüne alalım. Yani birden fazla satır listelenecektir. SELECT PERSONEL_NO. Ancak ana sorgunun WHERE sözcüğü içinde kullanılan (=) işleci bir tek satır işlecidir. Aşağıdaki animasyonda çoklu satır işleçlerine yer veriyoruz. Bu sorgu çalıştırıldığında. Ancak bu tür sorgular farklı işleçler yardımıyla gerçekleştirilir. Alt sorgudan sadece bir değer beklemektedir. 103 .ADI FROM PERSONEL WHERE ÜCRET > (SELECT MIN(ÜCRET) FROM PERSONEL GROUP BY BÖLÜM_NO). 3. Bu durum gerçekleşmediği için SELECT deyimi bir hata mesajı görüntüleyerek işlemi sonlandırır. Aynı sorgu şu şekilde düzenlenseydi hata durumu ortaya çıkmayacaktı: SELECT PERSONEL_NO. Çünkü alt sorgu gruplandırılmıştır ve doğal olarak grup fonksiyonu herbir grup için bir değer üretir. amaca ulaşılamayacaktır. bu kez sorgu bir çoklu satır alt sorguları olarak değerlendirilir.

Örnek Bir liste içindeki değerlerden birini seçmek için IN işlecini kullanıyorduk.Yukarıda sayılan işleçlerden hiçbiri NOT işleci ile birlikte kullanılamaz! 3. alt sorgularda da gerçekleştirilebilir. ÜCRET. Örneğin.7.2500.GÖREVİ FROM PERSONEL WHERE ÜCRET IN(2000. Örneğin. Bu tür bir işlem.1 IN İşleci Bir liste içindeki değerlerden birini seçmek için IN işlecini kullanıyorduk. ÜCRET sütunu içeriğinin. SELECT ADI. IN işleci ile belirlenen listedeki değerlerle karşılaştırılmalarını sağlıyordu. 104 . biçimindeki bir sorgu.3000).

biçimindeki bir sorgu. ÜCRET sütunu içeriğinin.>" işleçlerinden biri ile birlikte kullanılır. Bu işleç "=. "=ANY" biçimindeki bir tanım IN tanımı ile eşdeğerdir.GÖREVİ FROM PERSONEL WHERE ÜCRET IN( SELECT MIN(ÜCRET) FROM PERSONEL GROUP BY BÖLÜM_NO).<.ÜCRET.2 ANY İşleci Alt sorgu tarafından üretilen herbir değeri ana sorgu içinde belirlenen bir değerle karşılaştırmak söz konusu ise ANY işleci kullanılır. Bu tür bir işlem.SELECT ADI. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 3.7. IN işleci ile belirlenen listedeki değerlerle karşılaştırılmalarını sağlıyordu. 105 . "<ANY" ifadesi "en çoktan daha az". alt sorgularda da gerçekleştirilebilir. ">ANY" ise "en azdan daha büyük" anlamında değerlendirilir.

Örnek 1 En fazla kazanan MEMUR dan daha az maaşı olan personeli listelemek istiyoruz. Amacımıza uygun sorgu şu şekilde olabilir.ÜCRET.GÖREVİ FROM PERSONEL WHERE ÜCRET <ANY( SELECT ÜCRET FROM PERSONEL WHERE GÖREVİ='MEMUR'). SELECT ADI. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 106 .

7.Örnek 2 En düşük ücretli MEMUR dan daha fazla maaşı olan personeli listelemek için aşağıda belirtilen yol izlenebilir: SELECT ADI. "<ALL" ise "en küçükten daha küçük" olanları ifade eder. ">ALL" ifadesi "en büyükten daha büyük". 107 .3 ALL İşleci Alt sorgu tarafından üretilen tüm değerlerin.ÜCRET. ana sorgu için bir girdi olarak kullanılması söz konusu ise ALL işleci kullanılabilir. 3.GÖREVİ FROM PERSONEL WHERE ÜCRET >ANY( SELECT ÜCRET FROM PERSONEL WHERE GÖREVİ='MEMUR').

Örnek Ücreti tüm bölümlerin ortalama ücretinden daha büyük olan personellerii listelemek istiyoruz. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 108 .ÜCRET FROM PERSONEL WHERE ÜCRET >ALL( SELECT AVG(ÜCRET) FROM PERSONEL GROUP BY BÖLÜM_NO). Amacımıza uygun sorgu şu şekilde olabilir: SELECT ADI.

..8 Çok Sütunlu Alt Sorgular Önceki bölümde.. sütun2. SELECT liste FROM tablo WHERE sütun1. 109 .3. Bazı uygulamalarda alt sorgunun birden fazla sütun üretmesi ve koşul içinde bu değerlerin kulanılması söz konusu olabilir... sütun2. IN ( SELECT sütun1. FROM tablo WHERE koşul ). ana sorgu için bir girdi olarak kullanılıyordu. Böyle durumlarda aşağıda belirtildiği biçimde sorgu tanımlanır.. alt sorgunun ürettiği bir sütun. Bu tür bir tanım MS Access'de. yani MS Jet SQL'de geçerli değildir.

P.ÜCRET FROM PERSONEL WHERE (GÖREVİ.(SELECT BÖLÜM_NO.MAAŞ FROM PERSONEL P.ADI. Ancak bu sorguya "SEZİN" in kendi bilgileri de dahil edilmiştir.ÜCRET FROM PERSONEL WHERE ADI='SEZİN'). 3.ÜCRET. Dahil edilmesi istenmiyorsa şu şekilde bir tanım yapılır: SELECT BÖLÜM_NO. Sorgu şu şekilde düzenlenebilir: SELECT BÖLÜM_NO.AVG(ÜCRET) AS MAAŞ 110 . Ancak gerektiğinde bir alt sorgunun sonuçları da tıpkı bir tablo gibi değerlendirilerek. S. Örnek Bir bölümün ortalama ücretinden daha fazla ücret alan tüm personelin ortalama ücretlerini listelemek istiyoruz. FROM içinde bu sorgu yer alabilir.ÜCRET FROM PERSONEL WHERE ADI='SEZİN') AND ADI<>'SEZİN'.9 FROM Sözcüğü İçinde Alt Sorgu Tanımlama Normal olarak bir SELECT deyiminde kullanılabilecek tablolar.ÜCRET) IN (SELECT GÖREVİ.ÜCRET) IN (SELECT GÖREVİ. ADI. ADI.ÜCRET FROM PERSONEL WHERE (GÖREVİ.Örnek "SEZİN" isimli personelin görevi ve ücretiyle aynı olan personeli listelemek istiyoruz.BÖLÜM_NO.P. Amacımıza uygun sorgulama şu şekilde olabilir: SELECT P. yani veri kaynağı FROM sözcüğü içinde tanımlanır.

Bu sorgu bölümlerin ücret ortalamalarını üretmektedir.ÜCRET>S.BÖLÜM_NO=S.MAAŞ. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 111 .BÖLÜM_NO AND P. PERSONEL tablosu yanısıra bir alt sorgu tanımlanmaktadır.FROM PERSONEL GROUP BY BÖLÜM_NO) S WHERE P. Burada. Bu sorgu tıpkı bir tablo gibi düşünülerek ona S adı verilmiştir.

112 .

113 .

114 .

115 .

116 .

117 .

118 .

119 .

Bölüm Hedefi Bu bölümde aşağıda sıralanan konular ele alınarak incelenecektir: • • • • • • DML Tablolara yeni satır ekleme Tablodaki verilerin güncelleştirilmesi Tablodan satır silme işlemi Hareket işleme Hareketin başlatılması ve sona erdirilmesi 4.VERİTABANI TABLOLARININ YARATILMASI Bu bölümde. Tablolar için bir boyut belirlemeye gerek yoktur. • • • Tablolar DML İşlemleri Hareket İşleme anlatılmaktadır. hatta veri tabanının bir kullanıcı tarafından kullanılması esnasında bile yaratılabilir. Tablo yapılarının en önemli özellikleri şunlardır: a) Tablolar herhangi bir anda. b) 120 . Ancak yine de tablonun ne kadarlık bir hacime ulaşabileceğini tahmin etmekte yarar vardır.1 Tablolar Tablolar veri tabanının temel yapılarıdır.

1. İsimlendirirken bazı kurallara uymak gerekmektedir: 121 . Bu tablolara sistem yöneticisi dışında herhangi bir kullanıcının erişmesi ya da müdahale etmesi mümkün değildir. Kullanıcı tabloları Veri sözlüğü 4. Veri tabanı sunucusu tarafından kullanılan ve bakımı onun tarafından yapılan tablolardır. Söz konusu tabloların isimleri ve sütunları doğal olarak kullanıcı tarafından belirlenmiştir.Veri tabanlarında iki türlü tablo yer almaktadır: Bu tablolar herhangi bir veri tabanı kullanıcısı tarafından yaratılan tablolardır.1 Tabloları İsimlendirme Tablolara doğal olarak bir isim vermek gerekecektir. Veri tabanının yönetilmesine yönelik olan bu tablolar ve görünümler (views). veri tabanı sözlüğünü (database dictionary) oluştururlar.

Tablo isimleri büyük-küçük harf ayrımına karşı duyarlı değildir. Küçük harflerle ya da büyük harflerle veya karışık yazılması fark etmez. Tablo isimleri verilirken aşağıda sıralanan hususlara dikkat edilmesi tavsiye edilir: a) Tablo ya da sütun isimleri ilişkili olduğu konuya uygun biçimde belirlenmelidir. Aynı sütunlar birden fazla tablo içinde yer alıyorsa, aynı isimleri vermek yararlı olacaktır. Örneğin PERSONEL ve BÖLÜM tablosu içindeki bölüm numarasını içeren sütunlar BÖLÜM_NO biçiminde belirlenmiştir.

b)

4.1.2 Veri Türleri
Tablolar yaratılırken, her bir sütunun veri türü mutlaka belirlenmelidir Çeşitli amaçlara uygun veri türleri bulunmaktadır. ORACLE sunucuda geçerli olan bu veri türlerinin temel olanlarını soldaki; tamamını ise aşağıdaki canlandırmada görebilirsiniz:

122

123

124

125

126

127 .

Bir sütunun değeri. personelin işe giriş tarihini içerecektir.3 Tabloların Yaratılması Tabloların yaratılabilmesi için CREATE TABLE deyimi kullanılır.] tablo (sütun veri türü [DEFAULT ifade]. veri tabanı içindeki verilere doğrudan karşılık gelen mantıksal yapılardır. Şema nesneleri tablolar. şema tablo sütunlar veri türü DEFAULT ifade Tablonun sahibini belirler Yaratılacak tablonun adı Tablonun herbir sütunu Herbir sütunun veri türü Sütuna veri girişi yapılmadığında. o sütunun varsayılan değerini belirler Veri tabanındaki nesneler topluluğuna şema adı verilebilir. PERSONEL tablosunun GİRİŞ_TAR isimli alanı. dizinler ve diğer nesnelerdir. Ancak belirtlenen değer. 128 . Bu deyim şu şekilde tanımlanır: CREATE TABLE [şema. Bu amaçla DEFAULT sözcüğü.…). Eğer herhangi bir değer kaydedilmez ise.1. Burada doğrudan bir değer. Şema nesneleri. daha tablo yaratılırken varsayılan değer (default value) olarak atanabilir. bu personelin tabloya kaydedildiği günün tarihini işe giriş tarihi olarak kabul etmek istiyoruz. görünümler. bir ifade veya bir fonksiyon belirlenebilir. ilgili sütunun veri türüne uygun olmalıdır. Bir tablo belirli bir kullanıcıya ait ise. Örneğin.4. tablo adı kullanıcı adı ile birlikte ifade edilir.

bunların sayısı alt sorgudan elde edilen sütun sayısı ile aynı olmalıdır. Bölümün yerini belirleyecekitir.1. 4. Bölüm adını içerecektir. BÖLÜM_ADI KONUM Bu tablo aşağıda belirtildiği biçimde yaratılabilir: CREATE TABLE BÖLÜM (BÖLÜM_NO BÖLÜM_ADI KONUM NUMBER(2). Eğer CREATE TABLE deyimi içinde sütun tanımları verilmiş ise. bilgi giriş işlemi daha tablo yaratılırken de yapılabilir. VARCHAR2(13)). Ancak. En fazla 15 karakter olabilir. VARCHAR2(15). Bu durumda yeni tablo sütunları ile alt sorgu sütunları sıraya göre eşleşir. alt sorgudan elde edilen sütunlar yeni yaratılacak olan tablonun sütunlarını oluşturacaktır. INSERT INTO deyimi yardımıyla.4 Bir Alt Sorgu İle Tabloların Yaratılması Bir tablo yaratıldıktan sonra. CREATE TABLE tablo [(sütunlar)] AS altsorgu . En fazla 2 karakter olabilir.… GİRİŞ_TAR DATE DEFAULT SYSDATE biçiminde kullanılabilir. En fazla 13 karakter olabilir. Bunun için. CREATE TABLE deyimi bir alt sorgu ile birlikte kullanılabilir. 129 . Örnek BÖLÜM tablosunun aşağıdaki sütunlardan oluşması gerektiğini varsayalım: BÖLÜM_NO Sayısal değerler içerecektir. CREATE TABLE deyiminde sütun tanımları yapılmamış ise. bu tabloya bir başka tablodan sorgulama işlemi yapılarak bilgi giriş yapılabilir.

4. Bu amaçla ALTER deyimi kullanılır. PERSONEL tablosundaki aylık ücret bilgileri yıllığa çevrilerek PER20 tablosuna yazdırılacaktır. Bu tablo PERSONEL tablosunda yer alan ve "20" numaralı bölüme ilişkin personel kayıtlarını içerecektir. ALTER deyimi şu şekilde tanımlanıyor: 130 .Örnek PER20 isimli bir tablo yaratacağız.1. gerektiğinde yeni sütunlar eklenebilir. ÜCRET*12 AS YILLIK FROM PERSONEL WHERE BÖLÜM_NO=20. ADI.5 Tabloya Yeni Bir Sütun Ekleme Bir tablo yaratıldıktan sonra. CREATE TABLE PER20 AS SELECT PERSONEL_NO.

ALTER TABLE tablo ADD ((sütun1 veri türü [DEFAULT ifade] [. ! "Alter Table" okuna tıklayınız. Örnek Daha önce yaratılan PER20 isimli tabloya GÖREVİ isimli yeni bir sütun eklemek istiyoruz.6 Bir Sütun Tanımını Değiştirmek Tablo yaratıldıktan sonra. gerektiğinde bir sütun ile ilgili tanımlarda bazı değişiklikler yapılabilir. Bunun için ALTER deyimi MODIFY sözcüğü ile birlikte şu şekilde kullanılır: 131 . Bu sütun VARCHAR2 veri türüne sahip olacak ve en fazla 9 karakter içerebilecektir.1.sütun2 veri türü]…). 4. Bunun için şöyle bir yol izlenir: ALTER TABLE PER20 ADD (GÖREVİ VARCHAR2(9)).

Sütun tanımları istenildiği biçimde değiştirilemez. Bu işlemi yerine getirirken bazı noktalara dikkat etmek gerekiyor: 132 .ALTER TABLE tablo MODIFY (sütun1 veri türü [DEFAULT ifade] [. ! "Alter Table" okuna tıklayınız.sütun2 veri türü]…).

Nesnenin adını değiştirirken. Bu deyim şu şekilde tanımlanıyor: RENAME eski adı TO yeni adı.Örnek PER20 isimli tablonun ADI isimli sütunun genişliğini 15 karakter olarak değiştirmek istiyoruz. Bu amaçla RENAME deyimi kullanılır. 4. isimlendirme ile ilgili kurallara uymak gerekmektedir. Bunun için aşağıda belirtilen yol izlenir: ALTER TABLE PER20 MODIFY (ADI VARCHAR2(15)).7 Tablo Adının Değiştirilmesi Bir tablo veya diğer veri tabanı nesnelerinin adını değiştirmek gerekebilir.1. 133 .

1. Bu deyim tehlikeli sonuçlara neden olabilecek bir deyimdir. Böyle bir amaca ulaşmak için DROP deyimi kullanılır. Söz konusu deyim şu şekilde tanımlanıyor: DROP TABLE tablo ! "Drop Table" okuna tıklayınız.Örnek Veri tabanındaki BÖLÜM isimli tablounun adını YENİ_BÖLÜM olarak değiştirmek için şöyle bir yol izlenebilir: RENAME BÖLÜM TO YENİ_BÖLÜM. O halde kullanırken bazı noktalara dikkat etmek gerekiyor: 134 .8 Tablonun Yok Edilmesi Gerektiğinde bir tablo veri tabanından silinebilir. 4.

Bu tür işlemler. 135 . 4.Örnek PER20 isimli tabloyu yok etmek için aşağıda belirtilen yol izlenir: DROP TABLE PER20.2 DML Nedir ? SQL'de SELECT deyimi ile sorgulama işlemleri yapılıyordu. Eğer bir tabloya yeni kayıt ilave edilmesi. Tablolar üzerinde herhangi bir değişikliğe yol açmaz. sorgulama deyimleri bir işe yaramaz. var olan bir satır üzerinde değişiklikler yapılması veya bir satırın yok edilmesi söz konusu ise. sadece sorgulama yapar. Onun yerine başka yöntemlere başvurmak gerekir. Bunları önceki bölümlerde ayrıntılı biçimde ele alarak inceledik.

tıklayınız. Bu deyim aşağıda gösterildiği biçimde tanımlanıyor: INSERT INTO tablo (sütunlar) VALUES (değerler). Bu deyim her çalıştığında tabloya yeni bir satır eklenir.1 Tabloya Satır Ekleme Bir tabloya yeni bir satır eklemek gerektiğinde INSERT INTO deyimi kullanılır. veri değiştirme ve kayıt silme gibi işlemler yapılabilir.DML-(Data Manipulation Lanquage) adı verilen dil yardımıyla.2. Bu bölümde söz konusu dilin temel özelliklerini inceleyeceğiz. Eklenecek satırların sütun isimleri. Ancak. tablo sütunlar Kayıt ekleme işleminin yapılacağı tablonun adı. bu durumda sütunların tablo tanımındaki varsayılan sırası kabul edilir. INSERT INTO deyimi içinde sütun isimlerini belirlemek zorunlu değildir. ! DML deyiminin görevlerini tekrar görmek için 'TEKRAR' düğmesine 4. veri tabanı tabloları üzerinde kayıt ekleme. 136 . değerler Herbir sütuna girilecek yeni değerler.

137 .Örnek BÖLÜM tablosunun aşağıda görüldüğü biçimde 6 adet kayıta sahip olduğunu varsayalım: Yukarıda olduğu gibi. herhangi bir tablonun satırlarını nasıl görüntüleyeceğimizi geçen derslerden biliyoruz. Bu işlem aşağıda belirtildiği biçimde SELECT sorgulama deyimi ile yapılır: SELECT * FROM BÖLÜM.

Bu şekilde kayıt ekleme işlemi gerçekleştirildikten sonra. Sütun adı belirtilmez.'KADIKÖY'). Eklenecek yeni bölüm ile ilgili veriler şu şekildedir: Bölümün numarası : 70 Bölümün adı : EĞİTİM Bölümün konumu : KADIKÖY Söz konusu bir kayıtı eklemek için aşağıdaki deyim kullanılır: INSERT INTO BÖLÜM(BÖLÜM_NO. INSERT INTO deyimi içinde NULL değeri girilecek sütun adı belirtilmez.BÖLÜM_ADI) VALUES(80. a.NULL).2 NULL Değerlerin Tabloya Eklenmesi Tablonun bir sütununa NULL değerin girilmesi gerekebilir.2. Sütuna NULL değeri kaydedilir.'EĞİTİM'. INSERT INTO BÖLÜM VALUES(80. BÖLÜM tablosu yeniden görüntülenirse.Bu tabloya yeni bir bölüm eklemek istiyoruz.'BİLGİ İŞLEM'). 4. Örnek BÖLÜM tablosuna yeni bir kayıt ekleyeceğiz. Birinci yöntemde. INSERT INTO BÖLÜM(BÖLÜM_NO.KONUM) VALUES(70. 138 . İkinci yöntemde ise. b. Eklenecek satırda KONUM sütununa NULL değerini atamak için INSERT INTO deyimi aşağıda belirtilen biçimlerde kullanılabilir. Bu gibi durumlarda.BÖLÜM_ADI. iki yöntemden biri kullanılabilir.'BİLGİ İŞLEM'. tablonun en sonuna söz konusu kayıtın eklendiği görülür. söz konusu sütuna doğrudan NULL değeri atanır.

Örnek PERSONEL tablosuna yeni bir kayıt ekleme esnasında. 4.'MEMUR'.KOMİSYON.3 Tablolara Satır Eklerken Fonksiyonların Kullanımı INSERT INTO deyimi içinde bazı özel değerlerin girilmesi söz konusu ise.ÜCRETİ. GİRİŞ_TAR.Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 4.BÖLÜM_NO) VALUES(600.2800.'SERAY'.ADI. GİRİŞ_TAR isimli alana o günün tarih ve zaman bilgisini kaydetmek için şöyle bir yol izlenebilir: INSERT INTO PERSONEL(PERSONEL_NO. SYSDATE.30).2.NULL.2. SQL fonksiyonları kullanılabilir.GÖREVİ.4 Bir Diğer Tablodan Satır Kopyalama 139 .

GÖREVİ. Örnek YÖNETİCİLER isimli bir tabloya. bir diğer tabloya eklemek için aşağıda belirtilen tanım kullanılır: INSERT INTO tablo (sütunlar) alt sorgu. PERSONEL tablosunda yer alan ve görevi "MÜDÜR" veya "ŞEF" olanları seçerek eklemek istiyoruz. Alt sorgudan elde edilecek sütunlar ile INSERT INTO içinde tanımlanan sütunlar karşılıklı eşleşecektir.INSERT INTO deyimi ile. Bir tablodan satır okuyarak. Amacımıza uygun deyimler şu şekilde olacaktır: INSERT INTO YÖNETİCİLER(PERSONEL_NO.BÖLÜM_NO) SELECT PERSONEL_NO. GÖREVİ. Diğer tablodan satırları okumak için SELECT sorgulama deyimi kullanılır. tabloya belirlenen değerleri içeren bir satır eklenebildiği gibi.ÜCRET. O nedenle. aynı veri türüne sahip olmalarına dikkat etmek gerekiyor. Bu durumda VALUES sözcüğü kullanılmaz. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 140 .ÜCRET. Bir Tablodan Bir Başka Tabloya Kayıt Ekleme ! INSERT INTO okuna tıklayınız. bir başka tablodan okunan satırlar da eklenebilir.BÖLÜM_NO FROM PERSONEL WHERE GÖREVİ='MÜDÜR' OR GÖREVİ='ŞEF'.ADI.ADI.

Bu deyim şu şekilde tanımlanır: UPDATE tablo SET sütun1=değer1.5 Tablodaki Verileri Güncelleme Bir tablonun içerdiği değerler gerektiğinde değiştirilecektir.2. 141 . sütun2=değer2. Bu amaçla UPDATE deyiminden yararlanılır.… [WHERE koşul].4.

Bir Tablodan Okunan Verilerle Diğerini Güncelleme 142 . Bunun için ikinci tablodan kayıt okuma işlemi SELECT deyimi ile gerçekleştirilir.2.6 Bir Başka Tablodan Okunan Verilerle Güncelleme Güncelleme işlemi.Verilerin güncelleştirilmesi için WHERE deyimi ile bir koşul tanımlanabilir. söz konusu tablonun tüm satırları güncelleştirilmiş olacaktır. Yukarıdaki sorgulamanın sonucunu görmek için linke tıklayınız 4. Bunu sağlamak için şöyle bir yol izlenir: UPDATE PERSONEL SET ÜCRET=2500 WHERE PERSONEL_NO=300. Örnek Personel numarası "300" olan personelin ücretini "2500" olarak değiştirmek istiyoruz. Bu tanımın yapılmadığı durumlarda. bir tablodan okunan değerlere bağlı olarak da yapılabilir.

2. Silme işlemi için DELETE deyimi kullanılır. Amacımıza şu şekilde ulaşabiliriiz: UPDATE PERSONEL SET BÖLÜM_NO=90 WHERE GÖREVİ=(SELECT GÖREVİ FROM PERSONEL WHERE PERSONEL_NO=350). 4.7 Tablodan Satır Silme Tabloda yer alan bir veya daha fazla sayıda satır silinebilir. ! DELETE okuna tıklayınız.! UPDATE okuna tıklayınız. "90" olarak değiştirmek istiyoruz. Örnek Numarası "350" olan personel ile aynı göreve sahip tüm personelin bölüm numarasını. Bu deyim şu şekilde tanımlanıyor: DEELETE [FROM] tablo [WHERE koşul]. 143 .

144 . Çünkü "60" numaralı bölüm BÖLÜM tablosunda tanımlanmasına rağmen. Örnek 2 BÖLÜM isimli tabloda yer alan ve bölüm kodu "60" olan bölümü silmek istiyoruz. PERSONEL tablosunda bu bölümle ilgili herhangi bir kayıt bulunmamaktadır.Örnek 1 BÖLÜM isimli tablonun tüm kayıtlarını silmek için şöyle bir yol izlenebilir: DELETE FROM BÖLÜM. Bu tablonun PERSONEL tablosu arasında bütünlük ilişkilerinin tanımlandığını varsayacak olursak. ! Çalıştır okuna tıklayınız. amaçlanan silme işlemi gerçekleşir. bu tablo üzerinde bütünlük sınırlamalarının bulunmaması gerektiği unutulmamalıdır. Ancak bu tür bir silme işleminin gerçekleştirilebilmesi için. Bunun için DELETE deyimi şu şekilde düzenlenebilir: DELETE FROM BÖLÜM WHERE BÖLÜM_NO=60. BÖLÜM ile PERSONEL arasında bütünlük sınırlamaları tanımlanmış olmasına rağmen. bu silme işleminin gerçekleşmeyeceğini söyleyebiliriz.

Veri tabanı hareketleri INSERT. "veri tabanı hareketleri " (database transactions) oluşur. 4. Kullanıcı. bu değişikliklerin kalıcı hale getirilerek diğer kullanıcılar tarafından da görülmesi sağlanabilir. veri tabanının önceki hale dönüşmesi gerekebilir. Yani veri üzerinde bir değişiklik yaptığımızda.1 Hareketin Sona Erdirilmesi 145 . Bu değişikliklerin diğer kullanıcıları hemen etkilemesi istenmez. bunun sonucunu sadece kendimiz görürüz.3 Hareket İşleme Veri tabanlarını doğal olarak aynı anda çok sayıda kişi kullanacaktır. Bu tür bir amaca ulaşmak için hareket işleme (transaction processing) kavramını bilmek gerekir. veriyi değiştirebilir hatta silebilir. Ayrıca bilgisayarın çalışması sona erince ya da sistem bozulmalarında (crashes) veri tabanı hareketleri sona erecektir. Başlayan bir hareket COMMIT ya da ROLLBACK deyimleri çalıştırılıncaya dek sona ermez ve sonuçları kalıcı değildir. veri ekleyebilir. Bu deyimlerden biri çalıştırıldığında veya bir başka DDL deyimi (örneğin CREATE) çalıştırıldığında da hareket son bulur.3. Çünkü yapılan bazı işlemlerin iptal edilerek. Verinin değiştirilmesi üzerinde etkili olan DML deyimleri çalıştırıldığında.4. Gerek görülürse. UPDATE ve DELETE gibi deyimlerin çalıştırılması sonucunda başlar.

UPDATE PERSONEL SET BÖLÜM_NO=10 WHERE PERSONEL_NO=300. Bu deyimin çalıştırılması ardından. Örnek PERSONEL tablosunun tüm kayıtlarını silmek için. yaptığı tüm değişiklikler kalıcı hale gelir ve diğer veri tabanı kullanıcıları da bu değişikliği algılamış olurlar. tüm DML deyimlerinin etkileri geri alınabilir. Bu şekilde başlayan bir işlemi sona erdirmek için COMMIT kullanılır.UPDATE veya DELETE deyimlerinden birinin çalıştırılması yeterlidir. 4.3. "300" numaralı personelin bölüm numarası "10" olarak değiştirilir.Veri tabanı hareketlerinin başlaması için INSERT. Örnek Veri tabanı kullanıcılarından birinin aşağıdaki deyimi çalıştırdığını varsayalım. deyimi kullanılır. Veri tabanına ulaşan diğer kullanıcılar bu değişikliğin sonucunu görmezler. 146 . Böyle bir amaca ulaşmak için. Çünkü kullanıcının yarattığı hareket sona ermemiştir. Ancak bir kullanıcının bu şekilde yaptığı bir işlemin sonucu diğer kullanıcıyı etkilemez. Aynı kullanıcı bu kez. Söz konusu değişiklik sadece bu deyimi çalıştıran kullanıcı için yapılmıştır. Yani değişiklikler iptal edilebilir. Bu deyim çalıştırılmadığı sürece.2 Değişikliklerin Geri Alınması Veri tabanı üzerinde bir kullanıcı tarafından gerçekleştirilen değişikliğin kalıcı hale gelmesi için COMMIT deyiminden yararlanıyoruz. COMMIT. ROLLBACK. deyimini çalıştıracak olursa.

bu deyimi çalıştıran kullanıcı için PERSONEL tablosunun tüm kayıtları silinmiştir. Bu deyim çalıştırıldığında. deyimi çalıştırılırsa.DELETE FROM PERSONEL. PERSONEL tablosunun eski haline dönüştüğü görülür. Silme işlemini iptal etmek için. Deyiminin çalıştırıldığını varsayalım. silinen kayıtları geri alma olanağı bulunmaktadır. 147 . Henüz COMMIT deyimi çalıştırılmadığı için diğer kullanıcılar bu işlemden etkilenmez ve bu durumda. ROLLBACK.

148 .

149

150

151

152

153

Yordamsal (Procedural) programlama dilleri arasında değerlendirilebilir. Bölüm Hedefi Bu bölümde aşağıda sıralanan konular ele alınarak incelenecektir: • • • • • • • • PL/SQL ile veri tabanı programlama Karakter kümesi Değişkenler ve değişmezler Bildirimler bölümü Veri türleri İfadeler İşleçler Açıklama satırları 5.1 PL/SQL İle Veri Tabanı Programlama Bu bölümde bir veri tabanı programlama dili olarak değerlendirilen PL/SQL dili anlatılacaktır. PL/SQL programlama dili sadece ORACLE veri tabanlarında kullanılabilir. PL/SQL Oracle üzerinde iki farklı ortamda yer alabilmektedir. Bunlar aşağıda verildiği gibidir. PL/SQL blok yapılı bir programlama dilidir. 154 . • • • • • • • • • • • • • • • PL/SQL ile Veri Tabanı Programlama Blok Türleri PL/SQL Programlarının Yapısı PL/SQL Programlarının Görünümü PL/SQL Bloklarının Çalıştırılması Karakter Kümesi Değişkenler ve Değişmezler SQL Deyimlerinin PL/SQL İçinde Kullanımı Bağlı Değişkenler Değerlerin Görüntülenmesi için Bir Diğer Yol Bildirimler Bölümü Veri Türleri İfadeler İşleçler Açıklama Satırları anlatılmaktadır.PL/SQL’E GİRİŞ Bu bölümde.

PL/SQL motoru şekil üzerinde görüldüğü biçimde bu programları yorumlayarak.2 Blok Türleri PL/SQL bir programlama dilidir ve programlar bloklardan oluşur. Bunun dışında. PL/SQL de aşağıda sıralanan bloklardan söz edilebilir: • • • Anonim bloklar Yordamlar (procedures) Fonksiyonlar (functions) Sıralanan bu blok yapılarından öncelikle anonim blok yapılarını kullanacağız. Dersimizin sonraki konularında diğer blok türlerini de ele alarak inceleyeceğiz. PL/SQL motoru PL/SQL programlarını çalıştıran bir ortamdır. PL/SQL programları yada bir başka deyişle PL/SQL blokları doğrudan veri tabanı üzerinde tanımlanarak çalıştırılabilir. istekleri SQL komutları biçiminde Oracle veri tabanına gönderir.• • Oracle veri tabanı sunucusu Oracle yazılım geliştirme araçları Bu iki ortam birbirinden bağımsız olarak değerlendirilebilir. PL/SQL blokları PL/SQL motoru üzerinde çalıştırılır. PL/SQL programları SQL deyimlerini ve bunlara ek olarak bazı özel deyimleri içeren bir programlama dilidir. söz konusu PL/SQL programları bir uygulama geliştirme ortamında. 155 . 5. örneğin “Oracle Developer” isimli yazılım geliştirme araçları üzerinde tanımlanarak kullanılabilir. ! PL/SQL Blok Türlerini görmek için Devam düğmesine tıklayınız. Çeşitli blok türleri vardır.

içiçe blokların oluşturulması da mümkündür. Bir PL/SQL bloğu aşağıda belirtildiği biçimde tanımlanmaktadır: 156 .5. Bu bloklar ayrı ayrı olabileceği gibi.3 PL/SQL Programlarının Yapısı PL/SQL programları bloklardan oluşur. Bir blok yada alt blok mantıksal bildirimler (declaration) ve onu takip eden PL/SQL deyimlerinden oluşmaktadır.

157 .

Bu blok içinde yer alan deyimleri sonraki bölümlerimizde ele alarak inceleyeceğiz. Örneğin Oracle Developer isimli yazılım geliştirme ortamında hazırlanan programlarda bu PL/SQL blokları tanımlanarak çalıştırılabilir.4 PL/SQL Programlarının Görünümü Bir SQL bloğu DECLARE. Yandaki örnek bir PL/SQL programının görünümü hakkında bir fikir vermektedir. BEGIN ve EXCEPTION bölümlerinden oluşmaktadır. 5. PL/SQL bloklarını çalıştırmanın bir diğer yolu. 158 . hem SQL deyimlerinin hem de PL/SQL bloklarının doğrudan çalıştırılabilmesi için uygun bir ortam sağlamaktadır. Bu bloklar iki türlü çalıştırılabilir.5 PL/SQL Bloklarının Çalıştırılması PL/SQL bloklarının sadece ORACLE veri tabanlarında çalıştırılabildiği unutulmamalıdır. Oracle kullanıcılara. SQL*Plus programı söz konusu komutların girilmesine ve çalıştırılmasına yönelik bir arayüz sunmaktadır.5. Birincisi bir uygulama programı içinden olabilir. Oracle’ın SQL*Plus ortamınının kullanılmasıdır.

SQL deyimlerinin girildiği ve çalıştırıldığı bir ortamdır. Bu arayüzün başlangıçtaki görünümü aşağıdaki şekil üzerinde görüldüğü gibidir.5. Bu arayüzü kapatmak için. Şu anda Oracle’ın tek kişilik sürümünde varsayıyoruz. Örneğin.2 SQL*Plus Arayüzünün Görünümü Kullanıcı adı ve parolası doğru biçimde girildikten sonra SQL*Plus arayüzüne ulaşılır. Bu kullanıcı daha önce veri tabanında yaratılmış olması zorunludur.1 SQL*Plus Arayüzüne Giriş SQL*Plus arayüzüne ulaşabilmek için.5. öncelikle kullanıcının veri tabanına kendisini tanıtması gerekmektedir. Ancak. SQL> ifadesinin hemen ardından kaydedilir. O nedenle üçüncü satırdaki ana bilgisayar ile ilgili tanım yapılmaz. menü üzerindeki Dosya seçeneğinin Çıkış alt seçeneği kullanılabilir. Arayüz aslında. Komutlar.5. 5. 159 . kulanıcı adının test şifresinin de test olduğunu varsayalım. Yani veri tabanı şu anda aynı bilgisayar üzerindedir.

160 . BOLUM isimli tablonun tüm içeriğini listelemek için SQL deyimi şu şekilde tanımlanmaktadır: SQL> SELECT * FROM bolum.5.3 SQL Deyimleri Nasıl Çalıştırılır ? Bir SQL deyimi SQL> ifadesi ardından yazılır. Bu şekilde SQL deyiminin yazılması işlemi sona erecektir. Bu program çalıştırıldığında aşağıdaki şekil üzerinde görüldüğü biçimde bir sonuç görüntülenir. Doğal olarak SQL deyimlerinin sonuna “. SQL*Plus. 5. biçiminde bir tanım yapılarak da arayüz terkedilebilir. ! Sorgulamanın sonucunu görmek için "Çalıştır" düğmesine basınız. SQL deyiminin sonunu bu şekilde algıladıktan sonra hemen çalışmaya başlayarak sonuçları görüntüler.SQL> EXIT.” işaretinin kaydedilmesi gerekiyor. Örneğin.

Dosya menüsünün Kaydet seçeneğini kullanmaktır. SQL> / tanımı kullanılır.4 SQL ve PL/SQL Dosyalarının Yaratılması ve Çalıştırılması SQL deyimlerinin ve PL/SQL bloklarının çalıştırılması için bir başka yol daha vardır. Örneğin test isimli bir SQL dosyası şu şekilde oluşturulabilir: SQL> SAVE test. SQL> RUN. Bunun için söz konusu deyim yada bloklar belirlenen bir isimle disk üzerinde saklanır ve gerektiğinde çağrılarak çalıştırılır. Bu şekilde yapılan saklama işlemleri sonucunda. veya kısaca. Onun yerine.5. 161 . bu deyim bir ara belleğe otomatik olarak kaydedilir. sonu . İkinci yol olarak. O halde bu deyimi bir sonraki adımda çalıştırmak gerektiğinde yeniden yazmaya gerek yoktur.Bir SQL deyimi veya bir PL/SQL bloğu SQL*Plus ortamında bu şekilde yazıldıktan sonra çalıştırılırsa. SQL*Plus’un SAVE komutu kullanılır. Bir SQL deyimini veya PL/SQL bloğunu saklamak için en basit yol.sql ile biten bir dosya yaratılmış olur. 5. Sonuç aynı biçimde elde edilir.

gerektiğinde bildirimler bölümünde bir başlangıç değer atanabilir. program içinde bu değişkene belirli bir değer atanabilir. doğal olarak gerektiğinde çağrılarak çalıştırılacaktır. Var olan bir SQL dosyasını çağırmak için SQL*Plus’un START komutu kullanılır. Örneğin. Bir değişken yada sabitin kullanılabilmesi için. daha önce yaratılmış bir SQL dosyası şu şekilde çağrılarak çalıştırılabilir: SQL> START C:\TEST\TEST. yani bir değer yerleştirilebilir.7 Değişkenler ve Değişmezler PL/SQL yordamlarında.6 Karakter Kümesi Bir PL/SQL programında belirli bazı karakterler kullanılabilir. musteri_no değişkenine aşağıda görüldüğü gibi. program çalışmaz. öncelikle bildirimler bölümünde. 5. değişkenler veya değişmezler kullanılabilir. Bu karakterler dışında herhangi bir karakter yer alırsa. Bir değişkene program içinde bu şekilde bir atama yapılabileceği gibi. 5. Programın işleyişi bundan etkilenmez. 162 . musteri_no NUMBER(5). bildirimler bölümünde bir değer atanabilir. PL/SQL programlarında aşağıda sıralanan karakterler yer alabilir: ! PL/SQL programları büyük harf-küçük harf ayrımına karşı duyarlı değildir. Yani bir deyim ya da değişken istenirse küçük. Bir değişkene bir değeri atamak için “:=” işareti kullanılır. Örneğin. istenirse büyük harflerle yazılabilir.Bir dosya yaratıldıktan sonra. Örneğin. Örneğin. diğer tüm programlama dillerinde olduğu gibi. ADI ve MUSTERI_NO isimli iki değişkeni programa tanıtmak için aşağıdaki tanım yapılır: DECLARE adı VARCHAR2(20). yani DECLARE bölümü içinde tanımlanmış olması gerekiyor. musteri_no değişkenine 196 değerini atamak için şöyle bir tanım yapılır: musteri_no := 196. Bir değişken bu şekilde tanımlandıktan sonra.

PL/SQL programlarında değişkenler yanı sıra değişmezler (sabitler) de tanımlanabilir. Buradan şu anlaşılmaktadır. Örneği görmek için linke tıklayınız 5.DECLARE adı VARCHAR2(20). musteri_no isimli değişken ise 5 uzunluklu bir NUMBER veri türüne sahiptir. PI isimli bir sabit şu şekilde tanımlanabilir: DECLARE PI CONSTANT REAL :=3. bazıları bildiğimiz SQL deyimleridir. Değişmezleri tanımlamak için CONSTANT anahtar kelimesi kullanılır.8 SQL Deyimlerinin PL/SQL İçinde Kullanımı PL/SQL blokları içinde BEGIN bloğunda amaca uygun deyimler yer almaktadır. SQL deyimlerinin neler olduğunu ve nasıl çalıştığını önceki konulardan biliyoruz. Bu tanımdan şu anlaşılmaktadır: Program içinde adı ve musteri_no isimli iki değişken kullanılacaktır. musteri_no NUMBER(5) :=196. 163 . adından da anlaşılabileceği gibi program içinde değeri değiştirilemeyen olanaklardır. PI isimli değişmez program içinde kullanılacaktır. Bu deyimlerin bir kısmı PL/SQL’e özgü deyimler ve kavramlar olmasına karşılık.14159 dur ve veri türü REAL olarak belirlenmiştir. Değişmezler. Veri türlerini daha ayrıntılı biçimde ele alarak inceleyeceğiz. adı isimli değişkenin veri türü VARCHAR2 ve uzunluğu 20 karakter olarak belirlenmiştir. PL/SQL blokları içinde bu değer değiştirilmeye çalışılmaz. SQL’in pek çok deyimi ve fonksiyonları PL/SQL içinde de aynen çalışır. ! Örnek içerisinde bir grup değişken ve sabit tanımı yapılmaktadır. Örneğin. Bu değişmezin değeri 3.14159.

Bu amaçla düzenlenmiş olan PL/SQL bloğunu görmek için linke tıklayınız DECLARE v_adi VARCHAR2(10) . SELECT sütun isimleri INTO (değişken adı veya kayıt adı} FROM tablo adı WHERE koşul. PL/SQL blokları içinde yer alacak SELECT sorgularında sadece bir satırın döndürülmesi gerektiği unutulmamalıdır. Her bir SELECT deyimi “.1 SELECT Deyiminin Kullanılması PL/SQL blokları içinde SELECT deyimi kullanılabilir.PL/SQL blokları DDL deyimlerini desteklemez. 5. BEGIN SELECT adi INTO v_adi FROM personel WHERE personel_no=101.8. bildiğiniz gibi. ! Burada INTO anahtar kelimesine dikkat etmek gerekmektedir. DROP TABLE ve bunun gibi DDL deyimlerini PL/SQL blokları içinde kullanamayız. seçilen sütun değerlerinin hangi değişkene ya da kayıta aktarılacağını belirlemektedir.” işareti ile son bulmalıdır. 164 . ! SELECT deyiminin kullanımında dikkat edilecek önemli bir nokta daha bulunmaktadır. Bunun için. Bu deyimler. Örnek Veri tabanında yer alan personel isimli tablodan personel numarası 101 olan personeli seçerek adını v_adi isimli bir değişken içine yerleştirmek istiyoruz. O nedenle CREATE TABLE. Bu kelime. ALTER TABLE. veri tabanı içindeki tabloları yaratma ve yok etme ya da özelliklerini değiştirme ile ilgilidir. Sözü edilen değişkenler PL/SQL bloğununun DECLARE bölümünde tanımlanmış olmalıdır. SQL deyimlerinin aşağıda belirtilen yapıya sahip olması gerekmektedir.

165 .ucret) VALUES(101. Örnek 1 Veri tabanında yer alan personel isimli tabloya bir kayıt eklemek istiyoruz. İlgili personelin ücret bilgisinin nasıl güncelleştirildiğini görmek için linke tıklayınız DECLARE v_ucret NUMBER :=1.'15/03/1970'.'BURAK'. Örnek 2 Veri tabanında yer alan personel isimli tabloda. personel numarası 101 olan personelin ücretine %25 zam yapmak istiyoruz. Amacımıza uygun olarak düzenlenen PL/SQL bloğunu görmek için linke tıklayınız BEGIN INSERT INTO personel(personel_no.adi.7000) END.25. güncelleme ve satır silme gibi işlemleri yerine getirmek mümkündür. Bunun için SQL’in aşağıda belirtilen deyimlerine başvurulur.giris_tar.… END.8.2 DML Deyimlerinin Kullanılması SQL’in DML deyimlerini kullanarak tablolara satır ekleme. 5.

yani değişiklikleri kalıcı hale getirmek ve sonuçları diğer kullanıcıların da görmesini sağlamak için COMMIT deyimini kullanıyoruz. BEGIN DELETE FROM personel WHERE personel_no=v_personel_no.25.9 Bağlı Değişkenler 166 .UPDATE veya DELETE deyimlerinden birinin çalıştırılması yeterlidir. COMMIT. bu sonucun diğer kullanıcıları da etkilemesini sağlamak için PL/SQL bloğuna COMMIT deyimini ekliyoruz. Bu şekilde başlayan bir işlemi sona erdirmek. / 5. personel numarası 101 olan personeli silmek istiyoruz. END. END.8.personel_no%TYPE :=101. Değişiklikleri geri almak için ise ROLLBACK deyimini tercih ediyoruz. 5. Bu amaçla hazırlanan PL/SQL bloğunu görmek için linke tıklayınız DECLARE v_personel_no personel. Örnek 3 personel tablosunda. END. Örnek personel tablosunda bir güncelleme yaptıktan sonra. Bu deyimleri PL/SQL blokları içinde de aynen kullanmak mümkündür. Bu amaçla hazırlanan PL/SQL bloğunu görmek için linke tıklayınız DECLARE v_ucret NUMBER :=1. Bunu biliyoruz. BEGIN UPDATE personel SET ucret=ucret*v_ucret WHERE personel_no=101.3 Hareket İşleme Deyimlerinin Kullanılması Veri tabanı hareketlerinin başlaması için INSERT.BEGIN UPDATE personel SET ucret=ucret*v_ucret WHERE personel_no=101.

personel tablosunda personel numarası 101 olan personelin adını seçmektedir. Örnek 1 Aşağıdaki PL/SQL deyimlerini göz önüne alalım. ardından o değişkenin veri türü belirlenir. Bu deyim şu şekilde tanımlanır: PRINT değişkenin adı. SQL*Plus ortamında daha önce tanımlanmış bir değişken PL/SQL içinde doğrudan kullanılabilir. Bu bölümde bir SELECT deyimi çalıştırılmaktadır. Örneğin. / Yazdığımız PL/SQL bloğu içerisinde yapılan tanımların açıklamalarını görmek için linke tıklayınız Yapılan tanımları tek tek açıklamak istiyoruz: Birinci satırdaki. BEGIN SELECT adi INTO v_adi FROM personel WHERE personel_no=101. Bir bağlı değişkenin içerdiği değeri görüntülemek için PRINT komutu kullanılır. Bu değişken PL/SQL bloğu tarafından kullanılmaktadır. Bloğun işlem kısmı BEGIN ile başlamaktadır. :g_adi := v_adi .Bağlı değişkene değer aktarılıyor. END. Bir bağlı değişken (bind variable) şu şekilde tanımlanır: VARIABLE değişkenin adı veri türü O halde bir bağlı değişkeni. yani PL/SQL bloğu dışında bir değişkeni tanımlamak için. Bu değişkenler PL/SQL bloğu dışında bir ortamda tanımlanır. Söz konusu deyim. SQL> VARIABLE g_adi VARCHAR2(10). Bunun için değişkenin başına (:) işareti yerleştirilir. PL/SQL bloğu başında SQL*Plus’un VARIABLE komutu yardımıyla g_adi değişkenini tanımlıyoruz..Bazı değişkenlerin bildirimi bazı durumlarda PL/SQL blokları içinde tanımlanmaz. SQL> DECLARE v_adi VARCHAR2(10) . VARIABLE deyimi içinde önce ilgili değişkenin adı. BEGIN 167 . ifadeleri bir g_adi isimli değişkeni tanımlamaktadır. PL/SQL bloğunun kullandığı değişken DECLARE bölümü içinde tanımlanmaktadır: DECLARE v_adi VARCHAR2(10) . -. SQL> VARIABLE g_adi VARCHAR2(10).

Bu işlemin ardından x değişkeni içeriği görüntülenecektir. Bu sonucu kullanabilmek için bir dış değişkene aktarıyoruz. PL/SQL bloğu içinde bir değişkenin değerini ya da herhangi bir mesajı doğrudan görüntülemek için bir başka yol izlenebilir. ! PRINT komutu g_adi isimli değişkenin içeriğini görüntülemek için çalıştırıldığında aşağıda görüldüğü biçimde bir sonuç elde edilir: G_ADI -------------------------------BURAK Örnek 2 Bir x bağlı değişkenini tanımladıktan sonra bu değişkene PL/SQL bloğu yardımıyla 100 değerini atamak istiyoruz. SQL> PRINT g_adi.SELECT adi INTO v_adi FROM personel WHERE personel_no=101. Sözü edilen dış değişkeni VARIABLE deyimi ile en başta tanımlamıştık. Artık g_adi isimli değişkenin içeriğini görüntüleyebiliriz. v_adi değişkeninin içerdiği değer g_adi değişkeni içine şu şekilde aktarılmaktadır: :g_adi := v_adi .10 Değerlerin Görüntülenmesi İçin Bir Diğer Yol Önceki konuda görüldüğü gibi. seçilen personel adı v_adi isimli değişken içine yerleşecektir. bir bağlı değişkenin değerini PRINT komutu ile görüntüleyebiliyoruz. Bu PL/SQL bloğu aşağıda görülen sonuç elde edilir: SQL> PRINT X. Bu yöntem yerine. Bunun için SQL*Plus ortamında PRINT komutu şu şekilde kullanılır. Böyle bir 168 . BEGIN :x:=100. X ---------100 5. END. Blok içindeki SELECT deyimi çalıştığında. / ! Son satırda “/” işareti yer aldığı için bu yordam çalışmaya başlar. Bu amaçla hazırlanan PL/SQL bloğunu görmek için linke tıklayınız SQL> SQL> 2 3 4 VARIABLE x NUMBER.

Bunun için.PUT_LINE()paketi kullanılır. adi INTO v_no. Bu paketin SQL*Plus ortamında geçerli olabilmesi için öncelikle. adi INTO v_no. Aksi takdirde söz konusu paket etkili olmayacaktır. Bu PL/SQL bloğu çalıştırıldığında SQL*Plus ekranında aşağıda belirtilen sonuç görüntülenir: BURAK Bu blok çalıştırıldığında sadece personelin adı görüntülenir.PUT_LINE (v_adi).Sonuç görüntüleniyor … DBMS_OUTPUT. v_adi FROM personel WHERE personel_no=101. Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız DECLARE v_no VARCHAR2(10) .amaca ulaşmak için. SQL> SET SERVEROUTPUT ON. öncelikle PL/SQL bloğunun SQL*Plus ortamında istenen sonucu verebilmesi için aşağıda görüldüğü biçimde bir tanım yapılmalıdır: SQL> SET SERVEROUTPUT ON. v_adi VARCHAR2(10) . BEGIN SELECT personel_no. Örnek Veri tabanındaki personel isimli tablodan 101 numaralı personelin adını bulacağız. END. PL/SQL bloğu farklı bir biçimde yazılır. -. BEGIN SELECT personel_no.PUT_LINE(mesaj veya değişken). 169 . komutunun çalıştırılmış olması gerekmektedir. Bu tanımın ardından aşağıdaki PL/SQL bloğunun çalıştırılması söz konusudur: DECLARE v_adi VARCHAR2(10) . Eğer personelin numarası da isminin sol tarafında görüntülenmek isteniyorsa. v_adi FROM personel WHERE personel_no=101. DBMS_OUTPUT. Bu paket şu şekilde tanımlanır: DBMS_OUTPUT.

Ancak değişkenler basit biçimde tanımlanabildiği gibi.11 Bildirimler Bölümü Bildirimlerin DECLARE ile başlayan bölümde tanımlandığını biliyoruz.11.Sonuç görüntüleniyor … DBMS_OUTPUT. Yukarıdaki blok çalıştırıldığında ise şu şekilde bir sonuç elde edilir: 101 BURAK 5.END. Bunun yerine.1 Varsayılan Değerler Bir değişkene DECLARE bölümünde “:=” ile belirli bir değer atayabiliyoruz. -. Bu bölümde değişken ve değişmezler tanımlanmaktadır. bir değişkene. ek bazı özelliklere de yer verilebilir. Bunun için DEFAULT anahtar kelimesi kullanılır. 5. Bu amaçla aşağıda belirtilen özellikler üzerinde duracağız. herhangi bir atama yapılmadığı sürece geçerli olmasını sağlamak üzere varsayılan değer atanabilir.PUT_LINE (v_no ||' ' ||v_adi). Örnek Aşağıdaki bildirimi göz önüne alalım: DECLARE 170 .

BOOLEAN := FALSE. yani boş bırakılamaz.11.3 %TYPE Kullanımı Bir değişkenin sahip olduğu veri türünü bir başka değişken için de geçerli kılınabilir. Bu tanımdan şu anlaşılmaktadır: fis_no isimli NUMBER veri türüne sahip bir değişkene 0 başlangıç değeri atanmaktadır. aynı anlamı taşımak üzere şu şekilde bir tanım yapılabilir: DECLARE fis_no durum NUMBER DEFAULT 0. BOOLEAN := FALSE. Böyle bir amaca ulaşabilmek için %TYPE anahtar kelimesinden yararlanılır. 5. durum isimli BOOLEAN veri türüne sahip bir değişkene FALSE değeri atanmaktadır.2 NULL Değerlerin Denetlenmesi Normal olarak bir değişken NULL değerler içerebilir. değişken bildirimlerine NOT NULL anahtar kelimeleri eklenebilir. Bunun yerine. Söz konusu değişkene daha sonra bir başka değer atanabilir. Bu tür bir sınırlama koyabilmek için. Bu anahtar kelime şu şekilde kullanılır: 171 .fis_no durum NUMBER(5) :=0. Bir değişkenin NULL değerler içermesini önlemek gerekebilir. Bu tanımdan şu anlaşılmaktadır: fis_no isimli NUMBER veri türüne sahip bir değişkene 0 başlangıç değeri. 5. Ancak hiçbir zaman NULL değer atanamaz.11. BOOLIAN DEFAULT FALSE. Örnek Aşağıdaki bildirimi göz önüne alalım: DECLARE fis_no durum NUMBER(5) NOT NULL :=0.

2)olduğunu kabul edelim.2). TUTAR%TYPE. REAL(9. Bu tanım yerine %TYPE kullanarak şu şekilde bir bildirim yapılabilir: DECLARE tutar bolum_tutar Örnek 2 Aşağıdaki PL/SQL bloğunu göz önüne alalım.2).2). O nedenle. Bu durumda. Bir başka değişkenimiz bolum_tutar olsun. REAL(9. DECLARE bölümünde tanımlanan değişken. BEGIN 172 . Aşağıda görüldüğü biçimde bir tanım yapılabilir: DECLARE tutar bolum_tutar REAL(9. Bu yeni değişkenin veri türünün de REAL(9.değişken%TYPE Örnek 1 Bir değişkenin aşağıda gösterildiği biçimde tanımlandığını varsayalım: DECLARE tutar REAL(9.ucret%TYPE :=1.25. değişken türünü belirlerken %TYPE ifadesinden yararlandık. Bu amaçla düzenlenmiş olan PL/SQL bloğunu görmek için linke tıklayınız DECLARE v_ucret personel. personel tablosunun ucret isimli sütunu ile ilişkilidir.2).

PL/SQL deyimleri yardımıyla bu kayıtlar işleme tabi tutulur. 5. Burada sözü edilen kayıt. bir imleç üzerine yerleştirilir ve imleç üzerinde bir kayıt kümesi oluşturulur. Burada iki kayıt tanımı yapılmaktadır. bir tablodan veya bir imleç (cursor) yardımıyla elde edilebilir. bolum_kayit c1%ROWTYPE. pers_kayit personel%ROWTYPE 173 . Örnek Aşağıdaki bildirimi göz önüne alalım: DECLARE pers_kayit personel%ROWTYPE CURSOR c1 IS SELECT adi_soyadi. İmleçleri ve kullanım biçimlerini daha sonraki derslerimizde ayrıntılı olarak ele alarak inceleyeceğiz. İmleç. bölüm_no FROM personel. ! Bu tanımdan şu anlaşılmaktadır: v_ucret değişkeni. END.11.4 %ROWTYPE İle Kayıt Türünün Belirlenmesi PL/SQL bildirimler bölümünde. Önceki konularımızda ayrıntılı biçimde öğrendiğimiz SQL’in SELECT deyimi ile bir tablodan okunan sonuçlar. kısaca söz etmek gerekirse. numara. Bunlardan birincisi .UPDATE personel SET ucret=ucret*v_ucret WHERE personel_no=101. O halde ayrıca veri türünü belirtmeye gerek yoktur. SQL deyimlerini çalıştırmak için gereksinim duyulan bellek alanlarıdır. personel tablosunun ucret isimli sütunu ile aynı veri türüne sahiptir. bir tablo içindeki satırın kayıt türünü simgelemek üzere %ROWTYPE anahtar kelimesi kullanılır.

Tanımlar arasında yer alan. Bu tanım. 174 . personel tablosundan SELECT deyimi ile seçilen sonuçlar için c1 imleci atanmaktadır.tanımıdır. numara. İkinci %ROWTYPE tanımı ise.12 Veri Türleri SQL ortamında kullanılan veri türleri PL/SQL ortamında da aynen geçerlidir. Aşağıdaki tablo bu veri türlerinin en çok kullanılanlarını içermektedir. Buna göre. SELECT deyiminin nasıl kullanıldığını ve yazılan ifadelerin ne anlama geldiğini önceki derslerden biliyorsunuz. 5. bir imleci belirlemektedir. Bu tanım. c1 imlecinden getirilen kayıtların saklandığı bolum_kayit isimli kayıdı belirlemektedir. satırı ise. bölüm_no FROM personel. biçimdedir. bolum_kayit c1%ROWTYPE. personel isimli bir tablodan okunan her bir kayıdı pers_kayit olarak belirlemektedir. Yani tablonun her bir satırı pers_kayit adıyla saklanmaktadır. CURSOR c1 IS SELECT adi_soyadi.

4 gigabayta kadar karakter verileri ifade eder. Varsayılan değer 1. Varsayılan değeri 1. Tanımda p ondalık hanelerin toplam sayısını. en uzun boyutu ise 2000 karakterdir. Değişken uzunluklu karakter veriyi ifade eder. en uzun boyutu ise 4000 karakterdir.Veri türü VARCHAR2(boyut) Anlamı Değişken uzunluklu karakter verileri ifade eder. s ise -84 ile 127 arasında bir değer olabilir. CHAR(boyut) NUMBER(p. En büyük boyutu 2000 olabilir. Boyutu belirlenmiş ikili (binary) verileri ifade etmekte kullanılır. 4 gigabayt kadar bir büyüklüğe sahip olabilir. sütunun alabileceği en fazla karakter sayısını sınırlar. Bir dış dosyada saklanan ikili verileri belirtir. Ondalıklı sayısal değerlerin ifade edilmesinde kullanılır. Belirlenen boyuttaki sabit uzunluklu karakter verileri ifade etmekte kullanılır. Tarih ve zaman verilerini ifade etmekte kullanılır. 4 gigabayta kadar ikili verileri ifade eder.s) DATE LONG CLOB RAW(boyut) LONG RAW BLOB BFILE 175 . Tanım içindeki boyut ifadesi. s ise ondalık noktasının sağındaki hanelerin sayısını belirler. 2 gigabayta kadar boyuta sahip değişken uzunluklu ikili verileri ifade etmekte kullanılır. Burada p değeri 1 ile 38. Boyutu 2 gigabayt kadar olabilir.

VARCHAR2(200). ssk_primi := brut_ucret*oran.2). Üstelik mantıksal ifadeler de tanımlanarak sonucun doğru ya da yanlış olma durumuna göre TRUE ya da FALSE değerleri atanabilecektir. sayac := sayac+1. zamli_ucret := aylik_ucret*1. Örneğin bir aritmetik ifade tanımlanarak sonucunun atanması mümkündür. 5.45. Mantıksal değerlerin atanması ise durum := calisilan_saat>225.13 İfadeler Değişkenlere doğrudan bir değerin atanması yerine. calisilan_saat değişkeninin içerdiği değer 225 sayısal değerinden büyük ise. BUNBER(8). bir ifadenin atanması da söz konusu olabilir. Örnek Aşağıdaki ifadeleri inceleyiniz. yani belirtilen koşul sağlanıyorsa durum değişkeninin değeri TRUE olacaktır.Örnek Aşağıdaki bildirimler bölümünde çeşitli veri türleri tanımlanmaktadır: DECLARE adi personel_no ucret adres dogum_tar VARCHAR2(20). Bu örneğe göre. DATE. 176 . NUMBER(7.

1 Aritmetik İşleçler Toplama. zam := ucret*zam. büyüklüklerin karşılaştırılması ve mantıksal karşılaştırmaların yapılmasını sağlamak için işleç (operatör) adı verilen simgelere başvurulur.14 İşleçler Aritmetik işlemler başta olmak üzere. 5. Bu işleçler belirli bir sıraya göre işlem görürler. Aritmetik İşleçleri ve anlamlarını tekrar görmek için TEKRAR düğmesine Örnek Aşağıdaki satırları inceleyiniz. tıklayınız.5. çarpma ve bölme işlemlerini yapmaya yönelik işleçler aritmetik işleçler olarak bilinir.2 Karşılaştırma İşleçleri 177 . çıkarma. PL/SQL programlarında en çok aşağıda belirtilen işleçler kullanılmaktadır. Bölme işlemlerinde paydanın sıfır değere sahip olmamasına dikkat etmek gerekiyor. 5.14. sonuc_1 := yıllık_ucret/ 12.14. Bu ifadeler içinde aritmetik işleçlerin kullanıldığını görüyoruz: deger := deger + sonuc. Burada üç ifade yer almaktadır. Yan taraftaki tablo üzerinde aritmetik işleçleri tanımlıyoruz.

3 Mantıksal İşleçler Mantıksal işleçler. ikincisine ise y adını verelim. ! Karşılaştırma İşleçlerini ve anlamlarını tekrar görmek için 'TEKRAR' 5. Bu iki koşulun değil. Koşullardan birincisine x . Karşılaştırma işleçlerini yandaki tablo üzerinde sunuyoruz. Bu işleçleri aşağıdaki tablo üzerinde veriyoruz: İki veya daha fazla koşul.14. Söz konusu bu işleçler çoğunlukla program içindeki karşılaştırma deyimleri ile birlikte kullanılır. 178 . doğruluk değerleri göz önüne alınarak birlikte değerlendirilir. düğmesine tıklayınız. ve ile veya işleçlerine göre doğruluk tablosu aşağıda verildiği gibidir.Bu işleçler iki sayısal değeri ya da iki karakteri karşılaştırmak amacıyla kullanılır. iki veya daha fazla sayıdaki koşulun birlikte sınanması amacıyla kullanılırlar.

Eğer açıklama satırı birden fazla ise. Yani program satırlarının belgelenmesini sağlar. Açıklama satırını PL/SQL programı içine yerleştirmek için. açıklama satırının başlangıcına “/*” işareti. Örneğin şu şekilde bir açıklama satırı oluşturulabilir: --Net ücret hesabı yapılıyor.15 Açıklama Satırları PL/SQL programları arasına açıklama satırları eklenebilir. Örnek olarak aşağıdaki tanım yapılabilir. /* Net ücret hesabı yapılıyor. Sadece programın bazı bölümlerini açıklamak amacıyla kullanılır. Bu satırlar işlem görmez. yukarıdaki tabloda yer alan doğruluk değerleri kullanılır.. sonuna ise “*/” işareti kaydedilir.. her satırın başına bu işaretleri kaydetmek yerine.Program içinde birden fazla koşul birlikte kullanılıyorsa. Bunun için aşağıda belirtilen hesaplamlar gerçekleştirilir */ 179 . satırın baş tarafına “--“ işaretleri kaydedilir. 5.

180 .

181 .

182 .

183 .

184 .

• • • Koşullu Denetim-IF Deyimi Döngü İşlemleri GOTO Deyimi ile Bir Etikete Sapılması anlatılmaktadır.1 Koşullu Denetim .PROGRAM DENETİMİ Bu bölümde.. ifade içinde belirtilen koşulun “doğru” olması halinde.THEN ile END IF arasında belirtilen deyimler çalışır. 185 .THEN deyimine başvurulur.. Bu deyim şu şekilde tanımlanır: IF koşul THEN Deyimler.IF Deyimi Bir PL/SQL programında karşılaştırma işlemi sonucunda bir eylemin yapılması söz konusu ise. Bölüm Hedefi Bu bölümde aşağıda sıralanan konular ele alınarak incelenecektir: • • • • • • • • • Koşullu denetim işlemleri IF deyiminin kullanımı Sonsuz döngüler Sonsuz döngüden çıkış Koşullu döngüler Belirli sayıda tekrarlar Değişkenler ve değişmezler Döngü etiketlerinin kullanımı GOTO deyiminin kullanımı 6. END IF Bu tanıma göre. Eğer koşulun doğruluk değeri “yanlış” ise bu aralıkta içinde tanımlanan deyim işlem görmez. yani belirli deyimlerin çalıştırılması gerekiyorsa IF. IF.

yani aşağıdaki şekilde bir dış değişken tanımlanır. Mesajı görüntülemek için mesaj isimli bir bağlı değişken. END IF.Örnek 1 PL/SQL bloğu içinde bir sayi isimli bir değişken tanımladıktan sonra bu değişkenin içine 90 değerini yerleştireceğiz. SQL> VARIABLE mesaj VARCHAR2(30). Daha sonra bu değişken değerini IF deyimi ile denetleyerek 100 den küçük olup olmadığını denetleyeceğiz. Bu koşul gerçekleşiyorsa bir mesaj değeri elde edilecektir. 186 . Bu amaçla yazılan PL/SQL bloğunu görmek için linke tıklayınız DECLARE sayi number(5) :=90. / Program çalıştıktan sonra mesaj hemen görüntülenmez. Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız SQL> PRINT mesaj. END. mesaj isimli değişkenin içeriğini görüntülemek için PRINT deyimini kullanıyoruz. BEGIN IF sayi < 100 THEN :mesaj :='kosul dogru '.

SQL> VARIABLE mesaj VARCHAR2(40). Bu sözcük IF deyimi içinde şu şekilde yer alacaktır: IF koşul THEN deyim 1. END.1 Koşul Gerçekleşmiyorsa Karşılaştırma işlemlerinde koşul gerçekleştiğinde. ELSE deyim 2. Peki bu koşul gerçekleşmediğinde nasıl bir yol izlenecektir? Bir koşulun gerçekleşmemesi durumunda yerine getirilecek eylemleri belirlemek için ELSE sözcüğü kullanılır. Bunun için mesaj' ı yerleştirmek üzere bir dış değişken tanımlıyoruz. MESAJ ------------------------------5000 DEN FAZLA ÜCRET ALAN VAR. / Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız Bu PL/SQL bloğu çalıştırıldıktan sonra PRINT komutu ile mesaj değişkeninin içeriğini öğreniyoruz: SQL> PRINT mesaj. 5000' den fazla ücret alan olup olmadığını denetlemek istiyoruz. END IF. 6..'. Bu amaçla yazılan PL/SQL bloğunu görmek için linke tıklayınız DECLARE buyuk_ucret NUMBER(9). 187 .1. IF buyuk_ucret > 5000 THEN :mesaj :='5000 den fazla ücret alan var.MESAJ -------------------------------KOŞUL DOĞRU Örnek 2 personel tablosunu okuyarak. yani “doğru” değerini aldığında IF içinde tanımlanan deyimlerin işlem gördüğünü öğrenmiş bulunuyoruz. BEGIN SELECT MAX(ucret) INTO buyuk_ucret FROM personel..

Bu sayının 200 den küçük olup olmadığını denetlemek istiyoruz. Aksi durumda. / Bu program çalıştırıldıktan sonra PRINT deyimi ile aşağıdaki sonuç elde edilir. BEGIN IF sayi < 100 THEN :mesaj :='KOŞUL DOĞRU '. Mesajı görüntülemek için MESAJ isimli bir bağlı değişken. yani bir dış değişken tanımlıyoruz. ELSE :mesaj :='KOŞUL YANLIŞ '. END. Koşulun gerçekleşmediği durumda farklı bir mesajı görüntülemek için ELSE deyimi kullanılıyor. Bu amaçla düzenlenmiş olan PL/SQL bloğunu görmek için linke tıklayınız DECLARE sayi number(5) :=200. yani koşulun doğruluk değeri “yanlış” ise deyim 2 deyimi işlem görür.END IF Bu tanıma göre. ifade içinde belirtilen koşulun “doğru” olması halinde. END IF. SQL> VARIABLE mesaj VARCHAR2(30). Örnek Bir SAYI değişkenine 200 değerini yerleştiriyoruz. IF içinde belirtilen deyim 1 çalışır. 188 .

MESAJ -------------------------------KOŞUL YANLIŞ 6.Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız SQL> PRINT mesaj.. Bu durumda END IF deyimleri de ortak hale gelmiş olur. ! Probleme uygun akış şemasını görmek için düğmeye tıklayınız. ELSE ve IF kelimeleri ELSIF biçiminde birleştirilerek yandaki ifade biçimi de kullanılabilir..THEN.ELSE.1. Bazı PL/SQL bloklarında bir IF deyimi içinde bir başka IF deyimi kullanılabilir.2 İç İçe IF Deyimleri Koşul ifadelerinin tanımlanması amacıyla IF. 189 . Bu tanım yerine. Örnek Verilen üç adet sayısal değerin en küçüğünü bulan bir PL/SQL bloğu yazmak istiyoruz. IF koşul THEN deyimler ELSE IF koşul THEN deyimler ELSE deyimler END IF.. IF koşul THEN deyimler ELSEIF koşul THEN deyimler ELSE deyimler END IF.END IF deyimlerinin kullanılabildiğini görmüş bulunuyoruz. END IF.

Program içinden elde edilen sonucu aktarmak için bir SONUC isimli değişkeni SQL*Plus ortamında şu şekilde tanımlıyoruz: SQL> VARIABLE sonuc NUMBER. Amacımıza uygun PL/SQL bloğunu görmek için linke tıklayınız PL/SQL bloğu ise şu şekildedir: 190 .

/ Bu blok çalıştırıldıktan sonra sonuc isimli değişkenin içeriği görüntülenir: Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız SQL> PRINT sonuc.arasından en küçük olanını seçer. :sonuc :=kucuk.-. ELSE KUCUK:=b.2. b NUMBER(5) :=5.1 Sonsuz Döngüler 191 . END. c NUMBER(5) :=11..Bu PL/SQL bloğu üç sayısal değer -. DECLARE a NUMBER(5) :=7.2 Döngü İşlemleri PL/SQL bloklarının belirli bölümlerinin defalarca işlenmesi söz konusu olabilir. END IF. SONUC ---------5 6. kucuk NUMBER. ELSIF b>c THEN KUCUK :=c. PL/SQL bloklarında döngü işlemleri farklı biçimlerde gerçekleşebilmektedir: 6. BEGIN IF a < b THEN IF b<c THEN kucuk :=a. END IF. Bunu sağlamak üzere döngülerden yararlanılır.

PL/SQL bloklarında kullanılabilecek döngüler içinde en basit yapılı olanlarıdır. Söz konusu döngü şu şekilde tanımlanmaktadır: LOOP deyimler. Bu tür döngülere basit döngüler'in yanı sıra sonsuz döngüler adı da verilmektedir. 6. END IF.1 Sonsuz Döngüden Koşulsuz Çıkış Sonsuz döngüler doğal olarak sorun yaratcaktır. doğal olarak bir karşılaştırma işlemi sonucunda olacaktır. O nedenle bu tür döngüye sonsuz döngü deniliyor. 192 . Bu deyim. Döngüden çıkma olasılığı yoktur. END LOOP. … END LOOP.1. Görüldüğü gibi bu döngünün sonunu belirleyen herhangi bir deyim yoktur. EXIT deyimi çoğunlukla bir IF deyimi içinde kullanılarak döngü sayısı denetlenir. Peki bu durumda döngüden nasıl çıkılacaktır? Sonsuz bir LOOP döngüsünden çıkmak için EXIT deyimi kullanılabilir. Bunun anlamı.2. LOOP … IF koşul THEN EXIT.

BEGIN LOOP -. Biz sadece birinci sütununa birden başlayan ve her defasında 1 artan bir sayısal değer yerleştireceğiz.Örnek Bir PERSON isimli tabloya altı adet kayıt eklemek istiyoruz. IF sayi >506 THEN EXIT. Tablo iki sütundan oluşmaktadır. END LOOP. NULL). İkinci sütun ise boş kalacaktır. Yeni eklenen personel numaraları ise 500 ile 506 arasında olacaktır. --Eğer 506 numaraya ulaşılmış ise --Döngü terkedilecektir. sayi:= sayi + 1. Tablonun içeriğini görüntülediğimizde. END IF. Amacımıza uygun PL/SQL bloğunu LOOP döngüsü ile yaratıyoruz. söylediklerimizin gerçekleştiği anlaşılır: 193 . Bu amaçla yazılmış PL/SQL bloğunu görmek için linke tıklayınız DECLARE sayi NUMBER := 500. INSERT INTO person(per_no.. END.per_adi) VALUES (sayi.Tabloya kayıt ekleme işlemi. PERSON isimli tablo içine 7 adet yeni kayıt eklendiği ve personel numarası olarak 500 ile 506 sayıları arasındaki değerlere yer verildiği görülecektir.. / Bu blok çalıştırıldığında.

Sonsuz döngülerden çıkmak üzere.2 Sonsuz Döngüden Koşul Gerçekleştiğinde Çıkış Bir döngüden belirli bir koşul gerçekleştiğinde IF deyimi ve EXIT deyimi yardımıyla nasıl çıkabileceğimiz öğrenmiş durumdayız. Örnek 194 . bu yöntem yerine çok daha kullanışlı bir başka yöntem bulunmaktadır.Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız SQL> SELECT * FROM PERSON.1.--------500 501 502 503 504 505 506 6. … END LOOP. Bu tanıma göre. Bu deyim aşağıda görüldüğü biçimde tanımlanıyor: LOOP … EXIT WHEN koşul.2. PER_NO PER_ADI ---------. Bunun için EXIT WHEN deyimleri kullanılır. LOOP döngüsü içinde EXIT WHEN ile belirlenen bir koşul gerçekleştiğinde bu döngü terk edilecektir.

Bu amaca uygun olarak yazılmış PL/SQL bloğunu görmek için linke tıklayınız DECLARE sayi NUMBER := 500. İkinci sütun ise boş kalacaktır.. Bu kez WHEN EXIT deyimlerini kullanarak sonsuz döngüden çıkacağız. Biz sadece birinci sütununa birden başlayan ve her defasında 1 artan bir sayısal değer yerleştireceğiz. Söz konusu WHILE döngüsü şu şekilde tanımlanmaktadır: WHILE koşul 195 . Koşul sağlanmadığı sürece döngü içindeki hiçbir deyim çalışmayacaktır. PER_NO PER_ADI ---------. NULL).Önceki örneği yeniden ele alalım.per_adi) VALUES (sayi. Bu örnek şu şekilde idi: Bir PERSON isimli tabloya altı adet kayıt eklemek istiyoruz. Yeni eklenen personel numaraları ise 500 ile 506 arasında olacaktır. BEGIN LOOP -. Bu denetim döngü bloğunun başında yapılır. Bu döngü aşağıdaki şekil üzerinde görüldüğü biçimde çalışmaktadır.2 Koşullu Döngüler-WHILE Döngüleri Bir koşulun gerçekleşmesi durumunda belirli işlemlerin tekrarlanması söz konusu ise WHILE döngülerinden yararlanılır. Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız SQL> SELECT * FROM PERSON.. END. INSERT INTO person(per_no. Tablo iki sütundan oluşmaktadır. / Bu PL/SQL bloğu çalıştırıldıktan sonra PERSON tablosuna belirlenen miktarda kayıt eklenir. sayi:= sayi + 1. END LOOP. EXIT WHEN sayi >506. --Eğer 506 numaraya ulaşılmış ise --Döngü terkedilecektir.Tabloya kayıt ekleme işlemi.2. Amacımıza uygun PL/SQL bloğunu LOOP döngüsü ile yaratıyoruz.--------500 501 502 503 504 505 506 6.

LOOP deyimler.sonuclar listeleniyor.daha kucuk olanlari listeler DECLARE n NUMBER := 5.. Amacımıza uygun PL/SQL bloğunu görmek için linke tıklayınız. WHILE deyimini kullanarak bir PL/SQL bloğu hazırlayabiliriz.PUT_LINE()paketini kullanıyoruz.. BEGIN WHILE i<n LOOP i:=i+1. i NUMBER :=0. / 196 . -. -. DBMS_OUTPUT. END LOOP.PUT_LINE (i). Listeyi elde etmek için DBMS_OUTPUT. Bu amaçla aşağıda görüldüğü biçimde. END. END LOOP. Örnek 1 5 sayısal değerinden daha küçük olan tüm tamsayıları listelemek istiyoruz.Bir sayisal degerden -.

Yeni eklenen personel numaraları 500 ile 506 arasında olacaktır.. END LOOP. İkinci sütun ise boş kalacaktır.Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız 1 2 3 4 5 Örnek 2 Daha önce ele alarak inceledğimiz bir örneği yeniden göz önüne alıyoruz: Bir PERSON isimli tabloya altı adet kayıt eklemek istiyoruz. NULL). Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız SQL> SELECT * FROM PERSON. Amacımıza uygun PL/SQL bloğunu bu kez WHILE döngüsü ile yaratıyoruz. sayi:= sayi + 1. PER_NO PER_ADI ---------. END.Tabloya kayıt ekleme işlemi. / Bu blok çalıştırıldığında PERSON tablosu içine belirtilen kayıtlar eklenir. BEGIN WHILE sayi <= n LOOP -. Tablo iki sütundan oluşmaktadır.--------------500 197 .per_adi) VALUES (sayi. DECLARE sayi NUMBER := 500. n NUMBER :=506. INSERT INTO person(per_no. Biz sadece birinci sütununa birden başlayan ve her defasında 1 artan bir sayısal değer yerleştireceğiz. Amacımıza uygun PL/SQL bloğunu görmek için linke tıklayınız.

END LOOP. Bu deyimden şu anlaşılmaktadır: Döngü bir sayaca göre yapılacaktır. 198 . Sayaç tamamlandığında döngü terk edilerek bir sonraki deyim işlem görmeye başlar. Yani her bir döngü işlemi sayılacaktır.3 Belirli Sayıda Tekrarlar-FOR Döngüleri PL/SQL bloğu içinde bir ya da daha fazla sayıda deyimin belirli bir koşulun gerçekleşmesine dek tekrarlanması söz konusu ise FOR deyimi kullanılır. Bu amaçla hazırlanmış PL/SQL bloğunu görmek için linke tıklayınız..501 502 503 504 505 506 6. Bu deyim şu şekilde tanımlanmaktadır: FOR sayaç IN alt_sınır. Döngü işlemi sayaç tamamlanıncaya dek devam edecektir. Örnek 1 0 ile 5 arasındaki sayısal değerleri listelemek için bir PL/SQL bloğu hazırlayabiliriz.üst sınır LOOP deyimler.2.

DBMS_OUTPUT. END LOOP..tüm tamsayilarin toplamlarini hesaplar.Döngü tanımlanıyor.sonuc listeleniyor. END LOOP. -. son NUMBER :=5.. BEGIN FOR i IN baslangic..5 sayılarının toplamı olan 15 değeri görüntülenir. Başlangıc ve son sayılar bu toplama dahil edilmeyecektir.Bu program girilen iki tamsayi arasinda kalan -. -.sonuclar listeleniyor..PUT_LINE (i). toplam NUMBER :=0. FOR i IN 0.. Amacımıza uygun PL/SQL bloğunu görmek için linke tıklayınız.PUT_LINE (toplam).3. END.. / Bu blok çalıştırıldığında 1. END. DECLARE baslangic NUMBER :=1.4..5 LOOP -. 199 ..DECLARE BEGIN -.son LOOP toplam:=toplam+i. DBMS_OUTPUT. / Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız 0 1 2 3 4 5 Örnek 2 Klavye yardımıyla girilen iki tamsayı arasında kalan tüm tüm sayıların toplamını bulmak istiyoruz.2.

6. <<durum1>> LOOP deyimler. Döngüden çıkış deyimi olarak kullanılan EXIT deyimi sadece en içteki döngüden çıkışı sağlar. İkinci LOOP içinde yer alan EXIT deyimi çalıştığında. Bir döngüyü etiketlendirmek için şu şekilde bir tanım yapılır: <<etiket>> Örneğin durum1 biçiminde etiketlenen bir LOOP döngüsü şu şekilde etiketlendirilebilir. Örneğin bir LOOP döngüsü içinde bir başka LOOP döngüsü yer alabilir. döngülerden çıkış anında bir sorun ile karşılaşılır. END LOOP durum1. Bu tür döngülerde. her iki döngü de terk edilir.4 Döngü Etiketleri Bazı uygulamalarda içi içe döngüler yer alabilir. iç içe iki LOOP döngüsü bulunmaktadır. Böyle durumlarda döngü etiketleri kullanılabilir.2. <<son1>> LOOP 200 . Ancak bazı durumlarda iç içe döngüden tümüyle çıkmak söz konusu olabilir. Örnek Aşağıdaki PL/SQL bloğu içinde.

Örneğin. … <<satir_gir>> 201 . … END LOOP son1. Doğal olarak böyle bir işlemin gerçekleşebilmesi için belirtilen etiketin blok içinde tanımlanmış olması gerekmektedir.… EXIT son1 WHEN …. programlar içinde GOTO deyiminin kullanılması tavsiye edilmez. bir IF deyiminde THEN bloğunda GOTO deyimi ile ELSE bloğun atlamak yanlış bir davranış olacaktır. Böyle olunca. Bu deyim dikkatli biçimde kullanılmalıdır. END LOOP. … LOOP 6. GOTO deyimi şu şekilde tanımlanır: GOTO etiket. Bu deyim. blok içinde etiketlenen herhangi bir satıra sapılmasını sağlar. Örnek Blok içinde satir_gir isimli etikete sapılmasını sağlayan tanım aşağıda gösterildiği biçimde yapılabilir: BEGIN … GOTO satir_gir.3 GOTO Deyimi İle Bir Etikete Sapılması PL/SQL programları birer yapısal program olarak değerlendirilebilir.

INSERT INTO personel VALUES … END. 202 .

203 .

204 .

205 .

206 .

678 vb gibi herhangi BINARY_INTEGER değerleri. Farklıkları bulunmaktadır. Onun yerine. Bölüm Hedefi Bu bölümde aşağıda sıralanan konular ele alınarak incelenecektir: • • • • • • PL/SQL Tablolarının (dizilerinin) Kullanımı Tablolar Nasıl Yaratılır? Tabloların Öznitelikleri Kullancı Tanımlı Kayıtlar Kayıtlar Nasıl Tanımlanır? Kayıtların Kullanılması 7. dizilerde elemanların konumlarını belirten ve sıfırdan başlayan ardışık indeks sayıları kullanılmaktadır. 455. PL/SQL tablolarının boyutları dinamiktir ve istenildiği kadar büyüyebilir. Aslında PL/SQL tabloları bir diziye benzer. 207 . örneğin 101. PL/SQL bloklarında dizi (array) kullanma gereksinimini karşılar. Ancak her yönüyle bir veri tabanı tablosuna benzemez. aynı türdeki verileri içerir. PL/SQL tabloları veri tabanı tablolarının bir benzeridir. PL/SQL tabloları ise bu tür indeksleri kullanmaz. Bir diğer fark. PL/SQL tablolarının bildiğimiz dizilerden de bazı farklılıkları bulunmaktadır. Bu tablolar.1 PL/SQL Tabloları Bu bölümde özel bir tablo biçimiyle karşı karşıyayız. Dizilerde olduğu gibi. yani personel numaralarını indeks olarak kullanabilir. Bu tablonun her bir elemanı bir benzersiz (unique) indekse sahiptir. Dizilerin boyutları sabit olmasına karşılık.PL/SQL TABLOLARI VE KAYITLARI Bu bölümde. PL/SQL tabloları. PL/SQL tabloları adını taşıyan veri yapılarıdır. • • PL/SQL Tabloları Kullanıcı Tanımlı PL/SQL Kayıtları anlatılmaktadır.

Bir PL/SQL tablosu yanda belirtildiği biçimde yaratılır. Tablonun indeksi BINARY_INTEGER veri türüne sahip olmalıdır.1. Bu veri türü -2147483647 ile +2147483647 arasındaki tamsayıları simgeler.7. Tablonun veri türü tanımlandıktan sonra. Bu atama şu şekilde gerçekleştirilebilir: 208 . Tablo için veri türü şu şekilde tanımlanır: TYPE tablo veri türü IS TABLE OF veri türü INDEX BY BINARY_INTEGER. PL/SQL blokları içinde DECLARE bölümünde tanımlanması gerekmektedir.1 PL/SQL Tablolarının Yaratılması PL/SQL tablolarının kullanılabilmesi için. Bu tablonun PL/SQL blokları içinde kullanılabilmesi için bir değişkene atanması söz konusu olacaktır.

ucret_tablo ucret_turu. DECLARE TYPE ucret_turu IS TABLE OF personel. Bunun için. söz konusu tablonun elemanlarına indeks yoluyla erişilir. Örnek 1 Bir PL/SQL tablosu içine üç değeri yerleştirdikten sonra bu değerleri tek tek görüntülemek istiyoruz. tarih_dizi tarih. Burada TYPE deyimi ile bir PL/SQL tablosu için veri türü tanımı yapılmaktadır. Örnek 1 Bir PL/SQL tablosu yaratmak istiyoruz. bu tanım bir değişkene atanarak.1. 7.tablo adı tablo veri türü. tablo_adı (indeks) Örneğin test_tablo isimli bir PL/SQL tablosunun üçüncü elemanına ulaşmak için.2 PL/SQL Tablolarının Kullanılması Bir PL/SQL tablosu tanımlandıktan sonra doğal olarak bloklar içinde kullanılması söz konusu olacaktır. 209 . Tanımın hemen ardından. test_tablo(3)… biçiminde bir tanım yapılabilir. Bir PL/SQL tablosuna gereksinim duyulduğunda başvurmak gerekecektir.ucret%TYPE INDEX BY BINARY_INTEGER. ! Amacımıza uygun tablo tanımını görmek için tablo tanımı düğmesine tıklayınız. bloklar içinde kullanılabilmesi için hazır hale getirilmektedir. Bu tablo tarih veri türüne sahip veriler içerecektir. DECLARE TYPE tarih IS TABLE OF DATE INDEX BY BINARY_INTEGER.

test_tab(3) :=125.. BEGIN -. END..PL/SL tablosuna üç değeri yerleştirdikten -. FOR i IN 1.3 LOOP -.PUT_LINE (test_tab(i)).. TYPE ucret_turu IS TABLE OF personel. -.tablo tanımlanıyor. Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız.sonuc listeleniyor.Amacımıza uygun PL/SQL bloğunu görmek için linke tıklayınız..ucret%TYPE INDEX BY BINARY_INTEGER.. ucret_tab ucret_turu.sonra bu değerler görüntülenecektir… DECLARE -. Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız 101 119 125 Örnek 2 Veri tabanında yer alan personel tablosunda en yüksek ücretin ne olduğunu belirleyerek..PL/SQL tablosuna yerleştiriliyor. BEGIN -.tablo tanımlanıyor. DECLARE -.tabloya değerler yerleştiriliyor. test_tab(1) :=101.. TYPE test_turu IS TABLE OF NUMBER INDEX BY BINARY_INTEGER. test_tab test_turu. test_tab(2) :=119.personel tablosundan okunan değer -. DBMS_OUTPUT. bu değeri bir tablo içine yerleştirmek istiyoruz. 210 . END LOOP.

. Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız. DBMS_OUTPUT.1. MIN(ucret) INTO ucret_tab(1) . ucret_tab(2) FROM PERSONEL. DBMS_OUTPUT. TYPE ucret_turu IS TABLE OF personel.3 Tablo Öznitelikleri 211 . END. Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız 8750 2000 7..PUT_LINE (ucret_tab(1)). personel ücetleri arasında en fazla olanı SELECT deyimi ile bulunur ve bu değer ucret_tab tablosunun birinci elemanı olarak atanır.tablo tanımlanıyor. DECLARE -. DBMS_OUTPUT.PUT_LINE (ucret_tab(1)). SELECT MAX(ucret).personel tablosundan okunan değerler -.ucret%TYPE INDEX BY BINARY_INTEGER. SELECT MAX(ucret) INTO ucret_tab(1) FROM PERSONEL. ucret_tab ucret_turu. Bu blok çalıştırıldığında.PL/SQL tablosuna yerleştiriliyor.END. BEGIN -. Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız 8750 Örnek 3 Bu kez aynı tablodan en fazla ve en az ücretleri elde ederek PL/SQL tablosu içine yerleştirmek ve sonuçları listelemek istiyoruz.PUT_LINE (ucret_tab(2)).

öznitelik 212 . Bunun için tabloya ilişkin belirli öznitelikler (attribute) kullanılabilmektedir. PL/SQL tablo öznitelikleri şu şekilde tanımlanır: tablo adı. Aşağıda bu öznitelikleri özetliyoruz.PL/SQL tabloları yaratıldıktan sonra üzerinde birçok işlem yapılabilir.

213 .

personel tablosundan okunan değerler -.ucret%TYPE INDEX BY BINARY_INTEGER.. ucret_tab(2) FROM PERSONEL. TYPE ucret_turu IS TABLE OF personel.3. Bunu sağlamak için COUNT kullanılıyor.7. BEGIN -. END LOOP. FOR i IN 1.. MIN(ucret) INTO ucret_tab(1) .1.ucret_tab. Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız.PUT_LINE (ucret_tab(i)). SELECT MAX(ucret). ucret_tab ucret_turu.PL/SQL tablosuna yerleştiriliyor..COUNT Örnek personel tablosunda en az ve en fazla ücretleri elde ettikten sonra bir PL/SQL tablosuna yerleştiriyoruz ve daha sonra bu tablonun elemanlarını ekran üzerinde listeliyoruz.tablo tanımlanıyor.COUNT LOOP DBMS_OUTPUT. Döngü sınırı PL/SQL tablosunun eleman sayısı kadar olmalıdır. Böyle durumlarda PL/SQL tablolarının COUNT özniteliği kullanılır.1 Tablonun Eleman Sayısı Bazı uygulamalarda PL/SQL tablosunun kaç elemandan oluştuğunu bulmak gerekebilir. Listelemeyi FOR döngüsü ile yapıyoruz. 214 . DECLARE -. END. Bu öznitelik şu şekilde tanımlanıyor: tablo adı.

tablo tanımlanıyor.LAST Örnek Bir dizi içine beş adet sayısal değer yerleştirdikten sonra. Bu nitelikler şu şekilde tanımlanıyor: tablo adı.2 Tablonun İlk ve Son Elemanları Bir PL/SQL tablosunun ilk ve son elemanının indeksini elde etmek gerekebilir. TYPE test_turu IS TABLE OF NUMBER INDEX BY BINARY_INTEGER.. 215 . tablonun birinci ve sonuncu elemanının indekslerini elde etmek istiyoruz. Bu amaçla söz konusu PL/SQL tablolarının FIRST ve LAST öznitelikleri kullanılır. Bu amaca yönelik olarak düzenlenen PL/SQL bloğunu görmek için linke tıklayınız.FIRST tablo adı.Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız 8750 2000 7.1. test_tab test_turu.3. DECLARE BEGIN -.

tabloya değerler yerleştiriliyor. DBMS_OUTPUT. 216 . DELETE DELETE(n) DELETE(m.PUT_LINE ('İlk=' ||test_tab. İkinci tanım belirli bir n satırının silinmesini sağlar. -.. Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız İlk=1 Son=5 7.n) Birinci tanım tablonun tüm elemanlarının silinmesini sağlar. test_tab(3) :=125.END.3 Tablo Elemanlarının Silinmesi Bir PL/SQL tablosunun belirli bir satırı ya da birden fazla satırı silinebilir.1. test_tab(2) :=119. Bu amaçla DELETE özniteliğinden yararlanılır. test_tab(5) :=196. test_tab(4) :=35.3.PUT_LINE ('Son=' ||test_tab.LAST).FIRST). Bu öznitelik farklı biçimlerde kullanılabilir. DBMS_OUTPUT. Burada sözü edilen n ilgili tablonun indeks numarasıdır. Son tanım ise n ve m gibi belirli iki satır arasındaki tüm satırların silinmesini sağlar. test_tab(1) :=101.

DECLARE -.tablonun 4. elemanları tablodan silmek istiyoruz. test_tab(5) :=196... test_tab(2) :=119. Bu durumda programı aşağıda gösterildiği biçimde hazırlıyoruz.tablonun son hali görüntüleniyor. ! Bu amaç ile yazılan programı görmek için program düğmesine tıklayınız. elemanları siliniyor.LAST LOOP DBMS_OUTPUT.. elemanını silmek istediğimizi varsayalım. END LOOP. test_tab(3) :=125. 217 . test_tab(1) :=101. Bu kez sadece 4.DELETE(4.PUT_LINE (test_tab(i)). FOR i IN test_tab. TYPE test_turu IS TABLE OF NUMBER INDEX BY BINARY_INTEGER.. -. END. test_tab(4) :=35. test_tab. Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız 101 119 125 Örnek 2 Önceki örneği yeniden ele alalım. -. ve 5. ! Bu amaç ile yazılan programı görmek için program düğmesine tıklayınız. test_tab test_turu. ve 5.FIRST .tablo tanımlanıyor. test_tab.Örnek 1 Bir PL/SQL tablosuna 5 adet değer yerleştirdikten sonra bunlar arasında 4.tabloya değerler yerleştiriliyor..5). BEGIN -.

test_tab(4) :=35. -. Hatanın nedeni nedir ? Hata silme işlemi ardından. Kayıtın her bir alanı farklı veri türüne sahip olabilir.tablo tanımlanıyor. Ayrıca tıpkı PL/SQL tablolarında olduğu gibi. test_tab. test_tab(5) :=196. test_tab(2) :=119.. Bir kayıt birbirleriyle ilişkili alanların bir arada tanımlanması ile oluşturulur. test_tab test_turu. FOR döngüsü içinde bu indeks kullanılmaya çalışılıyor.LAST LOOP DBMS_OUTPUT.tablonun 4.PUT_LINE (test_tab(i)).tablonun son hali görüntüleniyor. blokların DECLARE bloğu için bir tanım yapılması gerekmektedir.. BEGIN -. Bu elemanın indeksi 4‘dür.DELETE(4). END. FOR i IN test_tab. elemanı siliniyor. END LOOP.2.tabloya değerler yerleştiriliyor. çünkü tablonun 4.. tablo elemanlarının görüntülenmesi esnasında ortaya çıkmaktadır.DECLARE -. Bu program çalıştırıldığında. Söz konusu indeks silindiği için okunamayacaktır ve bloğun çalışması bir hata mesajı ile kesilecektir. elemanı silinmiştir. 7. test_tab.2 Kullanıcı Tanımlı PL/SQL Kayıtları PL/SQL bloklarında kullanılan bir diğer veri yapısı “kayıt” olarak isimlendirilmektedir..FIRST . bir indeks yardımıyla kayıtlara ulaşılır. 7.. test_tab(1) :=101. sadece üç elemanı görüntüleyecek ve ardından bir hata mesajı ile bloğun çalışması sona erecektir. test_tab(3) :=125. Kayıt türlerinin yaratılabilmesi için öncelikle aşağıda görüldüğü biçimde bir tür tanımı yapılmalıdır. -. TYPE kayıt türü adı IS RECORD (alan tanımları). 218 . Kayıtın bir adı vardır.1 Kayıt Türünün Tanımlanması PL/SQL kayıt türünün oluşturulması amacıyla. TYPE test_turu IS TABLE OF NUMBER INDEX BY BINARY_INTEGER.

kaydın alanlarına ait veri türlerinin personel tablosundan kopyalandığını göstermektedir: DECLARE TYPE per_kayit_turu IS RECORD ( p_no personel. Bunun için. Bu kayıt.). Aşağıdaki örnek. 7. yine DECLARE bloğu içinde aşağıda görüldüğü biçimde bir kayıt tanımlanır: kayıt_adı kayıt_türü_adı. DECLARE TYPE per_kayit_turu IS RECORD ( p_no NUMBER(3). p_no.ucret_no%TYPE. Bu kayıt türünün adı per_kayit_turu olarak belirlenmiştir. 219 . p_adi ve p_ucret gibi üç alandan oluşmaktadır. p_adi personel.2.adi%TYPE. p_adi VARCHAR2(15). p_ucret personel. p_ucret NUMBER).Örnek Aşağıda bir PL/SQL kayıt türü tanımlanmaktadır. bir diğer değişkenden ya da bir veri tabanı tablosunun alanlarından alınabilir. Bu tanım içindeki alan türleri.personel_no%TYPE.2 Kaydın Tanımlanması RECORD anahtar kelimesi kullanılarak alan türü tanımlandıktan sonra bu türe dayanarak bir kaydın yaratılması gerekmektedir. Böyle bir amaç için %TYPE anahtar kelimesini kullanıyoruz. Örnek Aşağıdaki blok içinde önce bir kayıt türü tanımlıyoruz ve ardından bu türe dayanarak per_kayit isimli bir kayıt yaratıyoruz.

gerektiğinde veri tabanı tablolarından da veri okunarak aktarılabilir. Bunun için şu şekilde bir tanım kullanılır: kayıt_adı. bu kayıtların içerdiği alanlara erişim söz konusudur. Kaydın her bir alanına. Örnek 1 Bir kayıt tanımlandıktan sonra bu kaydın alanlarına değerler kaydetmek ve ardından bu kaydın her bir alanının içeriğini görüntülemek istiyoruz. TYPE per_kayit_turu IS RECORD (per_no NUMBER(3).per_no := 305 per_kayit. 220 ..alan_adı Alan isimleri bu şekilde kullanılarak.Kayıt türü tanımlanıyor. 7.2. Amacımıza uygun PL/SQL bloğunu görmek için linke tıklayınız.3 Kayıtların Kullanılması Kayıtlar bu şekilde tanımlandıktan sonra. p_ucret NUMBER). DECLARE -.alanlara bilgi yerleştiriliyor. bu alanlara değer atanabilir veya gerektiğinde PL/SQL bloğunun içinde kullanılabilir.. p_adi VARCHAR2(15).. p_ucret NUMBER). p_adi VARCHAR2(15). Kayıt alanlarına blok içinde doğrudan değerler atanabileceği gibi. o alanın ismi kullanılarak erişilir.Kayıt tanımlanıyor. per_kayit. -. per_kayit per_kayit_turu. per_kayit per_kayit_turu.p_adi := 'BEGUM'.DECLARE TYPE per_kayit_turu IS RECORD ( p_no NUMBER(3). BEGIN -.

END.alanlarına yerleştiriliyor. adi..per_no.p_ucret). p_ucret NUMBER). DBMS_OUTPUT. END. DECLARE -.Kayıt tanımlanıyor. DBMS_OUTPUT.alanlardaki bilgiler görüntüleniyor. DBMS_OUTPUT..Kayıt türü tanımlanıyor.p_adi). ucret INTO per_kayit.p_adi. -.PUT_LINE (per_kayit.alanlardaki bilgiler görüntüleniyor.per_no)..p_ucret :=6650.PUT_LINE (per_kayit.PUT_LINE (per_kayit. per_kayit. Bu amaca yönelik olarak düzenlenen PL/SQL bloğunu görmek için linke tıklayınız. Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız 305 BEGUM 6650 Örnek 2 personel tablosundan bazı verileri SELECT deyimi ile okuyarak kayıt alanlarına yerleştirmek istiyoruz.PUT_LINE (per_kayit. per_kayit per_kayit_turu. per_kayit.PUT_LINE (per_kayit. TYPE per_kayit_turu IS RECORD ( per_no NUMBER(3).per_no). DBMS_OUTPUT. p_adi VARCHAR2(15).PUT_LINE (per_kayit..p_ucret FROM personel WHERE personel_no=101.p_ucret).p_adi). DBMS_OUTPUT. -.. -.per_kayit. DBMS_OUTPUT. -.tablodan okunan veriler kayıt -. BEGIN Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız 221 . SELECT personel_no.

kaydın her bir alanı için TYPE ile veri türü tanımını yapmaya gerek yoktur. Örnek Veri tabanındaki personel isimli tablodan 110 numaralı personele ait bilgileri alarak bir PL/SQL kayıtı üzerine yerleştireceğiz ve daha sonra bu bilgiler arasında iki alanın içeriğini görüntüleyeceğiz. bir veri tabanı tablosu kullanılacak ise..tablodan okunan veriler kayıt alanlarına yerleştiriliyor.personel_no). DBMS_OUTPUT.adi).PUT_LINE (per_kayit. Bu program çalıştığında ilgili personele ilişkin personel numarası ve adı görüntülenir: 222 . FETCH deyimi imleçlerden bilgi okumayla ilgili bir deyimdir. Sadece yukarıda görüldüğü biçimde kayıt adı tanımlanır. DBMS_OUTPUT.alanlardaki bilgiler görüntüleniyor. Böyle bir amaç şu şekilde bir tanım yapılmalıdır: Bu tanımda görüldüğü gibi.. Bu deyimi daha sonraki konularımızda ele alarak inceleyeceğiz. DECLARE -. END. per_kayit personel%ROWTYPE..2.PUT_LINE (per_kayit. Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız.101 BURAK 7000 7.4 %ROWTYPE Özniteliği Veri tabanındaki bir tablodan SELECT ya da FETCH deyimleri ile bilgi alınırken.Kayıt türü tanımlanıyor. kayıt alanlarını tek tek tanımlamaya gerek olmayacaktır. BEGIN -. SELECT * INTO per_kayit FROM personel WHERE personel_no=110. -.

Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız 110 DILAY 223 .

224 .

225 .

226 .

227 .

228 .

229 . PL/SQL de yanda belirtildiği gibi iki tür imleçten söz edilir.İMLEÇLER Bu bölümde.1 İmleç Nedir ? PL/SQL de SQL deyimlerinin çalıştırılması sonucunda elde edilen değerler üzerinde işlem yapmak üzere imleç (cursor) adı verilen yapılardan yararlanılır. Bu küme üzerindeki her bir kayıda erişerek üzerinde işlemler yapılabilir. Bölüm Hedefi Bu bölümde aşağıda sıralanan konular ele alınarak incelenecektir: • • • • • • • • • • İmleç Nedir? Belirtilmiş İmleçler İmleçlerin Çalışma Biçimi İmleçlerin Tanıtılması İmleçlerin Açılması ve Kapatılması İmleçten Bilgi Alma İmleç Öznitelikleri İmleçlere Dayalı Kayıtlar FOR Döngüsü ile İmleçlerin Tanıtılması Parametrelerin Kullanımı 8. • • • • • • • • • • İmleç Belirtilmiş İmleçler İmleçlerin Çalışma Biçimi İmleçlerin Tanıtılması İmleçlerin Açılması ve Kapatılması İmleçten Bilgi Alma İmleç Öznitelikleri İmleçlere Dayalı Kayıtlar FOR Döngüsü ile İmleçlerin Tanımlanması Parametrelerin Kullanımı anlatılmaktadır. İmleçler bellekte bir kayıt kümesinin oluşturulmasına neden olur.

8. İmleçler bellekte bir kayıt kümesinin oluşturulmasına neden olur.Örtülü imleçler. Bu küme üzerindeki her bir kayıda erişerek üzerinde işlemler yapılabilir. Bu imleçlerin en büyük özelliği. imleç kelimesi ile belirtilmiş imleçler kastedilecektir. Aksi belirtilmedikçe. önceki bölümde ele alarak incelediğimiz biçimde yaratılır. SELECT veya DML deyimlerinin kullanıldığı bir PL/SQL bloğunda örtülü imleçler otomatik olarak açılır. Bir sorgulama işleminde SELECT deyimi kullanıldığında. SELECT veya DML deyimlerinin kullanıldığı bir PL/SQL bloğunda örtülü imleçler otomatik olarak açılır. PL/SQL de yanda belirtildiği gibi iki tür imleçten söz edilir. sadece bir kayıt döndüren SELECT deyimleri için geçerli olabileceği unutulmamalıdır. birden fazla kayıt içermesidir. Bu tür imleçleri sorgulama işlemlerinde kullanırken. Aşağıdaki bölümlerde bu işlemleri ele alarak inceleyeceğiz.1 İmleç Nedir ? PL/SQL de SQL deyimlerinin çalıştırılması sonucunda elde edilen değerler üzerinde işlem yapmak üzere imleç (cursor) adı verilen yapılardan yararlanılır. 230 . önceki bölümde ele alarak incelediğimiz biçimde yaratılır. Örtülü imleçler. Bu tür imleçleri tanımlamak ve kullanmak için özel PL/SQL deyimleri vardır. Belirtilmiş imleçler ise. Bu tür imleçleri sorgulama işlemlerinde kullanırken. Bu tür imleçleri yaratmak için özel bir işlem yapılmaz. Bu tür imleçleri yaratmak için özel bir işlem yapılmaz. bu bölümün konusunu oluşturmaktadır. sadece bir kayıt döndüren SELECT deyimleri için geçerli olabileceği unutulmamalıdır. seçilen kayıtların tümü bellekte imleç içine yerleştirilir.

Bu işlem FETCH deyimi ile yapılır. SELECT deyimi ile yapılan sorgu sonucunda elde edilen veriler imleç üzerine yerleşir. Belirtilen imlecin açılması. c.2 Belirtilmiş İmleçler Bir imleçi oluşturmak için herşeyden önce bir sorgulama işlemine ihtiyaç duyulur. b. İmleçin tanıtılması. İmleçten kayıdın getirilerek değişkenlere aktarılması. Bu işlem DECLARE bölümünde yapılır. Bu amaçla OPEN deyimi kullanılır. 8. 231 . Bu işlem CLOSE deyimi ile yapılır. İmlecin kapatılması.3 İmleçlerin Çalışma Biçimi İmleçleri PL/SQL blokları içinde kullanabilmek için belirli işlemlerin yerine getirilmesi gerekiyor. Bu işlemleri şu şekilde sıralamamız mümkündür: a. d.8.

Söz konusu deyim şu şekilde tanımlanır: CURSOR imleç_adı SELECT deyimi.4 İmleçlerin Tanıtılması Bir imleci PL/SQL bloğu içinde kullanabilmek için öncelikle DECLARE bloğu içinde tanımlanmış olması gerekmektedir.8. 232 . Bunun için CURSOR deyimine başvurulur.

Böyle bir işlem için. Bu imlecin adı per_imlec olacaktır. CLOSE imleç adı. Açık olan bir imleci kapatmak gerekecektir. Bu amaçla OPEN deyimine başvurulur. Bir imleç kapatıldıktan sonra gerekiyorsa. deyimi kullanılır. OPEN deyimi ile yeniden açılabilir. adi FROM personel. Kayıt göstergesi (pointer) bu aşamada birinci kaydı göstermektedir. kullanılabilmesi için açılması gerekecektir.Örnek Veri tabanında yer alan personel tablosundan personel numaralarını ve isimlerini okuyarak bir imleç üzerine yerleştirmek istiyoruz. Bu deyim. Bu deyim şu şekilde tanımlanır: OPEN imleç adı. Amacımıza uygun olarak aşağıdaki tanım yapılır: DECLARE CURSOR per_imlec IS SELECT personel_no. 233 . 8. Kayıt göstergesi şu anda hangi kayıt üzerinde işlem yaptığımızı gösterir. belirlenen sorgunun çalışmasını ve sonuçlarının kayıt kümesi üzerine yerleşmesini sağlar.5 İmleçlerin Açılması ve Kapatılması İmleçler DECLARE bölümünde PL/SQL bloğuna tanıtıldıktan sonra.

imlecin açılması. BEGIN -.imlecin tanıtılması. Bu deyim. 8. CLOSE per_imlec.imlecin kapatılması. 234 ..Örnek per_imlec isimli bir imleci tanımladıktan sonra açmak istiyoruz.... adi FROM personel. imleç değişkenlerinin içerdiği değerleri INTO sonunda belirtilen PL/SQL değişkenlere aktaracaktır. … -. Bunun için aşağıda belirtildiği biçimde bir yol izlenir: DECLARE -. sıra bu imleçten bilgi okumaya gelmiştir.6 İmleçten Bilgi Alma Bir imleç açıldıktan sonra.. END... Açık olan bir imleçten veri getirmek için FETCH deyimi kullanılır. Bu deyim aşağıda gösterildiği biçimde tanımlanır: FETCH imleç_adı INTO değişkenler. OPEN per_imlec. CURSOR per_imlec IS SELECT personel_no.

.imlecin kapatılması. v_adi personel. -.. CLOSE per_imlec. -...imleç değerlerinin okunarak -.PUT_LINE (v_no|| ' '||v_adi). CURSOR per_imlec IS SELECT personel_no. BEGIN -..5 LOOP FETCH per_imlec INTO v_no...sonuçların görüntülenmesi… DBMS_OUTPUT.imlecin açılması. FOR i IN 1.imlecin tanıtılması. -.adi%TYPE.değişkenlere atanması. Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız DECLARE v_no personel. v_adi.Örnek personel tablosundan personelin numarasını ve adını okuyarak bir imleç içine yerleştiren ve sonunda imleç içindeki bu değerleri listeleyen bir PL/SQL bloğu yazalım. -. OPEN per_imlec. adi FROM personel. END LOOP. END. Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız 101 BURAK 235 ..personel_no%TYPE.

Şimdiye dek döndürülen satırların sayısını verir. -.. v_adi personel. -. Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız. BEGIN -. İmleç öznitelikleri aşağıda belirtildiği biçimde tanımlanmaktadır: imleç adı%öznitelik Aşağıdaki tabloda imleç ile birlikte kullanılabilecek özniteliklere yer verilmektedir. adi FROM personel. CURSOR per_imlec IS SELECT personel_no. DECLARE v_no personel. 236 . En son FETCH işlemi bir satır döndürmüş ise TRUE döndürür... En son FETCH işlemi bir satır döndürmemiş ise TRUE döndürür.imlecin tanıtılması. Öznitelik %ISOPEN %NOTFOUND %FOUND %ROWCOUNT Örnek 1 PL/SQL bloğunda bir imlecin açık olup olmadığı denetleyen. IF NOT per_imlec%ISOPEN THEN OPEN per_imlec.imleç değerlerinin okunarak -. eğer açık değil ise açılması işlemi yerine getiren PL/SQL bloğu yazalım..imlecin açılması.7 İmleç Öznitelikleri İmleçlerle birlikte kullanılabilecek bazı öznitelikler bulunmaktadır.adi%TYPE. Veri türü BOOLEAN BOOLEAN BOOLEAN NUMBER Anlamı İmleç açık ise TRUE döndürür.değişkenlere atanması. END IF. Bu nitelikler her zaman kullanılmaz.105 BEGUM 120 SELIN 110 DILAY 130 SEZIN 8.personel_no%TYPE... Sadece gerek duyulduğunda başvurulur.

-. adi FROM personel.personel_no%TYPE. v_adi personel.. Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız. END IF.imlecin tanıtılması..imlecin kapatılması.. Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız 101 BURAK 105 BEGUM 120 SELIN 110 DILAY 130 SEZIN Örnek 2 Önceki örnekte imleçten veri getirme işlemini FOR döngüsü içinde yapmıştık.imlecin açılması.değişkenlere atanması. END LOOP. LOOP 237 . -. IF NOT per_imlec%ISOPEN THEN OPEN per_imlec. CLOSE per_imlec.sonuçların görüntülenmesi… DBMS_OUTPUT... CURSOR per_imlec IS SELECT personel_no..adi%TYPE. v_adi. -.5 LOOP FETCH per_imlec INTO v_no.imleç değerlerinin okunarak -.END. BEGIN -. FOR i IN 1.. -. DECLARE v_no personel.PUT_LINE (v_no|| ' '||v_adi).. Aynı bloğu bu kez sonsuz LOOP döngüsü içinde düzenleyelim.

8 İmleçlere Dayalı Kayıtlar Önceki bölümde PL/SQL kayıtlarını görmüştük. Doğal olarak 8.sonuçların görüntülenmesi… DBMS_OUTPUT. Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız 101 BURAK 105 BEGUM 120 SELIN 110 DILAY 130 SEZIN 160 AHMET 200 ALI 8. DECLARE -. v_adi.PUT_LINE (v_no|| ' '||v_adi). CLOSE per_imlec. belirlenen bir kaydın bir imlece bağlı olarak tanımlanması yeterlidir. Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız. Bu program çalıştırıldığında %ROWCOUNT niteliği ile döngünün sayısı denetlenmektedir.imlecin tanıtılması. -.imlecin kapatılması. Bu kez aynı kayıtları bir imlece göre yaratmak istiyoruz. adi 238 ... Kayıt tanımlandıktan sonra FETCH işlemi ile söz konusu kayıt içine ilgili veriler yerleştirilir. END LOOP. CURSOR per_imlec IS SELECT personel_no.END. Örnek Veri tabanında yer alan personel isimli tablodan personel numarası ve isimlerini okuyarak gecici isimli bir başka tabloya bu satırları eklemek istiyoruz. -. eleman okunduğunda.. FETCH per_imlec INTO v_no. EXIT WHEN per_imlec%ROWCOUNT > 7 OR per_imlec%NOTFOUND. bu kayıt işlem görmeden döngü dışına çıkılacak ve 7 satırı yazdırılacaktır. Bunun için..

-.FROM personel.. per_kayit per_imlec%ROWTYPE. CLOSE per_imlec. p_adi) VALUES(per_kayit. -. per_kayit isimli bir kayıt tanımlandığı ve bu kayıt alanlarının imleç alanları ile aynı isimde ve veri türünde olduğu anlaşılmaktadır.imlece dayalı kayıtın tanımlanması. Bu tablonun içeriği görüntülenirse. -.adi). amacımıza ulaştığımız anlaşılır. P_NO ---------101 105 120 110 130 160 200 150 155 250 300 140 350 P_ADI ---------BURAK BEGUM SELIN DILAY SEZIN AHMET ALI AYBIKE AYSE ERSIN HALIT DILARA ORCUN 8. LOOP FETCH per_imlec INTO per_kayit...yerleştirilmesi ve diğer tabloya satır ekleme.. END. INSERT INTO işleminde ise bu kayıtın alanları kullanılmaktadır. Yukarıdaki PL/SQL bloğunun DECLARE bölümünde. EXIT WHEN per_imlec%NOTFOUND. Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız SQL> SELECT * FROM gecici.. -.imleç değerlerinin okunarak kayıt içine -. Bu blok çalıştırıldıktan sonra belirlenen kayıtlar gecici isimli tablo içine eklenir.per_kayit.Sonuçların kalıcı hale getirilmesi. END LOOP. per_kayit per_imlec%ROWTYPE. INSERT INTO gecici (p_no. BEGIN OPEN per_imlec.personel_no.imlecin kapatılması.9 FOR Döngüsü İle İmleçlerin Tanımlanması 239 . COMMIT. ifadesi ile.

Hatta imleçlerle ilgili şu ana kadar gördüğümüz deyimlerin hiçbirini kullanmaya gerek yoktur. Daha sonra bu imleç içindeki tüm satırları tek tek görüntüleyeceğiz. FOR deyimi bu amaçla şu şekilde tanımlanır: FOR deyimi bu şekilde tanımlandığında. Bu tanımlama FOR döngüsü yardımıyla yerine getirilir. Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız. FOR kayıt adı IN (SELECT sorgusu) LOOP deyimler… END LOOP. bu verileri per_imlec imlecine yerleştirmek istiyoruz. FOR deyiminin IN anahtar kelimesi içinde sorguyu yerleştirebiliriz. adi FROM personel. DECLARE CURSOR per_imlec IS SELECT personel_no. Bu durumda DECLARE bloğunda imleci ve sorgu ifadesini tanımlamaya gerek yoktur. PL/SQL imleç işlemlerini örtülü olarak gerçekleştirir. FETCH ile veri okuma ve CLOSE ile imleci kapama işlemlerini tanımlamaya gerek yoktur. Örnek 1 personel isimli veri tabanı tablosundan personel numarası ile adını okuyarak. yani FOR tarafından otomatik olarak gerçekleştirilir.İmleçleri tanımlamak ve kullanmak için nasıl bir yol izleneceğini görmüş bulunuyoruz. FOR deyimi içinde SELECT sorgusunu tanımlayarak. OPEN ile imleci açma. Bu işlemler ve kayıt tanımlama işlemleri örtülü olarak (imlicit). 240 . Ancak imleçleri tanımlamak için çok kısa bir yol daha bulunmaktadır. Şöyle ki. imleç işlemlerini daha da basitleştirebiliriz.

PUT_LINE (per_kayit. END LOOP. FOR deyimi içinde sorgu işlemini yerleştirerek yeniden düzenleyelim. Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız 101 BURAK 105 BEGUM 120 SELIN 110 DILAY 130 SEZIN 160 AHMET 200 ALI 150 AYBIKE 155 AYSE 250 ERSIN 300 HALIT 140 DILARA 350 ORCUN Örnek 2 Önceki örneği. FOR per_kayit IN per_imlec LOOP ifadesi ile per_imlec imlecindeki veriler per_kayit isimli PL/SQL kaydına kopyalanmaktadır.adi).personel_no || ' ' ||per_kayit. END. Bu kayıtttan ilgili alanlar okunarak listelenmektedir. PL/SQL bloğunda.BEGIN FOR per_kayit IN per_imlec LOOP DBMS_OUTPUT. 241 . Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız.

adi FROM personel) LOOP DBMS_OUTPUT.adi).10 Parametrelerin Kullanımı İmleçlerin açılması ve ardından çalıştırılması esnasında. Böylece imleçlerin daha esnek uygulamalarda yer alması sağlanabilir. aşağıda gösterildiği biçimde tanımlanması gerekecektir: 242 . Bir imlece parametre geçirilmesi isteniliyorsa.BEGIN FOR per_kayit IN (SELECT personel_no.personel_no || ' ' ||per_kayit. END LOOP. END. dışarıdan bir parametrenin geçirilmesi söz konusu olabilir. aynen önceki örnekte olduğu gibi bir sonuç elde edilir: Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız 101 BURAK 105 BEGUM 120 SELIN 110 DILAY 130 SEZIN 160 AHMET 200 ALI 150 AYBIKE 155 AYSE 250 ERSIN 300 HALIT 140 DILARA 350 ORCUN 8.PUT_LINE (per_kayit. Yukarıdaki PL/SQL bloğu çalıştırıldığında.

. -.imlecin tanıtılması.. Örnek personel isimli veri tabanı tablosunda bölüm numarası 10 olan personeli seçerek listelemek istiyoruz.. BEGIN -.sonuçların görüntülenmesi… DBMS_OUTPUT.İmlece geçirilecek parametre bu şekilde tanımlandıktan sonra OPEN deyimi içinde sorguya geçirilecek değer tanımlanır.atanması. adi FROM personel WHERE bolum_no=v_bolum. -. EXIT WHEN per_imlec%NOTFOUND. Bu blok çalıştırıldığında personel tablosunda bölüm numarası 10 olan personel isimleri ve numaraları listelenir.imlecin kapatılması. v_adi personel. CURSOR per_imlec (v_bolum NUMBER) IS SELECT personel_no.PUT_LINE (v_no|| ' '||v_adi).. v_adi.personel_no%TYPE.imleç değerlerinin okunarak değişkenlere -.imlecin açılması ve parametre değerinin -. -. ! Amacımıza uygun PL/SQL programını görmek için “Program” düğmesine tıklayınız. DECLARE v_no personel.adi%TYPE.imlece geçirilmesi. CLOSE per_imlec. END LOOP. OPEN per_imlec(10).. OPEN imleç_adı(değer). LOOP FETCH per_imlec INTO v_no... END. -. 243 .

Blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız 101 BURAK 105 BEGUM 120 SELIN 244 .

245 .

246 .

247 .

KURAL DIŞI DURUMLARIN DENETLENMESİ Bu bölümde. • • • • • • Kural Dışı Durumların Denetimi Kural Dışı Durumların Yakalanması Önceden Tanımlı Sunucu Hatalarının Yakalanması Önceden Tanımlı Olmayan Sunucu Hatalarının Yakalanması Sunucu Hata Kodlarının Belirlenmesi Kullanıcı Tanımlı Hata Denetimi anlatılmaktadır. 248 . PL/SQL bloklarında kural dışı durumlar BEGIN içinde tanımlanır. Bölüm Hedefi Bu bölümde aşağıda sıralanan konular ele alınarak incelenecektir: • • • • • • Kural Dışı Durumlar Nelerdir? Kural Dışı Durumların Denetlenmesi Önceden Tanımlı Sunucu Hataların Yakalanması Önceden Tanımlı Olmayan Sunucu Hatalarının Yakalanması Sunucu Hata Kodlarının Belirlenmesi Kullanıcı Tanımlı Hata Denetimi 9. Örneğin. doğal olarak bazı hatalar ortaya çıkabilir. Hata durumları da bir kural dışı durum olarak değerlendirilir. personel tablosunda bir personel aranıldığında söz konusu tablo içinde bu personele ilişkin bir kayıt olmayabilir.1 Kural Dışı Durumların Denetimi PL/SQL blokları içinde kural dışı durumları denetleme gereksinimi ortaya çıkabilir. Böyle durumları denetim altına almak gerekmektedir. Bir kural dışı durum ortaya çıktığında bunu çözümlemek ve ne yapılacağını tanımlamak üzere EXCEPTION bloğu içinde bir tanım yapmak gerekecektir. PL/SQL blokları çalıştırıldığında. İşte bu tür kural dışı durumları denetleme işlemlerini yerine getirmek üzere PL/SQL'in bazı olanakları bulunmaktadır.

Birden fazla WHEN kullanılabilir. Bu sayede programların daha iyi denetlenmesi sağlanır. bloğun çalışması EXCEPTION içindeki deyimlerin çalışması ardından sona erer. 9.PL/SQL bloklarında kural dışı durumların denetlenmesi önemli bir konudur.2 Kural Dışı Durumların Yakalanması Kural dışı durumlar PL/SQL bloğunun EXCEPTION bölümünde tanımlanır. Blok çalıştırıldığında bir kural dışı durum ile karşılaşıldığında. Bu tanım aşağıda gösterildiği biçimde yapılır: WHEN anahtar kelimesi kural dışı durum ortaya çıktığında ne yapılacağını tanımlar. Böylece BEGIN içinde kural dışı durumun ortaya çıktığı noktadan sonraki BEGIN deyimleri işlem görmez. Örnek 249 . programın akışı bu noktadan itibaren EXCEPTION içindeki deyimlere aktarılır ve böylece. WHEN OTHERS ise WHEN ile tanımlanan durumun dışında kalan kural dışı durumlarda neler yapılacağını belirler.

').. veri tabanı sunucusu tarafından üretilen çok sayıda hazır kural dışı durumlar bulunmaktadır. DECLARE v_adi personel. Aşağıdaki tablo söz konusu hazır kural dışı durum tanımlarının bazılarını içermektedir. EXCEPTION -.adi%TYPE. bunun için özel birtakım tanımlara gerek yoktur. 999 numaralı personelin adını görüntülemek üzere tanımlanmıştır. DBMS_OUTPUT. Bu durumu denetleyerek bir mesaj üretmek üzere aşağıdaki PL/SQL bloğunu yazıyoruz: Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız. SELECT deyimi aranan kaydı bulamadığı için NO_DATA_FOUND durumu ortaya çıkmıştır. Bu durum veri tabanı sunucusu tarafından zaten denetlenmekte ve NO_DATA_FOUND durumu ortaya çıkmaktır.kural dışı durum tanımlanıyor. 250 ..PUT_LINE (v_adi). 9. BEGIN -. Bu blok.PUT_LINE ('Kayıt bulunamadı.personel adı görüntüleniyor. O nedenle. Örneğin bir veri tabanı tablosunda aranılan kayıt bulunamıyorsa.içine yerleştiriliyor..Bir tabloda aranılan kayıt bulunamadığında.. WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.3 Önceden Tanımlı Sunucu Hatalarının Yakalanması Kural dışı durumlar çoğu kez standart özelliklere sahiptir. Bu durumu EXCEPTION bölümündeki WHEN deyimi algılar ve aşağıdaki mesajı görüntüler. Kayıt bulunamadı.. NO_DATA_FOUND isimli kural dışı durum ortaya çıkar.tablodan okunan veriler değişken -. Ancak bu numaraya sahip bir personel bulunmamaktadır. SELECT adi INTO v_adi FROM personel WHERE personel_no=999. END. -. Bunun gibi. bir kural dışı durum ortaya çıkmıştır. Bu durumların EXCEPTION bölümünde WHEN ile doğrudan denetlenmesi mümkündür.

251 .

').PUT_LINE (v_adi). Örnekleri görmek için düğmelere tıklayınız.!Kural dışı durumlara ait iki örnek aşağıda verilmiştir... WHEN NO_DATA_FOUND THEN DBMS_OUTPUT. Aşağıdaki PL/SQL bloğunu göz önüne alalım. Bu program çalıştırıldığında bir kural dışı durum ortaya çıkarak. EXCEPTION -. DBMS_OUTPUT. -. PL/SQL bloğunu görmek için linke tıklayınız.tablodan okunan veriler değişken içine -. DECLARE v_adi personel. BEGIN -.PUT_LINE('Kayıt bulunamadı.').adi%TYPE.. Örnek 1 Aşağıdaki PL/SQL bloğunu göz önüne alalım.. 252 . SELECT adi INTO v_adi FROM personel.PUT_LINE('Birden fazla kayıt.yerleştiriliyor.kural dışı durum tanımlanıyor.. WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT. END.personel adı görüntüleniyor..

Örnek 2 Programda belirtilen hazır kural dışı durumları kullanabildiğimiz gibi..kural dışı durum tanımlanıyor. WHEN OTHERS ifadesini kullanarak sadece bir hata ortaya çıktığını algılamak istiyoruz. SELECT deyimi içinde herhangi bir kısıt olmadığı için birden fazla kayıt seçilecektir. Aşağıdaki PL/SQL bloğunu göz önüne alalım. SELECT adi INTO v_adi FROM personel. önceki örnekte olduğu gibi TOO_MANY_ROWS hazır kural dışı durum ifadesini kullanabiliriz. Bu tür bir uygulamada. 253 . Buna karşılık... söz konusu kural dışı durumun türünü belirtmeden de denetleme yapabiliriz.PUT_LINE ('Programda hata var. -. END. 9..'). çok sayıda kayıt seçildiği için TOO_MANY_ROWS durumu ortaya çıkmıştır.adi%TYPE. Bu amaç ile hazırlanan PL/SQL bloğunu görmek için linke tıklayınız. Bunun için. EXCEPTION -. DBMS_OUTPUT.4 Önceden Tanımlı Olmayan Sunucu Hatalarının Yakalanması Önceki kısımda bazı kural dışı durumların özel ifadelerle nasıl tanımlanabildiğini gördük.PUT_LINE('Kayıt bulunamadı... Aşağıdaki örnek bu amaçla hazırlanmıştır. Böyle bir amaca ulaşamak için aşağıdaki PL/SQL bloğunu hazırlıyoruz. Bu örnekte SELECT deyimi birden fazla satır seçtiği için bir kural dışı durum ortaya çıkmıştır.').Birden fazla kayıt.. BEGIN -. Bunun yerine.tablodan veriler okunuyor.personel adı görüntüleniyor. bir veri tabanı tablosunda aradığımız kayıtın bulunamaması halinde NO_DATA_FOUND durumunun otomatik olarak ortaya çıktığını ve bu durumu EXCEPTION bölümünde denetleyebildiğimizi biliyoruz. mesajının görüntülenmesine neden olacaktır.. WHEN NO_DATA_FOUND THEN DBMS_OUTPUT. Bu blok çalıştırıldığında şu şekilde bir sonuç görüntülenir: Programda hata var. SELECT deyiminin sadece bir kayıt seçmesi beklenir. Çünkü. DECLARE v_adi personel. WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE (v_adi). Örneğin.

Bunun anlamı.. DELETE FROM bolum WHERE bolum_no=10. PRAGMA EXCEPTION_INIT (h_bolum_no.PUT_LINE ('Kayıt silemezsiniz. EXCEPTION -. Örnek bölüm ve personel tabloları arasında bir ilişkisel bütünlük (referential integrity) sınırlaması olduğunu varsayalım. Ancak bu kodlar yerine özel isimleri kullandık. DECLARE -. END. Böyle bir silme işlemi yapılmaya çalışıldığında veri tabanı sunucusu bir hata mesajı üretecektir. Örneğin. Bu hata mesajının kodu -2292 dir.'). bölüm tablosundan bu kaydı silemeyiz. Aşağıdaki PL/SQL bloğu böyle bir silme işlemini denemektedir.kural dışı durum tanımlanıyor… h_bolum_no EXCEPTION.veritabanından bazı kayıtlar siliniyor. bölüm tablosunda her kayıdı istediğimizde silme imkanımızın olmadığını göstermektedir.Bu özel ifadeler veri tabanı sunucusunun iç hata kodlarına karşılık gelmektedir.. Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız. BEGIN -. COMMIT. Söz konusu kural dışı durumları da denetlemek mümkündür. 254 .kural dışı durum yakalanıyor… WHEN h_bolum_no THEN DBMS_OUTPUT. -2292). Bu özel kural dışı durumlar dışında daha pekçok kural dışı durum mevcuttur. 10 numaralı bölümde personel varsa.

Örnek 1 Bu örnekte SELECT deyimi birden fazla satır seçtiği için bir kural dışı durum ortaya çıkmıştır. bir tablodan kayıt okunamama durumunda. Bu hata kodunu. Bu koda ilişkin hata mesajını elde etmek gerektiğinde ise. O halde bu bölümü bolum tablosundan silemeyiz. 9. 255 . DECLARE bölümünde tanımlamıştık. SQLCODE fonksiyonları kullanılabilir. WHEN OTHERS ifadesini kullanarak ORACLE veri tabanı sunucusunun kendi hata mesaj kodunu ve bu mesaj ifadesini elde etmek istiyoruz. O halde bu kodu elde etme imkanımız var mıdır? Söz konusu hata kodunu öğrenmek için. veri tabanı suınucusunun bir hata kodu ürettiğini biliyoruz. önceki örnekte olduğu gibi TOO_MANY_ROWS hazır kural dışı durum ifadesini kullanabiliriz. EXCEPTION bölümünde ise WHEN deyimi ile bu hata kodu algılanır ve aşağıda görüldüğü biçimde bir mesaj yayınlanır: Kayıt silemezsiniz. SQLERRM fonksiyonuna başvurulur. SQLCODE fonksiyonu. yani NO_DATA_FOUND kural dışı durumu ortaya çıktığında +100 hata kodunu.Bu blok çalıştığında. Bunun için. 10 numaralı bölüm silinemez.5 Sunucu Hata Kodlarının Belirlenmesi Kural dışı bir durumla karşılaşıldığında. veri tabanı sunucusu -2292 numaralı hata kodunu üretir. Böyle bir durumda. Çünkü bu tabloyla ilişkili olan personel tablosunda 10 numaralı bölümde çalışan personel bilgileri yer almaktadır. bunun dışında kalan durumlarda ise negatif bir hata kodunu üretir.. Bunun yerine.

kural dışı durum ortaya çıktığında -. Bu kural dışı durum ile ilgili olarak ORACLE sunucusunun ürettiği hata kodunu ve mesajını öğrenmek istiyoruz. Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız. -.personel adı görüntüleniyor. DECLARE v_adi personel. SELECT adi INTO v_adi FROM personel WHERE personel_no=999. DBMS_OUTPUT.hata kodu ve hata mesajı görüntülenecektir.adi%TYPE. DBMS_OUTPUT. Ancak söz konusu tabloda böyle bir numaraya sahip personel bulunmamaktadır.hata kodu ve hata mesajı görüntülenecektir. Bu blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız -1422 ORA-01422: <hata mesajı. EXCEPTION -.personel adı görüntüleniyor. DECLARE v_adi personel. SELECT adi INTO v_adi FROM personel. Bu program çalıştırıldığında.PUT_LINE (v_adi). END. -.PUT_LINE (v_adi).tablodan veriler okunuyor.tablodan veriler okunuyor..Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız. EXCEPTION -.kural dışı durum ortaya çıktığında -. BEGIN -.. DBMS_OUTPUT. ortaya çıkan hatalı duruma uyan ORACLE veri tabanı sunucu hata kodu ve hata ifadesi görüntülenir.PUT_LINE (SQLCODE). WHEN OTHERS THEN 256 ...adi%TYPE. BEGIN -.. WHEN OTHERS THEN DBMS_OUTPUT..PUT_LINE (SQLERRM). Örnek 2 personel tablosundan 999 numaralı personelin adını okumak istiyoruz...

Bu işlemin yapılabilmesi için doğal olarak ilgili personelin personel tablosunda kayıtlı olması beklenir. DECLARE -. DBMS_OUTPUT. Ancak biz bu yola başvurmadan kendi kodlarımıza bu durumu ortaya koymak istiyoruz. Bu tür kural dışı durumu denetlemek için NO_DATA_FOUND hazır tanımları kullanılabilir.PUT_LINE (SQLCODE). BEGIN -. ortaya çıkan hatalı duruma uyan ORACLE veri tabanı sunucu hata kodu ve hata ifadesi görüntülenir. h_gecersiz EXCEPTION. Bu program çalıştırıldığında.. Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız.. UPDATE personel 257 . DBMS_OUTPUT.END. Bu tür kural dışı durumları tanımlamak için aşağıda belirtilen yol izlenir: Örnek 1 personel tablosunda 999 numaralı personelin ücret bilgisini 8900 olarak değiştirmek istiyoruz. Bu blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız.veri tabanı tablosu güncelleştiriliyor.6 Kullanıcı Tanımlı Hata Denetimi PL/SQL ‘de kullanıcı tarafından tanımlanan kural dışı durumları denetleme imkanı bulunmaktadır.Kural dışı durum adı tanımlanıyor. Eğer ilgili personel bulunamaz ise bir uyarı mesajı görüntülenecektir. 100 ORA-01403: hiç bir veri bulunmadı 9.PUT_LINE (SQLERRM).

EXCEPTION WHEN h_gecersiz THEN DBMS_OUTPUT... Örnek 2 PL/SQL bloğu içinde iki sayısal değeri topladıktan sonra. -.PUT_LINE ('Sonuç negatif.. END IF. Sonuç negatif..kural dışı durumu ortaya çıkarılıyor.PUT_LINE ('Geçersiz personel no. -. IF sonuc < 0 THEN RAISE hata.').'). IF SQL%NOTFOUND THEN RAISE h_gecersiz.kural dışı durumu ortaya çıkarılıyor.SQL in kayıt bulunamadı mesajı üretilmiş ise -. Bu blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız. sayi_2 NUMBER :=-7. BEGIN sonuc := sayi_1 + sayi_2. Geçersiz personel no. -.. sonuç negatif ise bunu bir kural dışı durum olarak kabul edip. sonucu bir mesaj ile duyuralım istiyoruz. Bu blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız. COMMIT.. Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız. hata EXCEPTION. EXCEPTION WHEN hata THEN DBMS_OUTPUT. sonuc NUMBER.Kural dışı durum adı tanımlanıyor.SET ucret= 8900 WHERE personel_no=999. DECLARE sayi_1 NUMBER :=5. END. END. END IF.. 258 .

259 .

260 .

261 .

her biri ayrı işlevleri yerine getiren ve birbirinden ayrı alt programlardan oluşturma metodolojisidir. Bu yaklaşım biçimi yazılımlara bir çok açıdan yarar sağlamaktadır. Bölüm Hedefi Bu bölümde aşağıda sıralanan konular ele alınarak incelenecektir: • • • • • • • Alt Program veya Modül Nedir? PL/SQL Modüllerinin Ortak Yanları Yordamlar Saklı Yordamlar Fonksiyonlar Saklı Fonksiyonlar Paketlerin Yaratılması 10. bir programı.ALTPROGRAMLAR Bu bölümde. Modüllere “altprogram” adı da verilebilir. • • • • • Altprogram PL/SQL Modüllerinin Ortak Yapıları Yordamlar Fonksiyonlar Paketler anlatılmaktadır. Daha önceki konularda ele alarak incelediğimiz anonim bloklar birer modül olarak söz önüne alınır.1 Altprogram Nedir ? Modüler kodlama. PL/SQL blokları aslında birer modül olarak değerlendirilir. PL/SQL altprogramlarını şu şekilde sıralamız mümkündür: • • • • Anonim bloklar Yordamlar (procedures) Fonksiyonlar Paketler (packages) 262 . PL/SQL programları da modüler kodlamaya uygundur.

Adı olmadığı için.Önceki bölümlerde anonim blokları ele alarak incelemiştik. Bu deyim sadece fonsiyonlarda vardır. Her çağrıldığında yeniden derlenerek çalışır. bir diğer bloktan çağrılamaz. DECLARE bölümü aşağıda sıralanan öğrelere sahip olabilir: 263 .2 PL/SQL Modüllerinin Ortak Yapıları PL/SQL modüllerinin yapısı birbirine benzer. Başlık: Sadece bir isime sahip olan modüllerde bu kısım kullanılır. 10. b. Başlık kısmında aşağıda sıralanan öğreler yer alır: o Modül adı o Parametre listesi o RETURN deyimi. Veri tabanında saklı değildir. Bu tür blokların aşağıda sıralanan özelliklere sahip olduğunu biliyoruz: • • • • Anonim bloklar isimlendirilmez. Aşağıda bu ortak yanları sıralıyoruz: a.

Bunlar yanda verilmektedir. aslında bir PL/SQL bloğudur. bir veya daha fazla eylemi yerine getirmek üzere oluşturulan yapılardır. sadece verilen görevi yerine getirir. PL/SQL yordamları oluşturulma ve kullanma açısından iki farklı türü bulunmaktadır.c. Yordam. d. 264 . Belirli bir yapısı vardır. Yordam. Sözünü ettiğimiz bu yordam türlerini ele alarak incelemek istiyoruz. Çağrıldığında herhangi bir değer döndürmez. o Değişken tanımları o İmleç tanımları o Alt bloklar BEGIN bölümünde aşağıda yer alan işlemlere başvurulabilir: o Atama işlemleri o IF-THEN-ELSE karar işlemleri o Döngü işlemleri o Diğer PL/SQL bloklarını çağırma işlemleri EXCEPTION bölümünde ise aşağıda sıralanan işlemler yerine getirilir: o Kural dışı durumları yakalama işlemleri 10. Bu yönü göz önüne alındığında fonksiyonlardan farklı olduğunu söyleyebiliriz.3 Yordamlar PL/SQL programlarında yer alabilecek bir değer modül türü yordam (procedure) olarak bilinmektedir.

Görüldüğü gibi. yordamın bir ismi olmalıdır. [EXCEPTION deyimler. Bir yordam şu şekilde kullanılabilir: PROCEDURE yordam adı (parametre listesi) IS [yerel bildirimler] BEGIN deyimler. söz konusu yordam PL/SQL bloklarının BEGIN bölümünde çağrılarak kullanılabilir. END yordam adı.3.. SELECT adi INTO v_adi FROM personel WHERE personel_no=p_no. BEGIN -.10. DBMS_OUTPUT.1 Anonim Blok İçinde Kullanılan Yordamlar Anonim bloklar içinde bir veya daha fazla yordam yer alabilir.adi%TYPE.personel adı görüntüleniyor.PUT_LINE (v_adi). -... Bu isime dayanılarak. 265 . Amacımıza uygun bir SELECT deyimini test isimli bir yordam içinde şu şekilde tanımlıyoruz: PROCEDURE test (p_no NUMBER) IS v_adi personel. Yordamlar PL/SQL bloklarının DECLARE bölümünde tanımlanır.tablodan veriler okunuyor. Bu yordamlar belirli bir yapıya sahiptir. Örnek personel tablosundan belirli personelin isimlerini seçerek görüntüleyen bir PL/SQL programı yazmak istiyoruz.

... biçiminde kullanmak gerekiyor. DBMS_OUTPUT.adi%TYPE. Bu blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız. PROCEDURE test (p_no NUMBER) IS v_adi personel. test(101). Diğer personeli de sorgulamak için benzer tanım yapılır. BEGIN -.yordam tanımlanıyor.PUT_LINE (v_adi). DECLARE -. BURAK BEGUM SELIN 10. Bu yordamda şu tanımlar yer almaktadır: Yordamın adı: test Parametre : p_no Yukarıdaki yordamı çalıştırabilmek için. SELECT adi INTO v_adi FROM personel WHERE personel_no=p_no. END.. END test. Buraya kadar söylediklerimizi bir PL/SQL bloğu içinde aşağıda gösterildiği biçimde birleştirerek sunuyoruz: Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız.yordam ardarda üç kez çalıştırılıyor. örneğin 101 numaralı personel ilişkin olarak sorgulama yapabilmek için. -. test(105).2 Saklı Yordamlar 266 . test(120). test(101).. BEGIN -.tablodan veriler okunuyor.END test.personel adı görüntüleniyor.3..

O nedenle saklı yordamlar uygulama geliştiriciler açısından önemli kavramlardır. Bu tür yordamlar belirli bir isimle veri tabanı içinde saklıdırlar. END bolum_ekle.1 Saklı Yordamların Yaratılması Bir saklı yordamın yaratılması için belirli işlemlerin yapılması gerekmektedir. bir anonim PL/SQL bloğunun içinde yer almasıdır.konum%TYPE) IS BEGIN -.2.tabloya kayıt ekleme işlemi. v_konum). v_konum bolum. bir veri tabanı nesnesi olarak değerlendirilir. bu tür yordamları veri tabanı içinde yaratmak amacıyla kullanılır: CREATE OR REPLACE PROCEDURE yordam adı (parametreler) IS BEGIN deyimler. v_adi bolum.bolum_adi%TYPE.konum) VALUES(v_no. 267 . Uygulamada çoğunlukla saklı yordamlar (stored procedures) kullanılır. 10. Aşağıdaki deyim.Önceki kısımda ele aldığımız yordamların en önemli özelliği. Bu yordamın adı bolum_ekle olacaktır.3. Bu tür yordamları sadece o anonim blok tarafından kullanılabilir çünkü anonim blok ve yordam aynı programın birer parçasıdır. Yordamlar derlenir. Böylece saklı yordamlar. Örnek Veri tabanında yer alan BOLUM isimli tabloya satır ekleme işlemlerini yerine getirmek üzere bir yordam yaratmak istiyoruz.bolum_adi.bolum_no%TYPE. Herhangi bir PL/SQL bloğundan ya da bir diğer dış uygulamadan. INSERT INTO bolum(bolum_no. END yordam adı.. v_adi. örneğin bir ASP programından ya da Visual Basic programından çağrılarak kullanılabilirler. ! Amacımıza uygun olarak yaratılan yordamı görmek için düğmeye tıklayınız. CREATE OR REPLACE PROCEDURE bolum_ekle (v_no bolum.

bolum_no%TYPE. END. yordam adı (parametreler) biçiminde bir tanımın yapılması yeterlidir. Yordamı çalıştırmak için. v_adi bolum.bolum_adi%TYPE.2 Saklı Yordamların Çalıştırılması Bir saklı yordamın nasıl yaratıldığını gördük.yordam iki kez ardarda çalıştırılıyor. veri tabanında bolum_ekle isimli bir yordam yaratılır..'İZMİR'). SQL> SELECT * FROM BOLUM. Bu yordamı çağıran ve çalıştıran PL/SQL bloğunu görmek için linke tıklayınız. Örnek Şu anda BOLUM tablosunun aşağıda görüldüğü gibi 5 adet satıra sahip olduğunu varsayalım.konum) VALUES(v_no. bolum_ekle (60. END bolum_ekle.konum%TYPE) IS BEGIN -.'KADIKÖY'). Bu yordam artık diğer tüm uygulamalar tarafından bolum_ekle ismi kullanılarak çalıştırılmaya hazırdır 10.'SATIŞ'.2. 268 . bolum_ekle (70.Yukarıdaki yordam bu şekliyle çalıştırılırsa. v_adi. CREATE OR REPLACE PROCEDURE bolum_ekle (v_no bolum.bolum_adi.3. v_konum bolum. INSERT INTO bolum(bolum_no.'REKLAM'. BEGIN -. v_konum).. Şimdi sıra bu yordamın çalıştırılmasına gelmiştir.tabloya kayıt ekleme işlemi. BOLUM_NO -------10 20 30 40 50 BOLUM_ADI --------MUHASEBE SATIŞ AR-GE PERSONEL ÜRETİM KONUM -------------KADIKÖY ANKARA İZMİR KADIKÖY GEBZE Bu BOLUM tablosuna bir kayıt eklemek için aşağıdaki yordamın veri tabanında yaratıldığını varsayalım. Artık bu yordam veri tabanında bolum_ekle ismiyle yer almaktadır.

-.Yukarıdaki PL/SQL bloğunu çalıştırdığımız takdirde.” mesajını. aksi takdirde “POZİTİF. yordamdan aldığı mesajı görüntüleyecektir. parametre girişlerini yanı sıra parametre çıkışlarını da tanımlayarak bir değer döndürmesi sağlanabilir. Bu blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız. Ancak.dışarıdan okunan değer. Eğer bir parametre giriş parametresi olacak ise..3. o parametre için IN OUT biçiminde bir tanım yapılır.. hem de çıkış amacıyla kullanılacak ise. Bunun için yordam parametreleri ile birlikte IN ve OUT anahtar kelimeleri kullanılabilir. sonuç negatif ise “NEGATİF. BEGIN 269 .” mesajını kendini çağıran bir anonim PL/SQL bloğuna aktaracaktır.. Bu yordam bu iki değeri toplayacak. SQL> SELECT * FROM BOLUM. mesaj OUT CHAR) IS -. Örnek İki sayısal değeri okuyan ve değerlendiren bir yordam yaratacağız. v_sonuc NUMBER. Bu yordamın adı test olacaktır. BOLUM tablosuna iki adet satır ilave edilecektir. -. sayi_2 IN NUMBER. Yordam şu şekilde yaratılabilir: CREATE OR REPLACE PROCEDURE test (sayi_1 IN NUMBER.dışarıdan okunan değer. Tablonun içeriğini yeniden görüntüleyecek olursak. sözünü ettiğimiz iki kayıdın eklendiği görülür. BOLUM_NO -------10 20 30 40 50 60 70 BOLUM_ADI --------MUHASEBE SATIŞ AR-GE PERSONEL ÜRETİM REKLAM SATIŞ KONUM -------------------KADIKÖY ANKARA İZMİR KADIKÖY GEBZE KADIKÖY İZMİR 10.dışarı aktarılacak değer.. çağrılan yordamdan bir değer okunacak ise parametrelerle birlikte OUT kelimeleri kullanılır.. yani çağrılan yordama bir değer aktarılacak ise IN. Eğer bir parametre hem giriş.2.3 Yordamlar İçin IN ve OUT Parametreleri Bir yordamın normal olarak bir değer döndürmediğini söylemiştik. Sözü edilen blok.

4. fonksiyonların bir değer döndürmek zorunda oluşudur. Bu yordam veri tabanında test ismiyle yer alacaktır.. DECLARE v_mesaj varchar2(30)..'. FUNCTION fonksiyon adı (parametre listesi) RETURN veri türü IS BEGIN deyimler. 10. END.4 Fonksiyonlar Bir diğer PL/SQL modül türü fonksiyon olarak bilinir.'. ELSE mesaj := 'Pozitif. Bu tür fonksiyonlar aşağıda gösterildiği biçimde tanımlanırlar. IF v_sonuc < 0 THEN mesaj:= 'Negatif. Bu blok. 10.1 Anonim Blok İçinde Kullanılan Fonksiyonlar Anonim bloklar içinde bir veya daha fazla fonksiyon yer alabilir. Sonuç şu şekilde olacaktır: Negatif. END test. Fonksiyonları iki faklı biçimde kullanma olanağımız vardır. test(5.-7. BEGIN -. Farkı.v_sonuc := sayi_1 + sayi_2. Fonksiyonlar aynen yordamlara benzer...yordam çalıştırılıyor. yordam içinde oluşan v_mesaj değerini okumaktadır. DBMS_OUTPUT. test yordamına 5 ve -7 sayısal değerlerini aktarmakta.PUT_LINE (v_mesaj). END IF. Söz konusu yordamı çağıran anonim PL/SQL bloğunu ise şu şekilde oluşturuyoruz: Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız.v_mesaj). 270 .

BEGIN SELECT MAX(ucret) INTO v_max_ucret FROM personel. Tanım içinde yer alan RETURN deyimi değer döndürmek amacıyla kullanılır. personel tablosunda yer alan en yüksek ücretten daha büyük olup olmadığını belirlemek istiyoruz.[EXCEPTION deyimler. FUNCTION f_test (v_ucret IN NUMBER) RETURN NUMBER IS v_max_ucret NUMBER. BEGIN 271 . END f_test. END fonksiyon adı.fonksiyon tanımlanıyor. Eğer bu değer ücretten büyük ise. Örnek 9000. personel tablosundaki en yüksek ücret seviyesi görüntülenecektir. DECLARE -. Aksi takdirde verilen değer görüntülenecektir. END IF. Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız. ELSE RETURN(v_ucret). IF v_ucret>v_max_ucret THEN RETURN(v_max_ucret). Fonksiyonların yordamlardan en önemli farkı. bir değer döndürmesidir. Personel arasında en yüksek ücret miktarının 7000 olduğunu varsayıyoruz... 1000 ve 5000 ücret miktarlarının.

bir isim verilerek veri tabanına yerleştirilen fonksiyonlardır.4. 7000 1000 5000 10. Bu deyim bu tür fonksiyonları veri tabanı içinde yaratmak amacıyla kullanılır: CREATE OR REPLACE FUNCTION fonksiyon adı (parametreler) 272 .1 Saklı Fonksiyonların Yaratılması Bir saklı fonksiyonun yaratılması için CREATE OR REPLACE FUNCTION deyimi kullanılır. Saklı fonksiyonlar.PUT_LINE DBMS_OUTPUT. Bu blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız. örneğin bir ASP programından yada yada VisualBasic programından çağrılarak kullanılabilirler. (f_test(1000)). gerek görüldüğünde saklı fonksiyon (stored function) biçimine dönüştürülerek diğer uygulama programlarının da erişimi sağlanabilir. (f_test(5000)).PUT_LINE DBMS_OUTPUT.2. (f_test(9000)).END.fonksiyon ardarda DBMS_OUTPUT. Saklı fonksiyonlar derlenir ve birer veri tabanı nesnesi olarak değerlendirilir.2 Saklı Fonksiyonlar Bir fonksiyon anonim bloklar içinde kullanılabileceği gibi.PUT_LINE üç kez çalıştırılıyor. -.. 10. Herhangi bir PL/SQL bloğundan yada bir diğer dış uygulamadan.4.

1000 ve 5000 ücret miktarlarının. personel tablosunda yer alan en yüksek ücretten daha büyük olup olmadığını belirlemek istiyoruz. Bu fonksiyon artık diğer tüm uygulamalar tarafından f_test ismi kullanılarak çalıştırılmaya hazırdır. Bunun için aşağıda belirtilen blok hazırlanır ve çalıştırılır. personel tablosundaki en yüksek ücret seviyesi görüntülenecektir. BEGIN SELECT MAX(ucret) INTO v_max_ucret FROM personel. Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız.RETURN veri türü IS BEGIN deyimler. END f_test.2. CREATE OR REPLACE FUNCTION f_test (v_ucret IN NUMBER) RETURN NUMBER IS v_max_ucret NUMBER. Fonksiyonu çalıştırmak için. 10. Yukarıdaki yordam bu şekliyle çalıştırılırsa. Eğer bu değer ücretten büyük ise. END IF. Örnek Önceki örnekte f_test isimli bir fonksiyon tanımlamıştık. ELSE RETURN(v_ucret). veri tabanında f_test isimli bir fonksiyon yaratılır. Örnek Önceki örneği yeniden göz önüne alalım. Bu örnekte şu amaca ulaşılıyordu: 9000. fonksiyon adı (parametreler) biçiminde bir tanımın yapılması yeterlidir.2 Saklı Fonksiyonların Çalıştırılması Bir saklı fonksiyonun nasıl yaratıldığını gördük. END fonksiyon adı. Aynı amaca bu kez saklı fonksiyonları kullanarak ulaşmak istiyoruz. IF v_ucret>v_max_ucret THEN RETURN(v_max_ucret). Şimdi bu fonksiyonu çağırabilecek bir anonim PL/SQL bloğu oluşturmak istiyoruz.4. Şimdi sıra bu fonksiyonun çalıştırılmasına gelmiştir. 273 .

Bunlardan birincisi.PUT_LINE DBMS_OUTPUT. (f_test(5000)).fonksiyon ardarda DBMS_OUTPUT. Bu yöntem.5 Paketler Bir diğer PL/SQL modülü paket (package) olarak bilinir. (f_test(9000)). Diğer veri tabanı nesnelerini mantıksal olarak bir grup halinde içereren bir nesnedir. Bu sayede aynı paketi çok sayıda uygulama aynen kullanabilecektir. yani BEGIN ile başlayan ana kodlarını içeren kısmıdır. paketin içerdiği modüllerin adını ve parametrelerini içeren başlık kısmıdır. amacına uygun olarak birden fazla yordam ve fonksiyonu içeren bir nesnedir. 274 . güvenlik açısısından uygulamalara bazı avantajlar sağlar. O halde bir paket.PUT_LINE END. Diğer kısımlarına uygulama programları ulaşamaz.PUT_LINE DBMS_OUTPUT. (f_test(1000)). üç kez çalıştırılıyor. 7000 1000 5000 10. Paketler veri tabanı nesneleri olarak kabul edilir. iki parça halinde düşünülür. Bir paket belirli bir isim ile veri tabanı içinde saklanabilir. Paketler. İkincisi ise. Sadece çalışarak görevlerini yerine getirmeleri sağlanabilir. Bu blok çalıştırıldığında oluşan çıktıyı görmek için linke tıklayınız. Uygulama programları sadece paketin başlık kısmıyla ilgilenir. BEGIN -. paketin içerdiği yordam ve fonksiyonların ayrıntılı kodlarını.Bu amaç ile yazılan PL/SQL bloğunu görmek için linke tıklayınız..

1 Paketlerin Yaratılması Bir paketin yaratılması için belirli işlemlerin yapılması gerekmektedir.10.. Örnek Bir paket oluşturacağız. Fonksiyon ise bolum tablosunda kaç bölümün kaydedildiğini görüntüler. diğer yordam ve fonksiyonlar. FUNCTION fonksiyon adı (parametre listesi) RETURN veri türü IS BEGIN deyimler. İkinci deyim ise paketin ana kısmını yaratmak üzere kullanılır. Aşağıdaki deyim. paketin başlık kısmını yaratır: CREATE OR REPLACE PACKAGE paket adı IS yordam başlıkları. END paket adı. bolum tablosuna yeni bölümler eklemeyi sağlar. Yordam.. Bu paket bir yordam ve bir fonksiyondan oluşacaktır. fonksiyon başlıkları. 275 .5. END paket adı.. Paketin ana kısımlarını yaratmak üzere aşağıdaki tanım kullanılır: CREATE OR REPLACE PACKAGE BODY paket adı IS PROCEDURE yordam adı (parametre listesi) IS BEGIN deyimler. ! Amacımıza uygun p_test isimli paketin başlık ve paketin ana kısımlarını oluşturmak için paket düğmesine tıklayınız. Bir paketi yaratmak için iki deyim kullanılır: Birinci ifade paketlerin başlık kısmını yaratmak amacıyla kullanılır. END fonksiyon adı. END yordam adı.

BEGIN -. v_konum bolum. v_adi.bolum_adi%TYPE. bir veri tabanı nesnesi olarak veri tabanı içine kaydedildiği görülür.tabloya kayıt ekleme işlemi.5.. Bu yordam bolum -.konum%TYPE) IS BEGIN -. Bu fonksiyon belirli -. bir anonim blok içinde ya da bir uygulama programı içinde çağrılarak çalıştırılır. v_adi bolum.bolum_no%TYPE. Paket bu şekilde oluşturulduktan sonra çalıştırılırsa. -. END f_test.konum) VALUES(v_no. RETURN(v_sayi).bolum_adi%TYPE. -. PROCEDURE p_ekle (v_no bolum. paketin ana kısmı da veri tabanı üzerinde yaratılmış olur. Ancak paket.Bir yordam tanımlanıyor.tablosuna yeni bir kayıt ekler. Paket bu şekilde oluşturulduktan sonra çalıştırılırsa. FUNCTION f_sayi (p_bolum NUMBER) RETURN NUMBER. v_konum). v_adi bolum.Bir fonksiyon tanımlanıyor.Yordamın ana kodları tanımlanıyor… PROCEDURE p_ekle (v_no bolum.bir bölümdeki personel sayısını döndürür.2 Paketlerin Çalıştırılması Paketler oluşturulduktan sonra. v_konum bolum.bolum_adi..Amacımıza uygun p_test isimli paketin başlık kısımları şu şekilde yaratılabilir: CREATE OR REPLACE PACKAGE p_test IS -.Kayıtlar sayılıyor.konum%TYPE). içinde hangi modülün çalıştırılacağını belirlemek için aşağıda gösterildiği biçimde kullanılır: 276 ... INSERT INTO bolum(bolum_no.Fonksiyounun ana kodları tanımlanıyor… FUNCTION f_sayi (p_bolum IN NUMBER) RETURN NUMBER IS v_sayi NUMBER.. SELECT COUNT(*) INTO v_sayi FROM personel WHERE bolum_no = p_bolum. Bu işlemin ardından paketin ana kısımları oluşturulur: CREATE OR REPLACE PACKAGE BODY p_test IS -.. END p_ekle. END p_test. 10..bolum_no%TYPE. END p_test..

END..'KADIKÖY').PUT_LINE (p_test.modül adı(parametreler).'REKLAM'. 10 numaralı bölümdeki personel sayısını verecektir. 277 . DBMS_OUTPUT.paket adı. Örnek Bir anonim blok içinde yer alan p_test yordamı f_test fonksiyonu aşağıda gösterildiği biçimde çalıştırılabilir: BEGIN /* p_test isimli yordam içindeki p_ekle yordamı ve f_test fonksiyonu çalıştırılıyor.f_test(10)). */ p_test..bolum_ekle (60. f_test fonksiyonu.

278 .

279 .

280 .

Dr.DERS SONU İleri Veri Tabanı Sistemleri dersinin sonuna gelmiş bulunmaktayız. Bu çalışmamızın tüm öğrencilerimize faydalı olması dileğiyle.... Yalçın Özkan 281 . Sınavlarınızda başarılar..