PL/SQL NEDİR?

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.

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;

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ı

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.

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.

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ı

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.

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ı?"