Kategoriler
Anlatım Microsoft

Saklı Yordamlar (Stored Procedures)

Saklı yordamlar tek çalışma planı (single execution plan) üzerinden çalışan T-SQL ifadelerinden oluşur veya bir Microsoft .Net CLR (Common Language Runtime – Ortak Dil Çalışma Zamanı) metoduna referans gösterir. T-SQL kodlarının el verdiği oranda tıpkı bir programlama dili gibi yordam yazmak mümkündür. Fakat yazılan kod çoğu zaman bir tablo üzerinde çalışır. Yani veritabanı üzerindeki bir tabloda (ya da tablolar üzerinde) işlem yapacak kodlardır.

Saklı yordamlar daha önceden yorumlandıkları için hızlı çalışırlar. Bunun ilk sebebi önceden derlenmiş olmasıdır. Fakat derleme işlemini her çalışmada tekrar yapması istenebilir. Bunun için RECOMPILE anahtar kelimesi kullanılır. Ayrıca tablolarda veri işleyen üçüncü parti programlara oranla veri alışveriş hızı nedeniyle daha hızlıdırlar ve bu nedenle performans konusunda da iyilerdir denebilir. Çoğumuzun bildiği gibi veritabanında bilgiler tutulur ve bu bilgiler şirket için çok değerlidir. İç bir şirket, bilgilerinin ele geçirilmesini istemez. Yani veritabanı bilgi güvenliği çok önemlidir. SQL Server üzerinde bir dizi işlemi üçüncü parti program kullanarak yapmak tehlikelidir çünkü üçüncü parti programların ne derece güvenli olduğunu bilmek her zaman mümkün olmaz. Bu sebeple güvenlik açısından da saklı yordamları kullanmak çok önemlidir. Aksi halde veritabanı üzerindeki bilgiler farkında olmadan başkalarının eline geçebilir. Bunlara ek olarak, saklı yordamlar içerilerine parametre alabilirler. Bu sayede parametreye verilen farklı değerler sayesinde farklı sonuçlar elde etmek mümkündür. Saklı yordamlar çalıştırıldıktan sonra bir değer veya bir satır da döndürebilirler. Satır döndürme işlemini imleçler (cursor) sayesinde yaparlar. Saklı yordamlarda bir parametrenin girdi parametresi mi yoksa çıktı parametresi mi olduğunu belirtmek için INPUT ve ya OUTPUT anahtar kelimeleri kullanılır. Tahmin edeceğiniz gibi INPUT girdi parametresidir ve OUTPUT çıktı parametresidir, yani sonuç olarak döndürülecek değer bu parametrededir. Bu anahtar kelimeler tanımlamanın sonuna yazılır. Bunlarla birlikte, saklı yordamlar içerisinde değişken tanımlamakta mümkündür. Tanımlamayı DECLARE komutuyla yaparız. Fakat burada dikkat etmemiz gereken şey bir parametre veya değişken tanımlarken isimlerin başına @ işaretini koymamız gerekir. Örnek olarak, DECLARE @parametre1 varchar(10) INPUT ya da DECLARE @parametre2 varchar(10) OUTPUT gösterilebilir. Parametre ve değişkenleri kullanırken bir değer atamak istiyorsak SET komutunu kullanırız.

Saklı yordamlar geçici ve ya kalıcı süre için oluşturulabilirler. SQL Server sistem saklı yordamlarının başına sp ön ekini koyar. Örneğin sp_who gibi. Bu nedenle saklı yordamlara isim verirken başına sp koymamaya özen gösterilmelidir. Eğer geçici yerel bir saklı yordam oluşturmak istersek saklı yordam adının önüne # işaretini koymamız gerekir. Eğer global bir saklı yordam oluşturmak istersek bu durumda ##prosedür_ismi şeklinde yazmamız gerekir. Saklı yordamlar başka bir saklı yordam içerisinde, sql sorgusu içerisinde, tetikleyici (trigger) içerisinde veya üçüncü parti bir yazılım içerisinden çağırılabilirler.

En basit anlamda T-SQL kodu oluşturmak için

CREATE PROCEDURE yordam_adı
AS
BEGIN
Değişkenler, sorgu cümleleri vb
END

 

Şeklinde bir yazım yeterlidir. Fakat bu son derece sade bir saklı yordamdır. Daha ayrıntılı olarak bir saklı yordam oluşturmak için aşağıdaki ayrıntılı kod da kullanılabilir. Fakat bu kod aslında tüm kullanım seçenekleriyle birlikte verilmiştir. Bir saklı yordam oluşturmak için aşağıdaki kodun hepsini yazmaya ilgili yerleri değiştirmeye gerek yoktur. (Aşağıdaki ayrıntılı örnek referans kodu SQL Server Books Onlinedan alınmıştır.)

CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ;number ]
    [ { @parameter [ type_schema_name. ] data_type }
    [ VARYING ] [ =default ] [ OUT | OUTPUT ] [READONLY]
    ] [ ,…n ]
[ WITH <procedure_option> [ ,…n ] ]
[ FOR REPLICATION ]
AS { <sql_statement> [;][ …n ] | <method_specifier> }
[;]
<procedure_option> ::=
    [ ENCRYPTION ]
    [ RECOMPILE ]
    [ EXECUTE AS Clause ]
 
<sql_statement> ::=
{ [ BEGIN ] statements [ END ] }
 
<method_specifier> ::=
EXTERNAL NAME assembly_name.class_name.method_name

 

Saklı yordamları çalıştırmak için EXEC ifadesini kullanırız. Kaldırmak için ise DROP ifadesi kullanılır. Kullanım şekilleri aşağıdaki gibidir.

EXEC saklı_yordam;

DROP PROCEDURE saklı_yordam;