Blog ' da Ara

Loading

30 Haziran 2011

PL / SQL Nedir? PL / SQL ile Programlama’ ya Giriş

Merhabalar,


Bu yazımızda PL/ SQL hakkında başlangıç aşamasında bilgiler bulacaksınız. Tabi ilerleyen zamanlarda, yazılarımıza daha spesific konularda yer vereceğiz. Sql ilişkisel veritabanlarında veriye ulaşmak ve bu veriyi okumak, yorumlamak, değiştirmek yada verinin depolandağı birimler ile her türlü işlemlerin yapıldığı kodlardır.

SQL (Structured Query Language) yani yapısal sorgulama dili aslında dört kategoride düşünülebilir.

DDL : (Data Definition Language): Verinin tutulacağı tablo  yada veritabanı ile ilgili tanımlama yada oluşturma işlemlerini yaptığımız komutlardır.Bunlardan en genel kullanılanlar aşağıdaki komutlarıdır.
         CREATE         – Veritabanında nesne yaratır.
         ALTER           – Veritabanının yapısını değiştirir.
         DROP            – Veritabanından obje siler.
         TRUNCATE     – Tablodaki kayıtları içerdikleri alan ile birlikte siler.
         COMMENT      – Yorum ekler.
         RENAME        – Nesnenin asını değiştirir.


DML: (Data Manipulation Language):Verileri tabloya ekleme, tablodan çıkarma gibi yada veriler üzerinde yapılan değişiklikler için kullanılan komutlarıdır.
        SELECT       – Veritabanından kayıt okur.
        INSERT        – Tabloya kayıt ekler.
                 UPDATE       – Tablodaki kayıdı günceller.
                 DELETE        – Tablodan kayırları siler ancak kapladığı alan kalır.
                 MERGE         – UPSERT işlemi (ekleme veya güncelleme)
                 CALL            – PL/SQL veya Java alt programı çalıştırır.

         TCL:(Transaction Control Language):Transaction veritabanındaki işlem yada işlemlerdir. Bu işlemlerin tablo yada şema gibi depo birimleri yada datalar üzerinde yapacaklar değişikliklerin geçerli olmasını yada geri almayı sağlarız.Böylece transctionları kontrol etmiş oluruz.
COMMIT        – Yapılanları kayıt eder.
SAVEPOINT    – Daha sonra geri dönülecek bir dönüş noktası belirler.
ROLLBACK     – Son COMMIT’e kadar olan yeri geri alır.

         DCL:(Data Control Language):Veritabanı üzerinde Datalara erişimi kontrol etmek amacıyla kullandığımız komutlardır.
GRANT – Kullanıcıya veritabanı erişim yetkisi verir.
REVOKE – GRANT ile verilen yetkiyi geri alır.

İşte bu komutları db de belli bir sıra ile veya kontrol mekanizması ile veya devasa işlemlerin smart bir model ile db den gerçekleştirildiği durumlarda PL / SQL kullanmak gerekmektedir. Bunun anlaşılması için şöyle bir örnek verilebilir. Mesela 10.000 çalışanı olan bir firma askeri ücret ile çalışan vatandaşlarının maşını 2 katına çıkarmak istiyor ve sizen bu işlemi sisteme yansıtmanızı ve raporlamanızı istiyor.

İki şekilde yapmanız mümkün: 

1- Çalışanların kayıtlarının olduğu tabloda, maaşı 629,95 Tl  olanları bulup, sonra bunları güncellemeli ve daha sonrada raporlamalısınız. Hadi bu işlem bir kere yapılacak, peki ya her gün , fer saat vs. Yapılacak işlemleri manuel komut çalıştırarak yapmak tüm vaktinizi alacaktır.

2- Bir PL/SQL program birimi yazıp aynı işlemleri her seferinde yapmadan hatta memory biriminide kullanarak (değişkenlerde veri saklama) tek bir F9 ile yapabilir yada planlı iş olarakta atayabilirsiniz.

PL/SQL faydaları nelerdir?
1-PL/SQL prosedürel bir yapıya sahiptir.(if/else, for , while gibi kontrol mekanizmalarına izin verir). Sql prosedürel bir yapıda değildir.
2-Tek seferde istediğiniz kadar işlemi db ye göndereceğinizden her seferinde sql queryler çalıştırmaktan daha hızlı toplam sonucu alabilirsiniz.
3- Çalıştırmış olduğunuz sql kodlarını, debug etme, loglama yada module etme gibi işlemleri PL/SQL blocklarla yada yapılarla sağlayabilirsiniz.
4-Oracle Forms, Oracle Report gibi toollara entegre olabilir.
5-Exception handling ile hata yakalama ve bu durumlarda farklı işlemler tanımlayabilir yada loglama yapabilirisiniz.

En Basit PL/SQL block yapısı şekil1 de gözüktüğü gibidir.

                               Şekil1: PL/SQL block yapısı

Şekil1 de alanları açıklayacak olursak BeginàEnd; Kısmı bir pl/sql block için olması şart olan kısımdır. Diğer alanlar eğer gerekli ise eklenir,

Declare tanımlama alanıdır.Burada memory içinde saklayabileceğiniz değişkenleri yada cursor gibi tanımlamaları yapabilirsiniz,

Begin à End; Bu alanda asıl çalışacak sql kodlar, if/else gibi kontrol yapıları yada tüm işlemlerimiz yazılır.

Exception  alanında oracle tarafından tanımlanmış hata bildirimlerini yada kandininiznde tanımlayabileceği hatalar yada sizin kontrolunuzde olamyan durumlar karşısında neler yapmak isteyeceğinizi bildirebilirsiniz.


