Saklı Yordam (Stored Procedure) Nasıl Yazılır?
Saklı yordam nedir, parametre ve gövde nasıl kurulur, hata yönetimi ve sık yapılan hatalar nelerdir. Örnek senaryolarla SQL stored procedure yazmayı öğrenin.
Saklı yordam nedir, hangi sorunu çözer?
Saklı yordam, veritabanı sunucusunda adıyla saklanan ve gerektiğinde çağrılan hazır bir SQL kod bloğudur. Aynı sorguyu ya da işlem dizisini uygulamanın her yerinde yeniden yazmak yerine bir kez yazar, sonra adıyla çalıştırırsınız. Bir fonksiyona benzer, ancak veri değiştiren komutları, koşulları ve döngüleri de içerebilir.
Temel faydaları şunlardır: • Mantık tek yerde durur; kural değiştiğinde yalnızca yordamı güncellersiniz. • Uygulama sunucuya uzun bir SQL metni yerine kısa bir çağrı gönderir. • Yetkilendirme kolaylaşır: kullanıcıya tabloya doğrudan erişim vermeden yalnızca yordamı çalıştırma yetkisi verilebilir. • Parametreli çalıştığı için SQL enjeksiyonu riskini azaltmaya yardımcı olur.
Buna karşılık iş mantığının bir kısmı veritabanına taşınmış olur. Bu, sürüm takibini, test etmeyi ve ekipler arası sorumluluğu etkileyen bir mimari karardır; yordam yazmaya başlamadan önce ekibin bu konudaki yaklaşımını bilmek gerekir.
Bir saklı yordamın yapısı: ad, parametre, gövde
Her saklı yordam şu parçalardan oluşur. Önce bir ad verilir; ad, yordamın yaptığı işi anlatmalıdır, örneğin sipariş iptal eden bir yordam için siparisi_iptal_et gibi. Sonra isteğe bağlı parametreler tanımlanır. Parametreler giriş (IN), çıkış (OUT) ya da hem giriş hem çıkış olabilir; her birinin bir veri tipi vardır. Son olarak gövde gelir: BEGIN ile END arasında çalışacak komutların tamamı.
Gövdede şunları kullanabilirsiniz: SELECT, INSERT, UPDATE ve DELETE komutları, değişken tanımları, IF ve CASE ile koşullar, döngüler, geçici tablolar ve transaction komutları. Yordamı değiştirmek için çoğu sistemde ALTER ya da CREATE OR REPLACE benzeri bir ifade, kaldırmak için DROP PROCEDURE kullanılır.
Genel kalıp şöyledir: CREATE PROCEDURE komutundan sonra ad, parantez içinde parametre listesi ve ardından gövde yazılır. Çalıştırırken kullandığınız sisteme göre CALL ya da EXEC komutu kullanılır.
Adım adım ilk saklı yordamı yazmak
Yöntem, yazmadan önce işi netleştirmekle başlar. Yeni başlayanlar için işe yarayan akış şöyledir: • Önce işi sade bir cümleyle yazın: yordam hangi girdiyi alacak, hangi tabloları değiştirecek, ne döndürecek? • Gövdedeki sorguyu yordam dışında, sabit değerlerle çalıştırıp sonucunu doğrulayın. • Sabit değerleri parametrelerle değiştirin ve veri tiplerini tabloların sütunlarıyla uyumlu seçin. • Veriyi değiştiren adımları transaction içine alın; bir adım hata verirse tümü geri alınsın. • Hata durumunda ne olacağını önceden belirleyin: hata fırlat, değer döndür ya da kaydı log tablosuna yaz. • Yordamı test veritabanında hem geçerli hem sınır durumlarla (boş değer, olmayan kayıt, yetkisiz kullanıcı) çalıştırın.
Bu sırayı atlamak, en sık görülen sorunun, yani üretimde ilk kez çalıştırılan ve beklenmedik veri değiştiren yordamların kaynağıdır.
Örnek senaryo: sipariş iptal yordamı
Örneğin bir e-ticaret veritabanında siparişin iptali birkaç tabloyu birlikte etkiliyor olsun: sipariş durumu güncellenir, stok geri eklenir, ödeme kaydına iade talebi düşer. Bu işlemleri uygulamadan ayrı ayrı göndermek, bağlantı kesilirse yarım kalmış veriye yol açar.
Bunun yerine siparisi_iptal_et adında bir yordam yazılır. Girdi olarak sipariş numarasını alır. Gövde önce siparişin var olup olmadığını ve zaten iptal edilip edilmediğini kontrol eder; koşul sağlanmıyorsa anlaşılır bir hata mesajıyla durur. Sonra transaction başlatır, sipariş durumunu günceller, sipariş kalemleri üzerinden stok tablosunu artırır, iade kaydını ekler ve işlemi onaylar. Herhangi bir adımda hata olursa ROLLBACK ile tüm değişiklikler geri alınır.
Uygulama tarafı artık yalnızca yordamı çağırır. Kural değiştiğinde, örneğin belirli durumdaki siparişlerin iptali yasaklandığında, değişiklik tek bir yerde yapılır.
Veritabanı sistemine göre sözdizimi farkları
Saklı yordam fikri her sistemde aynıdır, ama dil farklıdır. SQL Server ve Azure SQL tarafında T-SQL kullanılır; parametreler @ işaretiyle başlar, çalıştırmak için EXEC yazılır. Oracle PL/SQL dilini kullanır ve yordamlar genellikle paketler içinde gruplanır. PostgreSQL'de PL/pgSQL yaygındır ve yeni sürümlerde CALL ile çağrılan yordamlar ile değer döndüren fonksiyonlar ayrı kavramlardır. MySQL ve MariaDB'de CREATE PROCEDURE yazarken komut ayracını geçici olarak değiştirmek için DELIMITER kullanılır.
Bu yüzden bir eğitim kaynağından ya da örnek koddan kopyaladığınız yordam, başka bir sistemde çalışmayabilir. Çalıştığınız sistemin resmî dokümantasyonundaki sözdizimini esas alın; burada anlatılan yapı genel kavramdır, ayrıntılı komut biçimi sürüme göre değişir.
Taşınabilirlik önemliyse yordamın içindeki iş mantığını sade tutmak, sisteme özgü özellikleri sınırlı kullanmak ilerideki geçişi kolaylaştırır.
Sık yapılan hatalar ve nasıl önlenir
Başlangıçta en çok karşılaşılan hatalar şunlardır: • Transaction kullanmamak: birden fazla tabloyu değiştiren yordam yarıda kalırsa tutarsız veri bırakır. Çözüm, değişiklik adımlarını transaction içine almak ve hata yakalamayla ROLLBACK yapmaktır. • Parametreyle gelen metni birleştirerek dinamik SQL kurmak: SQL enjeksiyonuna açıktır. Mümkünse doğrudan parametre kullanın, dinamik SQL gerekiyorsa parametreli çalıştırma yöntemlerini seçin. • Her şeyi tek yordama doldurmak: yüzlerce satırlık, okunması zor yordamlar bakımı imkânsız hale getirir. Küçük, tek işi yapan yordamlar yazıp birbirinden çağırın. • Veri tipi uyuşmazlığı: parametre tipi sütun tipinden farklıysa örtük dönüşüm indeks kullanımını bozup sorguyu yavaşlatabilir. • Sürüm kontrolü olmadan canlı sunucuda yordam düzenlemek: yordam metnini de uygulama kodu gibi sürüm kontrol sistemine alın.
Yordamın ne döndürdüğünü belgelemek de önemlidir: kaç parametre aldığı, hangi hataları fırlattığı ve hangi tabloları etkilediği kısa bir yorumla yordamın başında yazılmalıdır.
Öğrenme yolu: temelden ileriye
Saklı yordam yazmak, SQL'in temelleri oturduktan sonra gelen bir adımdır. Önce SELECT, filtreleme, JOIN ve gruplama rahat yazılabilmeli; ardından INSERT, UPDATE, DELETE ve transaction kavramı öğrenilmelidir. Bu temeller hazırsa yordam yazmak, bildiğiniz komutları bir ad altında toplamaktan ibarettir. Sonraki aşamada koşullar, döngüler, imleçler, hata yakalama ve tetikleyiciler (trigger) gelir. İleri düzeyde ise yürütme planı okuma ve yordam performansını izleme öne çıkar.
Mindset kataloğunda SQL ile Veri Sorgulama (İleri) eğitiminin modülleri arasında Görünümler, Stored Procedure ve Tetikleyiciler başlığı yer alır; aynı eğitim CTE, alt sorgu ve sorgu performansı konularını da içerir. SQL ile Programlama Eğitimi ise veritabanı oluşturma, veri işleme dili ve görüntüleme (views) modüllerini kapsar. Bu içerikler, veri ekibinde yordam yazması beklenen analist ve geliştiriciler için temel oluşturur; kurumsal ekipler ortak bir yordam standardı için aynı müfredat üzerinden ilerleyebilir.
İlgili Mindset programı
SQL ile Veri Sorgulama (İleri)
Sık sorulan sorular
Saklı yordam ile fonksiyon arasındaki fark nedir?
Fonksiyon genellikle bir değer hesaplayıp döndürür ve sorgunun içinde ifade gibi kullanılabilir. Saklı yordam ise bir iş akışını yürütür; veri değiştirebilir, transaction yönetebilir ve birden fazla sonuç kümesi döndürebilir. Yordam SELECT içinde çağrılamaz, ayrı bir komutla çalıştırılır. Kesin kurallar veritabanı sistemine göre değiştiği için kullandığınız sistemin dokümantasyonuna bakın.
Saklı yordam sorguyu gerçekten hızlandırır mı?
Her zaman değil. Yordamlar bazı sistemlerde yürütme planını önbelleğe alabilir ve ağ üzerinden daha az veri taşır, bu da avantaj sağlayabilir. Ancak yavaş bir sorguyu yordamın içine koymak onu hızlandırmaz; asıl hız indeksleme ve sorgu tasarımından gelir. Performans iddiasını yürütme planıyla ölçerek doğrulamak gerekir.
Saklı yordamı hangi durumda kullanmamalıyım?
İş mantığı sık değişiyorsa, ekipte veritabanı kodunu sürüm kontrolünde yönetecek alışkanlık yoksa ya da uygulamanın farklı veritabanı sistemlerine taşınması bekleniyorsa yordamlar yük olabilir. Bu durumlarda mantığı uygulama katmanında tutup SQL'i basit sorgularla sınırlamak daha esnek bir yoldur.
Parametreli yordam SQL enjeksiyonunu tamamen engeller mi?
Hayır. Parametreler değerleri komuttan ayırdığı için riski belirgin biçimde azaltır, fakat yordamın içinde parametre değerini metne ekleyerek dinamik SQL kurarsanız açık yeniden doğar. Dinamik SQL kaçınılmazsa parametreli yürütme yöntemini ve yetki kısıtlarını birlikte kullanın.
Yordam yazmayı öğrenmek için hangi araç yeterli?
Yerel kurulu bir veritabanı sunucusu ve onun yönetim aracı yeterlidir: SQL Server için SQL Server Management Studio, MySQL için MySQL Workbench, PostgreSQL için pgAdmin gibi. Önce küçük bir deneme veritabanında çalışın; böylece hatalı bir yordamın gerçek veriye zarar verme riski ortadan kalkar.
İlgili rehberler
İlgili eğitimler
Kategori: Veri Analitiği ve İş Zekası, Yazılım Geliştirme