Skip to content

PL/SQL programming language tutorials and source codes

License

Notifications You must be signed in to change notification settings

yedincel/How-to-Write-PLSQL

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 

Repository files navigation

How-to-Write-PLSQL

Oracle veri tabanı sistemine özgü olan PL/SQL dili ile ilgili olarak hazırladığım bu içerik en sık kullanılan PL/SQL yapılarını, basic konuları içermektedir. Burada açıklanan yapıların detaylı kod örnekleri repo içerisindeki source dosyasında yer almaktadır.

SQL KOMUTLARI

DDL - Data Dictionary Langue

Veri tanımlama dili (DDL), veri tabanındaki nesnelerinin yapısını oluşturmak ve değiştirmek için kullanılan bir bilgisayar dilidir. Bu veri tabanı nesneleri görünümleri, şemaları, tabloları, dizinleri vb. içerir.

  • CREATE - veri tabanı yaratmak, yeni tablo oluşturmak için kullanılır
  • ALTER - tabloya sütun eklemek, güncellemek için kullanılır
  • DROP - bir veri tabanı veya tabloyu silmeye yarar
  • RENAME - tabloyu veya sütunu yeniden adlandırmaya yarar
  • TRANCATE - tablodaki kayıtları temizler
  • COMMENT - yorum satırı eklemeyi sağlar

DML - Data Manipulation Language

Veritabanında bilgi üzerinde çalışmayı sağlar. Bilgiyi çağırma, bilgiye yeni bir şeyler ekleme, bilgiden bir şeyler silme, bilgiyi güncelleştirme işlemlerini yapar.

  • SELECT - veri sorgulama
  • UPDATE - verileri güncelleme
  • INSERT - veri ekleme
  • DELETE - verileri silme

TCL - Transaction Control Language

İşlem Denetim Dili komutları, DML deyimleri tarafından yapılan değişiklikleri yönetmek için kullanılır.

  • COMMIT - Herhangi bir işlemi kalıcı olarak kaydetmek için commit komutu kullanılır
  • ROLLBACK - Bu komut, veri tabanını son kaydedilen duruma geri yükler yani son yapılan işlemi geri alır.
  • SAVEPOINT - Bir işlemi geçici olarak kaydetmek için savepoint komutu kullanılır.

DCL - Data Control Language

Veri tabanında yetkilendirme işlemleri için kullanılır.

  • GRANT
  • REVOKE


DATA TYPES

Bu bölümde PL/SQL dilinde en sık kullanılan, ihtiyacınızı karşılamaya yetecek olan veri tiplerini ekledim. Özellikle String veri tiplerinden char, varchar2 ve clob, Sayısal veri tiplerinden ise number kullanımından bahsettim. Burada yer alanların dışında çok sayıda veri tipi bulunmaktadır.

Sayısal Veri Tipleri

  • Number : Hem tam sayı hem de ondalık sayıları saklayan boyutu kullanıcı tarafından ayarlanabilen veri tipi Örnek: number(5) en fazla 5 basamaklı tam sayıları tutar, number(2,1) en fazla 2 basamaklı virgülden sonra ise 1 basamaklı sayıları tutar
  • Byte : Tam sayıları tutar
  • Int : Tam sayıları tutar
  • Double : Ondalıklı sayıları tutar
  • Float : Ondalıklı sayıları tutar

String Veri Tipleri

  • Char : Sabit uzunluktadır, karakterleri tutar
  • Varchar2 : Değişken uzunlukta olan karakter tutan veri tipidir Örnek: isim varchar(20); --en fazla 20 karakter uzunluğunda kullanıcı ismi tutabilir
  • Nchar : Sabit uzunluktadır. UNICODE karakter setine sahiptir, yani sadece İngilizce değil ulusal dillere ait karakterleri de saklar
  • Nvarchar : Değişken uzunluktadır. UNICODE karakter setine sahiptir
  • Blob : 8 ile 128 TB arası byte türünde verileri saklar
  • Clob : 8 ile 128 TB arası büyük karakter verilerini saklar
  • Nclob : 8 ile 128 TB arası büyük karakter verilerini saklar aynı zamanda UNICODE özelliğine sahiptir

Boolean Veri Tipi

  • Boolean : True, False ya da Null değerini tutar

Tarih ve Saat Veri Tipleri

  • Datetime : Tarih, saat, dakika ve saniye verisine kadar saklar eğer bu verileri ayrı ayrı saklamasını istiyorsanız aşağıdakileri kullanabilirsiniz
  • Year, day, month, hour


