Prosedürler belirli işlemleri gerçekleştirmek üzere oluşturulan özel bloklardır. PL/SQL’de prosedürler diğer programlama dillerinden biraz farklı olarak birden fazla değer döndürebilirler.
PROCEDURE isim [(parametre[, parametre, ...])] IS [yerel tanımlamalar] BEGIN komutlar [EXCEPTION hata durumları] END [isim]; parametre_adı [IN | OUT [NOCOPY] | IN OUT [NOCOPY]] veritipi [{:= | DEFAULT} açıklama]Bir prosedürün iki kısmı vardır: tanımlama ve gövde. Tanımlama kısmı PROCEDURE kelimesi ile başlar ve prosedür adı ya da parametre listesi ile biter. Parametre tanımlamaları zorunlu değildir. Parametre kullanılmayan prosedürler parantez kullanmadan yazılabilirler.
Prosedürün gövde kısmı IS anahtar kelimesi ile başlar ve END anahtar kelimesi ile biter. Prosedürün gövdesi de üç kısma ayrılır: değişkenlerin tanımlandığı kısım, komut cümlelerinin yazıldığı kısım ve hata durumlarının kontrol edildiği kısım. Değişken tanımlama kısmı IS kelimesinden hemen sonra başlar. Burada DECLARE kelimesi kullanılmaz. Komut cümlelerinin yazıldığı kısım ise BEGIN anahtar kelimesi ile başlar ve EXCEPTION ya da END ile biter. Bu kısımda en az bir komut yazılmalıdır. Hata durumları kısmı zorunlu değildir. Prosedür END kelimesi ile son bulur. Bu anahtar kelimenin yanına prosedür ismi yazılabilir, zorunlu değildir.
Aşağıdaki maas_artir prosedürü bir işçinin maaşının verilen miktar kadar artırılmasını sağlar:
Bu prosedür bir başka blok içerisinden şöyle çağırılabilir:
DECLARE isci_no NUMBER; miktar REAL; BEGIN ... maas_artir(isci_no, miktar);Bir fonksiyon bir değer hesaplayan alt programdır. Fonksiyon ve prosedür yapıları RETURN anahtar kelimesi haricinde benzerdir. Fonksiyonlar şöyle yazılabilirler:
FUNCTION isim [(parametre[, parametre, ...])] RETURN veri_tipi IS [yerel tanımlamalar] BEGIN Komut cümleleri [EXCEPTION Hata durumları] END [isim]; Parametre listesi şu düzende verilebilir: parametre_ismi [IN | OUT [NOCOPY] | IN OUT [NOCOPY]] veri_tipi [{:= | DEFAULT} açıklama]Yukarıda prosedürler için anlatılan yapı kısmı fonksiyonlar içinde geçerlidir. Fark olarak burada fonksiyon tek bir değer döndürür ve bu değerin tipi RETURN anahtar kelimesinde sonra yazılır.
Aşağıdaki fonksiyon bir maaş miktarının istenen dereceye ait olup olmadığını bulur:
FUNCTION maas_ok (maas REAL, ucret_derece INTEGER) RETURN BOOLEAN IS min_ucret REAL; max_ucret REAL; BEGIN SELECT endusuc, enyukuc INTO min_ucret, max_ucret FROM ucretoran WHERE derece = ucret_derece; RETURN (maas >= min_ucret) AND (maas <= max_ucret); END maas_ok;Bu fonksiyon bir başka blok içerisinden şöyle çağrılabilir:
DECLARE yeni_ucret REAL; yeni_derece NUMBER(5); BEGIN ... IF maas_ok(yeni_ucret, yeni_derece) THEN ...Bir PL/SQL alt programını Oracle’ın tüm diğer ürünlerinde de kullanmak istiyorsak bu alt programı veritabanına kaydedebiliriz. Alt programları Oracle veritabanına kalıcı olarak kaydetmek için CREATE
PROCEDURE
ve CREATE
FUNCTION komutları kullanılır.
Yukarıda fonksiyon ve prosedürler anlatılırken bunlara parametreler geçirilebileceği söylenmişti. Bir alt programa parametreler üç farklı modda geçirilebilir. Bunlar IN, OUT, IN OUT olarak adlandırılır. Bu üç mod her alt programda kullanılabilir. Fakat OUT ve IN OUT modlarının fonksiyonlarda kullanılmaması önerilir. Çünkü bir fonksiyonun amacı sıfır, bir ya da daha çok parametre alıp sonuçta tek bir değer göndermektir.
IN modunda alt programa geçirilen bir parametre bir sabit gibi davranır. Yani alt program içerisinde bu parametrenin değeri alınıp başka bir değişkene aktarılabilir, fakat değiştirilemez. Eğer parametre geçirirken hiçbir mod belirtilmezse, parametreler otomatik olarak IN modunda kabul edilir. IN modunda gönderilen parametre bir sabit, string, değişken ve matematiksel bir işlem olabilir.
OUT modunda gönderilen bir parametre alt program içerisinde bir değişken gibi davranır. Paramterenin değeri alnıbilir ve değiştirilebilir. Bu tip bir parametre mutlaka bir değişken olmalıdır. Yani bir sabit ya da matematiksel bir işlem bu modda gönderilemez. Burada alt programa gönderilen parametrenin değeri, alt programa geçtiği anda NULL değer olur. Bu yüzden alt programa OUT modunda gönderilecek bir parametre tanımlanırken NOT NULL kısıtlamasının getirilmemiş olmasına dikkat edilmelidir. Alt program bittikten sonra, alt program içerisinde değer atanmış olan OUT modu parametreleri bu değerlerini korurlar. Yani girişte NULL değer alıp çıkışta değerlerini korurlar.
IN OUT modunda gönderilen parametreler diğer iki modun yaptığını birleştirirler. Yani bir parametre bir ilk değer ile alt programa girer, alt program içerisinde bu değeri değişebilir ve değerini kaybetmeden alt programdan çıkar. IN OUT modunda gönderilen bir parametre bir değişken olmalıdır, sabit, string ya da matematiksel bir işlem olamaz.
Oracle’da paket olarak adlandırılan nesneler, birbiriyle ilişkili fonksiyon ve prosedürlerin bir isim altında gruplanmasıyla oluşturulur. PL/SQL paketleri sayesinde daha modüler programlar geliştirilebilir. Birden fazla uygulama tarafından kullanılan bir paket üzerinde değişiklik yapılarak, tüm bu uygulamaların güncellenmesi sağlanabilir. Bir paket içerisindeki bir alt program çağrıldığında, tüm paket belleğe alınır ve bu paketle ilişkili diğer alt programlar bu sayede hızlı çalıştırılabilir.
Bir paket tanımlama ve gövde kısımlarından oluşur. Tanımlama kısmı bir ara yüz gibidir. Veri tipleri, sabitleri hata durumları, imleçler ve alt programlar burada tanımlanır. Paket gövdesinde ise imleçlerin ve alt programların işlem satırları yer alır.
Aşağıda Oracle yardım dokümanları içerisinde verilmiş bir şema yer almaktadır. Burada anlatılmak istenen “kara kutu” olarak verilen gövde kısmında rahatlıkla değişiklik yapılabileceğidir. Tanımlamalar “specification” kısmında yer aldığına göre gövdede yapılan değişikliklerden uygulama programı etkilenmeyecektir.
Bir paket oluşturmak için CREATE
PACKAGE
komutu kullanılır:
Tanımlama kısmı genel tanımlamaları içerir ve uygulama programları tarafından görülür. Gövde kısmı ise program kodlarını, ayrıntıları ve özel tanımlamaları içerir. Uygulama programları buraya erişemez. Gövde de değişiklik yapıldığında uygulama programlarının yeniden derlenmesi gerekmez. Burada AUTHID kısmı paketi oluşturan kullanıcın adıdır.
CREATE OR REPLACE PACKAGE isci_islem AS -- tanımlama TYPE IsKayTip IS RECORD (isci_no INTEGER, ucret REAL); CURSOR ucret_liste RETURN IsKayTip; PROCEDURE isci_kayit ( İscino NUMBER isciadi VARCHAR2, isi VARCHAR2, muduru NUMBER, ucret NUMBER, bolum NUMBER); PROCEDURE isci_sil (isci_no NUMBER); END isci_islem; CREATE OR REPLACE PACKAGE BODY isci_islem AS -- gövde CURSOR ucret_liste RETURN IsKayTip IS SELECT iscino, ucret FROM isci ORDER BY ucret DESC; PROCEDURE isci_kayit ( İscino NUMBER, isciadi VARCHAR2, isi VARCHAR2, muduru NUMBER, ucret NUMBER, bolum NUMBER) IS BEGIN INSERT INTO isci VALUES (iscino, isciadi, isi, muduru, SYSDATE, ucret, bolum); END isci_kayit; PROCEDURE isci_sil (isci_no NUMBER) IS BEGIN DELETE FROM isci WHERE iscino = isci_no; END isci_sil; END isci_islem;Tetiklemeler(PL/SQL Triggers) tıpkı prosedürler gibi veritabanına kaydedilir, fakat program kodu içerisinde çağrılarak işletilmezler. Tetiklemeler veritabanı tarafından otomatik olarak başlatılırlar. Tetiklemeleri başlatan bazı olaylar vardır. Bu olaylar INSERT, UPDATE, DELETE gibi veri işleme dili komutları, veri tanımlama dili komutları, veri tabanı açma-kapama işlemleri, bir kullanıcnın bağlanma ya da bağlantı kesme işlemleri gibi olaylardır. Bir tetikleme prosedürü üç bölümden oluşur:
Tetiklemelerin oluşturulmasını göstermek için bir örnek yapalım. “isci” tablomuzdaki herhangi bir işçinin maaşı arttığında maaşı 1000’i geçenleri başka bir tabloya kaydeden bir tetiklme yazalım. Burada işleme maaş artıktan sonra başlayacağız. Bu yüzden AFTER UPDATE kullanıyoruz. Tetiklemelerin bu kısmına AFTER ve BEFORE gibi kelimeler yazılır. AFTER INSERT OR UPDATE gibi iki olayı kapsayan şartlarda yazılabilir. Buraya ON DATABASE SHUTDOWN gibi sistem olaylarıda yazılabilir.
CREATE OR REPLACE TRIGGER maas_artisi AFTER UPDATE ON isci FOR EACH ROW WHEN (new.ucret > 1000) BEGIN INSERT INTO isci_log (isci_no, artis_tarihi, yeni_ucret) VALUES (:new.iscino, SYSDATE, :new.ucret ); END;