Üye Kayıt Üye Giriş

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


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

 

 

PL/SQL PROSEDÜRLERİ

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:

PROCEDURE maas_artir (isci_no INTEGER, miktar REAL) IS gecerli_ucret REAL; ucret_yok EXCEPTION; BEGIN SELECT ucret INTO gecerli_ucret FROM isci WHERE iscino = isci_no; IF gecerli_ucret IS NULL THEN RAISE ucret_yok; ELSE UPDATE isci SET ucret = ucret + miktar WHERE iscino = isci_no; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN print 'Yanlış İşçi Numarası' WHEN ucret_yok THEN print 'Geçerli Maaş Miktarı Yok'); END maas_artir;

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);

PL/SQL Fonksiyonları

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 ...

Kayıtlı Alt Programlar

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 CREATEPROCEDURE ve CREATE FUNCTION komutları kullanılır.

Parametre Modları

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.

PL/SQL Paketleri

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 CREATEPACKAGE komutu kullanılır:

CREATE [OR REPLACE] PACKAGE paket_ismi [AUTHID {CURRENT_USER | DEFINER}] {IS | AS} [tip_tanımı [tip_tanımı] ...] [imleç_tanımı [imleç_tanımı] ...] [{altprog_tanımı | çağrı_tanımı}[{altprog_tan | çağrı_tan}]...] END [paket_ismi]; [CREATE [OR REPLACE] PACKAGE BODY paket_ismi {IS | AS} [tip_tanımı [tip_tanımı] ...] [imleç_gövdesi [imleç_gövdesi] ...] [{altprog_tanımı | çağrı_tanımı} [{altprog_tan | çağrı_tan}]...] [BEGIN komut_cümleleri] END [paket_ismi];]

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;

PL/SQL Tetiklemeleri

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:

  • Tetikleme olayı ya da komutu
  • Tetikleme kısıtlaması
  • Tetikleme işlem bölümü

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;
Bilgisayar Dershanesi Ders Sahibi;
Bilgisayar Dershanesi

Yorumlar

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

ETİKETLER

x