DECLARE ve BEGIN

-- Veri türü oluşturmak için değişkenimizin adını ve tipini DECLARE ile BEGIN arasındaki bölüme yazmamız gerekiyor
-- İstersek veriyi oluşturup direkt olarak bir değer atayabiliriz 3,5,7 gibi sayılar veya A,B,C gibi karakterler...
-- Diğer yöntemler ise veriyi kullanıcıdan almak veya veri tabanındaki tablolardan çekmektir
DECLARE
v_kod number(6);        -- burada v_kod adında maks 6 haneli sayısal bir değişken oluşturduk
v_sayi1 int;
v_sayi2 float;
v_cinsiyet char;    
v_name  varchar2(40);     -- burada v_name adında maks 40 haneli string bir değişken oluşturduk

BEGIN -- Yapmak istediğimiz işlemler bu bölümde yer alır END;

-- Değer atama
DECLARE
v_kod number(6) := 234678;          -- oluşturduğumuz v_kod değişkenine 6 haneli 234678 değerini atadık
v_marka varchar2(20) := 'Adidas';     -- oluşturduğumuz v_marka değişkenine Adidas değerini atadık
BEGIN
END;
-- Kullanıcıdan değer alma 
DECLARE
  v_kod number(6) := &sayi;
  v_marka varchar2(20) := '&marka';   -- String türünde olduğu için tırnak içinde alıyoruz!
BEGIN
  dbms_output.put_line('Lutfen kodu giriniz: ' || v_kod);
  dbms_output.put_line('Lutfen markayı giriniz: ' || v_marka);
END;

-----------------------------------------------

DECLARE
  v_isim VARCHAR2(20);
BEGIN
  v_isim := '&isim';
  dbms_output.put_line('Merhaba ' || v_isim);
END;

OPERATORS



INTO ve SQL FUNCTIONS



SEQUENCE ve QUALIFIER



SQL DML COMMANDS



IF/ELSE

Belirli bir koşulun sağlanması durumunda çalışan kod bloğunun oluşturulması için IF/ELSE kullanılır.

DECLARE
  v_sayi NUMBER := &sayi; -- kullanıcıdan sayı değeri alınır
BEGIN
  if v_sayi > 20 then
    dbms_output.put_line('Girmiş olduğunuz sayı 20 den büyüktür.');
  elsif v_sayi > 10 then
    dbms_output.put_line('Girmiş olduğunuz sayı 10 dan büyüktür');
  else
    dbms_output.put_line('Girmiş olduğunuz sayı 10 dan kücüktür');
  end if;
END;
DECLARE
   v_harf char := '&cevap';
BEGIN
   dbms_output.put_line('Yaşınız 18 e eşitse veya 18 den büyükse Y(Yes) küçükse N(No) seçiniz.');

if v_harf = 'Y' then dbms_output.put_line('Ehliyet alabilirsiniz!'); elsif v_harf = 'N' then dbms_output.put_line('Ehliyet alamazsınız!'); else dbms_output.put_line('Geçerli bir değer giriniz!'); end if; END;


LOOPS

Döngüler belirli koşullar altında, belirli bir işlemin tekrarlanmasını sağlarlar PL/SQL de loop, for ve while olmak üzere 3 tür döngü vardır. Ek olarak cursor içerisinde for-loop kullanılarak tablodan veri getirilir.

DECLARE 
   v_sayi number := 1; 
BEGIN 
   loop 
      v_sayi := v_sayi + 1; 
      if v_sayi > 5 then
         exit; -- koşul sağlanırsa döngüden çıkar
      end if; 
   end loop;
   dbms_output.put_line(v_sayi); 
END; 
-- For döngüsü başlangıç, artış ve bitiş değerleri verilerek belirli bir ifadeyi tekrarlatmaya yarar.
DECLARE
  v_sayi number;
BEGIN
  for v_sayi in 1..50 loop
    dbms_output.put_line('Sayı ' || v_sayi);
    v_sayi := v_sayi + 5
  end loop;
END;
-- While döngüsü, verilen koşul yanlış olana kadar tekrar tekrar çalışır. Örneğin v_sayi 20'den büyük olduğu an koşul sağlanmayacak ve döngü son bulacaktır.
DECLARE  
  v_sayi number := 10;  