Şekil2 : PL/SQL blok Tipleri
         Şekil 2 de pl/sql blok tipleri gösterilmiştir.

Anonim blocklar bir isme sahip değildir ve çalıştırılması için tüm block çağrılmalıdır. Veritabanında saklanmazlar.1 defaya mahsus kullanımda genelde tercih edilirler.

Prosedürlerin bir ismi vardır ve veritabanında, tablo yada index gibi bir şema altında depolanıp saklanabilirler. Diğer programlar yada scriptler içinde kullanılabilirler.Ayrıca isimleri ilede çağrılıp işlevini yerine getirebilirler.Birden çok değer getirebilirler.

Fonksiyonlar da prosedürler gibi , veritabanında saklanıp, çeşitli yerlerde çağrılabilirler.Ancak fonksiyonlar tek bir değer döndürürler ve bir veriye return edilmeleri gerekir.

Örnek bir anonim block aşağıdaki gibi olabilir.
declare
tarih date;
begin
select sysdate into tarih from dual;
dbms_output.put_line(tarih);
end;

Burada bir anonym pl/sql blok yazdık ve bu blok tarihi output olarak bize yazdırmaktadır. Tarih kelimesi görüldüğü üzere bir değişkendir. Ve biz bu değişkenin içine dual tablosundan sistem zamanını atadık.Bu blokların içindede bloklar olabilir, nested bloklar denmektedir.
Begin
      Begin
            ...
      End;
End;

         Pl/sql bloklar için select cümleleri yazılıp çekilen dataların yorumlanabileceği gibi, insert , update, delete , merge cümleleride yazılabilir.

         Pl / Sql Cursor (imleç) ler;
Pl /sql ile veritabanına yönelik yazılımlar yaparken en çok kullanılan yazpılardan biridir. Cursor birden çok veriyi memory de tutup yorumlayabilmemizi sağlar. Nasıl ki değişkenler tek bir adet veriyi tutuyorsa , cursor ‘lerde bir çok veriyi hatta tabloları tutabilen pl/sql yapılarıdır.

Cursor’ler oracle tarafından oluşturulan (implicit) ve Kullanıcılar tarafından oluşturalan (explicit) olmak üzere iki çeşittir. Aşağıda implicit cursor için bazı tanımlamalar mevcuttur.

Sql%notfound à belli bir kritere göre data yok sa true döner.
Sql%found     à Belli bir kritere göre data varsa true döner.
Sql%rowcount à Etkilenen Toplam row sayısını verir.

Declare
Rows_deleted varchar2(30);
Begin
Delete from my_table
Where some_column=124;
: Rows_deleted := (sql%rowcount || ‘row deleted’);
End;

Yukarıdaki örnekte sql%rowcount kullanımına yönelik bir çalışma yaptık, görüldüğü üzere kaç kayıt silinmiş bize bilgisini vermektedir.Aşağıda ise iki adet pl/sql blok bulunmaktadır.Her ikiside aynı amaca yönelik yazılmıştır.

Bu bloklar hr.employees tablosunda ismi D ile başlayan kayıtları bize sunmaktadır.Ancak 1. Blok bir implicit cursor ile ikinic bloktada explicit cursor ile yazılmıştır.

1-implicit cursor örnek;

declare
cursor c is select * from hr.employees where first_name like 'D%';
rec hr.employees%rowtype;
begin
open c;
loop
fetch c into rec;
dbms_output.put_line(rec.first_name);
exit when c%notfound;
end loop;
close c;
end;

2-Explicit cursor örnek;
begin
for i in (select * from hr.employees where first_name like 'D%')
loop
dbms_output.put_line(i.first_name);
end loop;
end;

      
Örnek 2 de for döngüsünün nasıl kullanıldığınıda görmüş olduk.Bununla birlikte aşağıdaki gibi bir örnnekte karar yapılarını gösterebilir.
           
declare
myage number :=28;
begin
if myage < 11
 then
    dbms_output.put_line(' I am a child '); 
 else
    dbms_output.put_line(' I am not a child ');
end if;
end;

Özcan YILDIRIM

12 yorum:

  1. Güzel bir çalışma olmuş Hocam.

    Elinize sağlık.

    YanıtlaSil
  2. Teşekkürler biraderceğizim

    YanıtlaSil
  3. kısa ve öz, faydalı oldu gerçekten. emeklerinize teşekkürler.

    YanıtlaSil
  4. çok daha iyi olabilir gerçekten Türkçe kaynak eksikliği var.O yüzden daha detaylı bilgileri bol örneklerle paylaşmak çok daha faydalı olacaktır Teşekkürler.

    YanıtlaSil
  5. Klavyenize saglik hocam nokta atisi yapmissiniz.

    YanıtlaSil
  6. Klavyenize saglik hocam nokta atisi olmus, cokta guzel olmus.

    YanıtlaSil
  7. implicit örneğinde
    "exit when c%notfound;"
    satırı bir yukarıda olursa tablo içindeki son satırı tekrar dbms outputa yazdırmamış oluruz. Bu şekildeyken do while örneği gibi davranıyor.

    YanıtlaSil
  8. Tablolar üzerinde değişiklik yaptıktan sonra(silme,ekleme,güncelleme gibi) commit komutunu yazmazsak kayıt olmuyor mu ?

    YanıtlaSil
  9. SQL- PL/SQL BELGESİ nereden alınır acaba yardımcı olurmusunuz

    YanıtlaSil

"Sorularınız ve Eleştirileriniz Değerlidir"