Veritabanı yönetimi ve uygulama geliştirme süreçlerinde, aynı SQL sorgularını (SELECT, INSERT, UPDATE, vb.) uygulamalar içerisinde tekrar tekrar yazmak hem zaman kaybına hem de kod karmaşasına neden olur. İşte bu noktada Stored Procedure (Saklı Yordam) kavramı devreye girer. Bir stored procedure, veritabanında kalıcı olarak saklanan ve belirli bir görevi yerine getirmek için önceden derlenmiş (precompiled) olan bir dizi SQL komutudur. Bunu, veritabanınızın içine yerleştirilmiş, ihtiyaç duyduğunuz her an ismini çağırarak çalıştırabileceğiniz “yeniden kullanılabilir bir komut dosyası” (reusable script) olarak düşünebilirsiniz.
Yalnızca temel veri saklama ve okuma işlemleri yapan geleneksel sistemlerden farklı olarak, günümüzün modern ilişkisel veritabanlarında (PostgreSQL, SQL Server, Oracle vb.) stored procedure kullanımı bir endüstri standardıdır. (Not: Microsoft Access gibi daha basit, istemci-sunucu mimarisinde olmayan dosya tabanlı veritabanı sistemleri stored procedure veya trigger gibi özellikleri desteklemez).
Stored Procedure Neden Geliştirildi?
İlişkisel veritabanlarının ilk yıllarında veritabanı sistemleri sadece veriyi saklama ve getirme işlemlerinden sorumluydu; veriyi filtreleme, işleme ve üzerinde kararlar alma (business logic) görevi tamamen dışarıdaki uygulama programlarına aitti. Ancak istemci/sunucu (client/server) mimarileri yaygınlaştıkça, bu durum ciddi bir performans darboğazı yarattı.
Stored procedure kavramı, ilk olarak orijinal Sybase SQL Server ürününde bu performans sorunlarını çözmek amacıyla tanıtılmıştır. Stored procedure’ler olmadan, bir uygulamanın veritabanından gerçekleştireceği her bir işlem için ağ (network) üzerinden SQL sorguları göndermesi ve cevap beklemesi gerekiyordu. Örneğin, bir işlemi tamamlamak için 6 farklı SQL sorgusu çalıştırılması gerekiyorsa, bu durum ağ üzerinde 6 kez veri gidiş-dönüşü (round trip) anlamına geliyordu. Stored procedure’ler sayesinde bu 6 adımlık işlem dizisi veritabanının içine tek bir program olarak kaydedilebilir hale geldi. Böylece uygulamanın sadece bu yordamı çağırması yeterli oldu ve 6 ağ gidiş-dönüşü, tek bir çağrıya düşürülerek sistem performansı muazzam ölçüde artırıldı.
SQL Stored Procedure Kullanımının Başlıca Avantajları
Günümüzde kurumsal DBMS (Veritabanı Yönetim Sistemi) projelerinin neredeyse tamamında stored procedure kullanımı kritik bir rol oynar. Bunun arkasında yatan temel avantajlar şunlardır:
- Yüksek Performans ve Hız: Stored procedure’ler, veritabanı tarafından önceden derlenmiş (precompiled) yapılardır. Bir stored procedure oluşturulduğunda, veritabanı motoru bu kodu analiz eder ve en verimli çalışma planını (execution plan) hazırlayarak kendi içinde saklar. Yordam tekrar çağrıldığında yeniden derlenmesine gerek kalmaz, bu da çalışma hızını inanılmaz derecede artırır.
- Ağ Trafiğini Azaltma: İstemci (client) uygulamasından sunucuya (server) uzun ve karmaşık SQL sorguları göndermek yerine, sadece stored procedure’ün adını ve parametrelerini göndermek yeterlidir. Bu, özellikle yavaş ağ bağlantılarında veya trafiğin çok yoğun olduğu sistemlerde genel performansı önemli ölçüde iyileştirir.
- Yeniden Kullanılabilirlik (Reusability): Belirli bir işlevi (örneğin müşteri siparişi girmek veya stok düşmek) yerine getiren bir yordam yazıldığında, bu yordam birbirinden tamamen farklı uygulamalar (web sitesi, mobil uygulama, masaüstü yazılımı vb.) tarafından tekrar tekrar çağrılabilir. Bu durum kod tekrarını önler ve yazılımcı hatalarını sıfıra indirir.
- Güçlü Güvenlik (Security): Güvenlik açısından stored procedure’ler veritabanında güvenilen nesneler olarak kabul edilir. Veritabanı yöneticileri (DBA), bir kullanıcıya tablolar üzerinde doğrudan “okuma/yazma” yetkisi vermek yerine, yalnızca belirli stored procedure’leri “çalıştırma” (EXECUTE) yetkisi verebilir. Böylece kritik verilerin yapısı gizlenmiş olur ve kullanıcılar sadece izin verilen işlemleri yapabilir.
- Kapsülleme ve İş Kurallarının Merkezi Yönetimi: Nesne yönelimli programlamadaki (OOP) kapsülleme (encapsulation) mantığına benzer şekilde, verinin nasıl işleneceği dışarıdan gizlenir ve sadece belirli arayüzler (procedure’ler) üzerinden veritabanına erişim sağlanır. Ayrıca, şirketinizin “iş kuralları” (örneğin; “yeterli stok yoksa siparişi iptal et”) doğrudan bu procedure’lerin içine kodlanabilir. Farklı uygulamalar sipariş girmeye çalışsa bile, hepsi aynı procedure’ü kullanmak zorunda olduğu için iş kuralları veritabanı seviyesinde tek bir merkezden, firesiz olarak uygulanır.
Stored Procedure’lerin Programlama Yetenekleri
Standart bir SQL dili, veriyi tanımlamak ve çekmek için tasarlanmıştır; IF koşulları, döngüler veya değişkenler gibi geleneksel programlama yeteneklerine sahip değildir. Ancak “Procedural SQL” (Yordamsal SQL) sayesinde stored procedure’ler, gerçek bir programlama dilinin gücünü veritabanına getirir.
- Değişkenler ve Parametreler (Variables and Parameters): Bir stored procedure, dışarıdan girdi alabilmek için parametreler kabul eder ve aynı şekilde işlemin sonucunu veya birden fazla veriyi dışarıya aktarmak için çıktı (output) parametreleri kullanabilir. Ayrıca procedure içinde geçici verileri tutmak için isimlendirilmiş yerel değişkenler (named variables) tanımlanabilir.
- Koşullu Yürütme (IF…THEN…ELSE): Yordam içerisindeki verileri test ederek sonuca göre kodun farklı şekillerde akmasını ve farklı işlemlerin yapılmasını sağlayabilirsiniz.
- Döngüler (WHILE, FOR): Belirli bir sonlanma koşulu karşılanana kadar bir SQL işlem dizisinin tekrar tekrar çalıştırılmasını (looping) sağlayabilirsiniz.
- Blok Yapısı (Block Structure): Birçok SQL komutunu tek bir mantıksal blok içinde toplayabilir ve hata yakalama (error handling) senaryolarını bu bloklar üzerinde işletebilirsiniz.
SQL’de Stored Procedure Nasıl Oluşturulur ve Çağrılır?
Farklı veritabanı yönetim sistemlerinin (SQL Server, Oracle, PostgreSQL vb.) yordam oluşturma sözdizimleri (syntax) birbirine çok benzer. Genellikle yeni bir procedure tanımlamak için CREATE PROCEDURE komutu kullanılır.
Örneğin, PostgreSQL veritabanında yeni bir çalışanı sisteme eklemek ve önceden derlenmiş bu yordamı kullanmak için şöyle bir yapı kurulabilir:
CREATE OR REPLACE PROCEDURE insert_employee(
emp_id INT,
emp_first_name VARCHAR,
emp_last_name VARCHAR
)
LANGUAGE plpgsql
AS $$
BEGIN
-- Yeni çalışanı employees (çalışanlar) tablosuna ekliyoruz
INSERT INTO employees (employee_id, first_name, last_name)
VALUES (emp_id, emp_first_name, emp_last_name);
END;
$$;
Bu kod çalıştırıldığında veritabanında insert_employee adında bir stored procedure kalıcı olarak oluşur. İhtiyacınız olduğunda uzun uzun INSERT sorguları yazmak yerine, sadece bu procedure’ü “çağırarak” işleminizi gerçekleştirebilirsiniz. Çağırma işlemi için CALL veya sistemine göre EXECUTE komutu kullanılır.
CALL insert_employee(101, 'John', 'Doe');
Sistem Tanımlı ve Harici Stored Procedure’ler
Uygulama geliştiricilerin kendi yazdığı procedure’lerin yanı sıra, gelişmiş veritabanı sistemleri (özellikle Microsoft SQL Server) veritabanı yönetimini otomatikleştirmek için yüzlerce sistem tanımlı stored procedure sunar. Bu yordamlar genellikle sp_ öneki ile başlar (Örneğin; yeni bir kullanıcı eklemek veya veritabanı hakkında bilgi almak için kullanılan sp_helpuser gibi).
Ek olarak, SQL sınırlarının dışına çıkılması gereken karmaşık hesaplamalarda veya işletim sistemi seviyesindeki işlemlerde harici (external) stored procedure’ler devreye girer. Bu harici yordamlar, C veya Pascal gibi dillerde veritabanının dışında derlenir ve veritabanına tanıtıldıktan sonra tıpkı normal bir SQL stored procedure’ü gibi EXECUTE komutu ile kolayca çağrılabilir.
Sonuç
Özetle, SQL Stored Procedure’ler veritabanınızı yalnızca cansız verilerin tutulduğu bir depo olmaktan çıkarıp, iş kurallarının işletildiği aktif ve güçlü bir “işlem motoruna” dönüştürür. Web uygulamanızın veya analiz araçlarınızın çok daha hızlı, güvenli ve hatasız çalışması için, sık tekrar eden tüm karmaşık SQL mantıklarınızı stored procedure’ler içine alarak kod temizliğini sağlayabilir ve uygulamanızın performansını zirveye taşıyabilirsiniz.