BEGIN
  while v_sayi <= 20 loop
    DBMS_OUTPUT.PUT_LINE('Sayı ' || v_sayi);
    v_sayi := v_sayi + 1;
  end loop;
END;
DECLARE 
-- tablo verileri
v_kitap_adi varchar2(50);
v_yazar varchar2(50);
v_yil number;
v_tur varchar2(20);
v_sayfa number;

BEGIN

dbms_output.put_line('Kütüphanedeki kitapların listesi');

/* Kendi oluşturduğum yedincel_kutuphane adındaki tablodan verileri for kullanarak çekiyorum. Sizin bu kodu çalıştırmadan önce bir tablo oluşturmanız, bu tabloya veriler eklemeniz ve daha sonrasında kodları ona göre düzenleyip tekrardan çalıştırmanız gerekmektedir. */

for f in (select kitap_adi,yazar,yil,tur,sayfa from yedincel_kutuphane) loop

    v_kitap_adi := f.kitap_adi;
    v_yazar := f.yazar;
    v_yil := f.yil;
    v_tur := f.tur;
    v_sayfa := f.sayfa;
    
    dbms_output.put_line(v_kitap_adi || ' - ' || v_yazar || ' - ' || v_yil);
    
    if v_tur = 'Roman' then
    dbms_output.put_line('Bu bir romandir');
    
    elsif v_tur = 'Biyografi' then
    dbms_output.put_line('Bu bir biyografidir');
    
    else
    dbms_output.put_line('Gecersiz bir turdur');
    
    end if;
     
end loop;

END;


CURSOR

Cursor tablodan veri getirmemize yarar. For loop içerisinde veya open-fetch-close yaparak tablodan verileri çekip kullanabilmemize imkan sağlar.

DECLARE
   CURSOR c_onay_listesi IS
      SELECT musteri_no, siparis_id, sip_durum
      FROM mo_siparis 
      WHERE siparis_id > 10300;
BEGIN
   for r in c_onay_listesi LOOP
      dbms_output.put_line('Kullanici numarasi: '|| r.musteri_no || '   ' ||'Siparis numarası: '|| 
      r.siparis_id || '   ' ||'Siparis durumu: '|| r.sip_durum);
   end loop;
END;

PROCEDURE

Komutları bir isim altında sakalyarak ihtiyaç halinde çağırıp, komutların çalıştırılmasını sağlayan yapıdır.

-IN
Parametre IN ile işaretliyse parametre 
sadece prosüdüre geçirilir.
-OUT
Parametre OUT ile işaretliyse parametre
dışarıya veri gönderir.
-IN OUT
Her iki özelliği birden barındırır.
DECLARE
   v_sayi1 NUMBER := &sayi1; -- kullanıcıdan değer aldık
   v_sayi2 NUMBER := &sayi2; -- kullanıcıdan değer aldık
   v_en_kucuk NUMBER;

PROCEDURE ENkucuksayi (v_sayi1 IN NUMBER, v_sayi2 IN NUMBER, v_en_kucuk OUT NUMBER) IS BEGIN if v_sayi1 < v_sayi2 THEN v_en_kucuk := v_sayi1; else v_en_kucuk := v_sayi2; end if; END ENkucuksayi;

BEGIN ENkucuksayi(v_sayi1, v_sayi2, v_en_kucuk); dbms_output.put_line('En küçük sayi: ' || v_en_kucuk); END;


FUNCTIONS

PL/SQL fonksiyon yapısı prosedür yapısında olduğu gibi komutları bir isim altında saklayarak ihtiyaç halinde tekrar çalıştırılmasını sağlayan yapılardır.

Fonksiyonların prosedürlerden farkı değer döndürmek zorunda olmasıdır.

DECLARE
   v_sayi1 NUMBER;
   v_sayi2 NUMBER;
   v_en_buyuk NUMBER;

FUNCTION ENbuyuksayi(v_sayi1 IN NUMBER, v_sayi2 IN NUMBER) RETURN NUMBER IS v_en_buyuk NUMBER; BEGIN if v_sayi1 > v_sayi2 then v_en_buyuk:= v_sayi1; else v_en_buyuk:= v_sayi2; end if; RETURN v_en_buyuk; END ENbuyuksayi;

BEGIN v_sayi1:= 23; v_sayi2:= 45;
v_en_buyuk := ENbuyuksayi(v_sayi1, v_sayi2); dbms_output.put_line('En büyük sayi: ' || v_en_buyuk); END;