PL/SQL NEDİR?

Veri Akademi7 dk okuma
PL/SQL Oracle prosedürel dil logosu ve veritabanı sembolü

Aynı sorguyu her seferinde uygulamadan göndermek yerine veritabanının içine gömseniz ne olurdu? Bir SELECT yazıp sonucuna göre IF yazmak, döngü kurmak, hata yakalamak — düz SQL ile bunlar mümkün değil. İşte PL/SQL tam burada devreye girer: SQL'in bildirimsel gücüne prosedürel bir kabuk ekler ve veriyi ait olduğu yerde işlemenize izin verir.

1. PL/SQL Nedir?

PL/SQL (Procedural Language extensions to SQL), Oracle'ın 1991'de SQL'i programlama dili gibi kullanabilmek için tasarladığı uzantı dildir. Standart SQL bildirimseldir; "ne istediğinizi" söyler, "nasıl" sorusunu motora bırakırsınız. PL/SQL ise bu denkleme değişken, döngü, koşul, istisna yönetimi ve modüler yapı ekler. Sonuç: tek bir SQL deyimine sığmayan iş kurallarını veritabanı içinde çalıştırabilirsiniz.

Dilin temel birimi bloktur. Her blok üç bölümden oluşur: DECLARE (değişken tanımları), BEGIN (yürütülen kod) ve EXCEPTION (hata yakalama). Bu yapı, kodun hem okunabilir hem de hata toleranslı olmasını sağlar. Sözdiziminin tüm ayrıntıları ve bloğun derleyici tarafından nasıl yorumlandığı için Oracle'ın resmi dil referansı en doğru başvuru kaynağıdır.

DECLARE
  v_musteri_sayisi NUMBER;
BEGIN
  SELECT COUNT(*) INTO v_musteri_sayisi
  FROM musteriler
  WHERE durum = 'AKTIF';

  IF v_musteri_sayisi > 1000 THEN
    DBMS_OUTPUT.PUT_LINE('Yüksek aktif kullanıcı yoğunluğu');
  END IF;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('Kayıt bulunamadı');
END;

2. Standart SQL'den Hangi Noktada Ayrılır?

SQL ile PL/SQL'i karıştırmak yaygın bir yanılgıdır. İkisi aynı motorda çalışsa da farklı işler için tasarlanmıştır:

  • SQL tek bir küme üzerinde çalışır: SELECT, INSERT, UPDATE, DELETE. Mantık dallanması yoktur.
  • PL/SQL değişken tutar, IF / CASE / LOOP kullanır, imleç (cursor) ile satır satır gezer.
  • SQL uygulama katmanından gönderilir, ağ üzerinden gider, sonucu döner.
  • PL/SQL blok hâlinde sunucuya gönderilir, sunucuda çalışır; ağ trafiğini azaltır.
  • SQL hata kodlarını döndürür; PL/SQL hatayı yakalayıp telafi davranışı tanımlayabilir.

Pratikte bir örneği düşünün: 50.000 siparişi tek tek kontrol edip belirli koşula uyanların durumunu güncellemeniz gerekiyor. Düz SQL ile bunu tek deyimde yapabilirsiniz ama her satır için ayrı bir hesaplama, log kaydı ve koşullu bildirim eklemeniz gerekirse imleçli bir PL/SQL bloğu çok daha temiz olur.

PL/SQL blok yapısı DECLARE BEGIN EXCEPTION üç bölümlü mimari diyagramı

3. Ne Zaman Stored Procedure Yazılır?

Stored procedure (saklı yordam), veritabanında derlenmiş hâlde duran, isimle çağrılabilen PL/SQL bloğudur. Her sorguyu prosedüre dönüştürmek doğru değildir — fakat aşağıdaki durumlarda prosedür yazmak hem performans hem de bakım açısından kazandırır:

  1. İş kuralı veriye çok yakınsa: Stok düşümü, fatura tutarı hesaplama, kredi limit kontrolü gibi yoğun veri okuma gerektiren mantık.
  2. Birden fazla uygulamanın aynı kuralı kullanması gerekiyorsa: Hem web uygulaması hem batch sistemi aynı hesaplamayı yapıyorsa, kuralı veritabanına gömmek tek doğruluk kaynağı yaratır.
  3. Toplu işlem ve gece operasyonları: Milyonlarca satırın saatlik özet tablolarına aktarılması.
  4. Güvenlik gerekçesi: Uygulamaya tabloya doğrudan erişim vermek yerine prosedür çağırma yetkisi verirsiniz; veri katmanı izole kalır.
  5. Karmaşık işlem yönetimi: Birden fazla tabloya yazıp tek bir COMMIT/ROLLBACK ile yöneteceğiniz mantık.

Buna karşılık, hızlı değişen iş kurallarını veya UI'a sıkı bağlı doğrulamaları prosedüre gömmek genellikle iyi bir fikir değildir; deploy ve versiyonlama yükü artar.

4. PL/SQL'in Sunduğu Programlama Yapıları

Dilin programlama tarafında size sunduğu araçlar oldukça geniştir:

  • Değişken ve tip tanımları: NUMBER, VARCHAR2, DATE; tabloya bağlı %TYPE ve %ROWTYPE.
  • Kontrol yapıları: IF-THEN-ELSIF, CASE, LOOP, FOR, WHILE.
  • İmleçler (cursor): Çok satırlı sorgu sonuçlarını satır satır işlemek için.
  • İstisnalar (exception): Önceden tanımlı (NO_DATA_FOUND, TOO_MANY_ROWS) veya kullanıcı tanımlı hata yapıları.
  • Modüler yapılar: Procedure, function ve package. Package, ilişkili kodu tek bir mantıksal birim altında toplar.
  • Tetikleyiciler (trigger): Tablo üzerinde INSERT, UPDATE, DELETE olduğunda otomatik çalışan PL/SQL kodu.

Konuyu derinlemesine pratikle çalışmak isterseniz Oracle PL/SQL eğitimi içeriğinden yararlanabilirsiniz; blok yapısından paketlere kadar adım adım örneklerle ilerleyen bir akış sunar.

5. Performans Açısından Neden Önemli?

PL/SQL ile yazılan kod Oracle motoruyla aynı süreçte çalışır. Bu yakınlığın getirisi çok somuttur:

  • Daha az ağ gidiş-dönüşü: Uygulama, tek bir prosedür çağrısı yapar; içeride 20 SQL deyimi olabilir.
  • Önceden derlenmiş plan: Prosedürler derlenmiş hâlde saklanır; parse maliyeti minimize edilir.
  • Bulk işlemler: BULK COLLECT ve FORALL ile binlerce satır tek seferde işlenir; satır-satır işlemenin tersine context switch maliyeti düşer.
  • Önbellek dostu: SGA içindeki shared pool, sıkça çağrılan prosedürleri bellekte tutar.
Stored procedure çağrı akışı uygulama ve veritabanı arasındaki iletişim şeması

6. SQL ve PL/SQL Hangi Sırayla Öğrenilmeli?

PL/SQL içinde tek satır SQL bilmeyen biri ilerleyemez. Önce SELECT, JOIN, GROUP BY, alt sorgu ve analitik fonksiyonlara hakim olmak gerekir. Ardından PL/SQL'in bloğu, akış kontrolü, imleçleri ve istisnaları çok daha hızlı oturur. SQL temelinizi sağlamlaştırmak için temel SQL ve PL/SQL içerikleri bir arada inceleyebilirsiniz.

7. Kısaca Ne Zaman PL/SQL?

Eğer işiniz tek bir SQL deyimine sığıyorsa, PL/SQL'e gerek yoktur — düz SQL hem daha hızlı hem daha okunaklıdır. Ama iş kuralı dallanıyorsa, satır-bazlı mantık varsa, hata durumlarını kontrol etmek istiyorsanız veya aynı mantığı pek çok uygulamadan çağıracaksanız PL/SQL ve stored procedure doğru tercihtir. Karar verirken sorulması gereken soru basittir: "Bu mantık, veriye en yakın yerde mi çalışmalı, yoksa uygulama katmanında mı kalmalı?"

Sıkça Sorulan Sorular

PL/SQL ile SQL arasındaki temel fark nedir?

SQL bildirimseldir; ne istediğinizi söyler, sonucu alırsınız. PL/SQL ise SQL'i prosedürel yapılarla genişletir: değişken, IF, döngü, imleç ve istisna yönetimi ekler. Tek bir SQL deyimine sığmayan iş mantığını veritabanı içinde yürütmenizi sağlar ve birden fazla SQL'i tek blokta birleştirir.

PL/SQL sadece Oracle'da mı çalışır?

Evet, PL/SQL Oracle'a özgüdür. PostgreSQL'in PL/pgSQL'i ve SQL Server'ın T-SQL'i benzer prosedürel uzantılardır ama söz dizimi ve dahili paketler farklıdır. PL/SQL kodu doğrudan başka bir veritabanında çalışmaz; taşıma için yeniden yazım veya dönüştürme araçları gerekir.

Stored procedure ve function farkı nedir?

Procedure bir işi yapmak için çağrılır; geri değer döndürmek zorunda değildir. Function ise her zaman bir değer döner ve SELECT içinde de kullanılabilir. Procedure tipik olarak veri değiştiren iş akışlarında, function ise hesaplama veya türetilmiş alan üretmek için tercih edilir.

%TYPE ve %ROWTYPE ne işe yarar?

%TYPE bir değişkeni bir tablo sütununun veri tipine bağlar; tabloda tip değişirse kod kırılmaz. %ROWTYPE ise bir tablonun veya imlecin tüm satır yapısını temsil eder. İkisi de kodu tablo şemasına eşler ve bakım maliyetini ciddi şekilde düşürür.

Tetikleyici (trigger) ile stored procedure ne zaman tercih edilir?

Trigger, tablo üzerinde otomatik olarak (INSERT/UPDATE/DELETE) çalışması gereken kurallar içindir; çağrılması gerekmez. Procedure ise açıkça çağrılması gereken iş mantığı içindir. Aşırı trigger kullanımı izlenmesi zor bir kod akışı yaratır; bu yüzden ana iş kurallarını procedure içinde tutmak daha temiz bir yaklaşımdır.

BULK COLLECT ve FORALL neden performans için kritik?

Klasik döngü her satır için PL/SQL ile SQL motoru arasında context switch yapar. BULK COLLECT satırları tek seferde koleksiyona alır, FORALL ise toplu DML çalıştırır. Bu iki yapı, binlerce satırlık işlemlerde satır-satır işlemeye göre çoğunlukla onlarca kat hızlanma sağlar.

PL/SQL öğrenmek için önce neyi bilmek gerekir?

Önce SQL temelleri: SELECT, JOIN, GROUP BY, alt sorgu ve analitik fonksiyonlar. PL/SQL bunların üzerine prosedürel katmanı ekler. SQL'i sağlam bilmeden PL/SQL bloğu yazmak, çoğu zaman dile değil veri modeline takılmanıza yol açar; bu nedenle SQL pratik düzeyi şarttır.

Package kullanmanın avantajı nedir?

Package, ilişkili procedure ve function'ları tek bir mantıksal birim altında toplar. Specification ve body ayrımı sayesinde arayüz değişmediği sürece body değişimi bağımlı kodları kırmaz. Bellekte bir kez yüklenir, oturum boyunca durum tutabilir ve büyük projelerde modülerlik sağlar.