Transact-SQL ifadelerinin birarada kullanılmasından
oluşturulan yapılara Stored Procedure adı verilir. Stored
Procedure farklı yapılarda bulunur.
Bunlar;
•System Stored Procedure(sp_): Bu tür procedure'ler,
master veri tabanı içinde tutulur ve genellikle sistem
tabloları hakkında bilgi döndürmek için kullanılır. Genel
olarak sp ifadesi ile başlar. Herhangi bir veri tabanı içinde
çalıştırılabilir.
3.
•Local Stored Procedure:Kullanıcı veri tabanları
içinde, özel olarak tanımlanan stored procedure'lerdir.
•Temporary Stored Procedure: Geçici olarak
oluşturulan stored procedure'lerdir. İki ayrı yapısı vardır.
Sadece belli bir veri tabanında kullanılanlar ve tüm veri
tabanlarında kullanılanlar. Lokalde kullanılanların ismi #
ile başlarken, diğeri ## ile başlar.
4.
•Remote Stored Procedure:SQL Server'ın eski bir
kullanımı olan bu yapı, dağıtılan(distributed)
sorgulamalarda kullanılmaktadır.
Extended Stored Procedure(xp_): DLL'ler tarafından,
SQL Server dışında kullanılan stored procedure'lerdir.
Genellikle xp ifadesi ile başlayan bu tür stored
procedure'ler, bazı system stored procedure'leri tarafından
da çağrılarak kullanılabilir
5.
SQL Server içindekiStored Procedure diğer programlama dillerine
benzer;
* Diğer stored procedure'leri çağırabilir.
* Dışarıdan değer alabilir.
* İçinden çağrılan değer; başarılı veya başarısız olarak dönebilir.
* Birden fazla değeri, dışarıya yollayabilir.
Kısacası, Transact-SQL komutlarını kullanarak yapılan programlama
olarak ifade edebiliriz. Ayrıca uygulama yazılımları tarafından aynı anda
kullanılması, veri tabanı yapısını gizlemesi, güvenlik mekanizmasının
gelişmiş olması, performansı arttırması ve network trafiğini azaltması
sayılabilecek diğer avantajlarındandır.
6.
STORED PROCEDURE YAPILANDIRMASI:
STOREDPROCEDURE NASIL OLUŞTURULUR?
Stored Procedure, aktif veri tabanı içinde oluşturulur. Sadece
geçici stored procedure'ler tempdb veri tabanı içinde tutulur. Stored
procedure oluşturma formatı, view oluşturma formatına benzer.
CREATE PROCEDURE ifadesi ile oluşturulur.
Stored Procedure oluştururken aşağıdaki kurallara ve
önerilere dikkat etmek gerekir.
* CREATE PROCEDURE tanımlaması, sınırsız sayıda ve tipte
Transact-SQL ifadesi içerebilir. Ancak beraber kullanılamayacak
ifadelerde vardır. Bunlar;
CREATE DEFAULT
CREATE PROCEDURE
CREATE RULE
CREATE TRIGGER
CREATE VIEW
7.
* Stored Procedureiçinde; tablo, view, kullanıcı tanımlı fonksiyon ve
diğer stored procedure'ler, aynı zamanda geçici tablolar da kullanılabilir.
* CREATE PROCEDURE ifadesini kullanmak için, aşağıdaki haklara
veya gruplara üye olmak gerekir.
sysadmin
db_owner
db_ddladmin
Veya CREATE PROCEDURE iznine sahip olmalı.
CREATE PROC[EDURE] procedure_adı[;sayı]
[{@parametre_adı veri tipi]
[VARYING][=default][OUTPUT]][,n]
[WITH{RECOMPLIE|ENCRYPTION|RECOMPLIE,ENCRYPTION}]
[FOR REPLICATION] AS sqljfadesi[leri]
* Bir stored procedure'ün en fazla boyutu 128 MB olabilir. Kullanım biçimi;
8.
EXECUTE STORED PROCEDURE:
Dahaönce de belirttiğimiz gibi bir stored procedure, exec
komutu ile çalıştırılır. Ayrıca bir INSERT ifadesinin parçası
olarak da çalıştırılabilir.
UYGULAMA
USE user
go
create procyenisatisekle
as
insert into sati values(105,'Hulk',88,'01/22/2011','01/25/2011')
insert into sati values(106,'Hulk',99,'01/23/2011','01/27/2011')
go
•Aşağıdaki kodu SQL Query Editör içine yazarak, satis tablosuna iki kayıt
ekleyen stored procedure'ü oluşturalım.
11.
•İlk adımda yazdığımızyazılımı çalıştırdığımızda, sadece
yenisatisekle isimli bir stored procedure oluşturur. Kesinlikle bu
kodu çalıştırmak, satis tablosuna bir ilave yapmaz. Ekleme yapması
için oluşan stored procedure aşağıdaki şekilde çalıştırılmalıdır.
•satis tablosunu açtığımız zaman görüntü, aşağıdaki gibi olacaktır.
12.
•Şimdi de INSERTifadesi ile beraber Stored Procedure'ü nasıl'
çalıştıracağımızı inceleyelim
Aşağıdaki şekilde "merkez" isimli yeni bir tablo oluşturalım ve
içine hiçbir veri girmeyelim
create proc turkcelo as
select * from musteri where mtel like '0532%'
•Şimdi, müşteriler içinde 0532 ile başlayan telefonları seçen
"turkcelo" isimli bir Stored Procedure oluşturalım.
13.
Exec turkcelo
•turkcelo isimlistored procedure'ü, aşağıdaki gibi yazarak çalıştıralım. Bunun
sonucunda, şekildeki gibi sadece 0532 ile başlayan telefon numaraları
listelenecektir
14.
Use user
İnsert intomerkez
Exec turkcelo
•Şimdi esas yapmamız gereken işi yapalım, turkcelo stored orocedure'ü,
0532 ile başlayan telefon numaralarını seçiyor. Biz bu özelliği kullanarak
0532 ile başlayan telefona sahip kayıtları; yeni oluşturduğumuz merkez
isimli tabloya kopyalayacağız ve bunun için stored procedure'ü aşağıdaki
gibi INSERT ifadesi ile çalıştıracağız. Aşağıdaki kodu, SQL Server Query
Editor'e yazarak, çalıştıralım.
15.
•İşlem başarı iletamamlandıktan sonra merkez tablosunu açarak, kayıtları
kontrol edelim.
use cuneyt;
go
create proc fantastik as select
musterino,upper(SUBSTRING(mad,1,2)),null,null
from musteri
•Şimdi daha değişik bir şey yapalım. Aşağıdaki örnekte isimin ilk iki
harfini kopartarak, telefon numarasının ilk dört rakamı ile birleştirerek,
isim sütununa yazdıran Stored Procedure'ü oluşturuyoruz. Diğer sütunları
boş bırakıyoruz ve bu seçilen kayıtları, merkez tablosuna ekliyoruz.
create proc fb.fantastik
as
selectmusterino,upper(SUBSTRING(mad,1,2)),null,null
from musteri
go
•Bir veri tabanında aynı isimli stored procedure olabilir. Ancak kullanıcı adı
farklı olmak kaydı ile bu gerçekleşebilir. Aşağıda görkem adlı kullanıcıya ait
fantastik isimli stored procedure'ü oluşturuyoruz. Tabiki önceden böyle bir
kullanıcı olması gerekir. Veya bu isimli bir Schema tanımlanması lazım. SQL
Server 2012 içinde bağımsız şema oluşturulabilir.
18.
STORED PROCEDURE DEĞİŞİKLİĞİve SİLME
•Oluşturulan bir stored procedure üzerinde kod ile değişiklik
yapılacaksa, ALTER PROCEDURE ifadesi kullanılır.
•Yalnız tavsiye edilen; bir stored procedure'ü direkt olarak değiştirmek
yerine, yeni bir stored procedure'ü oluşturarak; eskisini kopyalayıp
onun üzerinde değişiklik yapmaktır. Değiştireyim derken bozabilirsiniz,
onun için bu şekilde yedekli çalışmak, en iyi çözümdür.
19.
Dikkat edilecek noktalar;
•Herhangibir ekstra seçenek kullanılarak oluşturulmuş stored
procedure'ü (Örneğin; WITH ENCRYPTION) değiştirirken, mutlaka
bu seçenekleri tekrar yazmak gerekir.
•ALTER PROCEDURE ifadesi sadece bir stored procedure'e etki
eder. Eğer değiştirdiğiniz stored procedure, başka bir stored
procedure tarafından çağrılıyorsa(nested stored procedure) çağıran
stored procedure, bu değişiklikten etkilenmez ve çalışmasında
sorunlar çıkabilir.
* Bu değişikliği yapabilmek için; sysadmin, db_owner veya
db_ddladmin sabit rollerine üye olmak gerekir. En azından ALTER
PROCEDURE izninin taşınması gerekir.
20.
alter proc fantastikas select
CONVERT(char(3),musterino)musterino,UPPER(substri
ng(mad,1,2)),null,null
from musteri
go
use cuneyt;
go
drop proc fantastik
Aşağıdaki kod ile daha önce oluşturduğumuz "fantastik" isimli
stored procedure içinde değişiklik yapabiliriz.
Bir stored procedure'ü silmek için ise DROP PROC ifadesi kullanılır.
21.
STORED PROCEDURE OLUŞTURMAKILAVUZU:
Stored Procedure oluştururken dikkat edeceğimiz yapılar;
Tüm Stored Procedure'ların, aynı bağlantı ayarlarını
kullanması gerekir. Bunun için SQL Server; stored procedure
oluştururken veya değiştirirken iki ayarı kaydeder. Bunlar: SET
OUOTEDJDENTIFIER ve SET ANSI_NULLS. Bunların
seçenekleri ON ve OFF'dur. ANSI_NULLS; OFF olursa boş olan
değerler NULL olarak döner. ON olursa; hiçbir şey yazmaz. SET
OUOTEDJDENTIFIER; String değerleri içinde kullanılan tırnak
işareti durumunu belirtir. Bu değer ON olduğu zaman tanımlamalar;
çift tırnak kullanımı içine alınır ve bilgiler için mutlaka tek tırnak
kullanılması gerekir. Eğer OFF olursa; tanımlayıcılarda tırnak
kullanılmaz ve Transact-SQL içinden gelen tüm kurallara uyulması
gerekir.
22.
STORED PROCEDURE İÇİNDEPARAMETRE KULLANIMI:
Stored Procedure'leri daha fonksiyonel olarak kullanmak için,
parametreli olarak tasarlamak gerekir. Örneğin; kitap adına göre
sorgulama yapmayı planlıyoruz, eğer direkt kitap adını sorgulama içine
yazarsak, başka bir kitap adı için her seferinde değişiklik yapmamız
gerekir. İşte bu durumda; kitap adını parametre olarak tanımlarsak,
sorgulamayı dinamik olarak kullanabiliriz. Output ve Input olmak üzere,
iki adet parametre vardır. Ancak SQL Server 2012 ile beraber bir üçüncü
parametre tipi eklenmiştir ve bunun adı da Table-Valued' dir.
•Bir stored procedureiçinde en fazla, 2100 adet parametre
tanımlanabilir.
•Lokal değişkenlerin sayısı ise hafıza ile sınırlıdır.
•Parametre adları, sadece o stored procedure için geçerlidir. Aynı
isim, başka bir stored procedure için de kullanılabilir.
• Parametre bilgileri, syscolumns sistem tablosunda tutulur.
OUTPUT PARAMETER:
Bir StoredProcedure'ü çağırdığımız zaman, içinde bulunan
değeri döndürebilir.Bunun için OUTPUT ifadesi kullanılır.
•Eğer OUTPUT değişkeni bir değer almaz ise, yine de Stored
Procedure çalışır, ama değer fırlatmaz.
•Text ve image dışında herhangi bir veri tipi olabilir.
• Çalıştırırken yine exec komutu kullanılır.
27.
create proc carp
@aint,
@b int,
@sonuc int output*
as
set @sonuc=@a*@b
go
1) Aşağıdaki Stored Procedure, dışarıdan gelen iki değeri hesaplayarak
@sonuc isimli değişkene atıyor. @sonuc değişkeni Output ile tanımlandığı
için bu, dışarıya kullanılmak için gönderilebilir.
declare @c int
execute carp
@a=12,
@b=5,
@sonuc=@c output select 'sonuc:',@c
2) Çalıştırmak için gerekli yazılım, aşağıdaki gibi olmalıdır.
TABLE-VALUED PARAMETER:
SQL Server2012 ile birlikte gelen yeni bir parametre
tipi vardır. Bu Table-valued parameter olarak adlandırılır.
Kullanıcı tanımlı tablo tipi i|e deklare edilir. Böylelikle geçici
tablo veya birçok parametre kullanmaya gerek kalmadan,
birçok satır kullanılabilir.
30.
STORED PROCEDURE'LERİN YENİDENDERLENMESİ:
Stored Procedure normalde bir kez çalıştıktan sonra kendini;
Cache içine yerleştirerek, daha hızlı çalışmayı sağlar. Ancak aşağıdaki
durumlarda Stored Procedure' ün yeniden derlenmesi gerekir.
•Parametreler; Stored Procedure içine geçtikten sonra, çok geniş bir
değer döndürürlerse.
•Stored Procedure için yararlı olabilecek yeni bir index, tabloya
eklenirse.
* Parametre değerleri başka tipe dönüşüyorsa.
Yeniden derlemek için, WITH RECOMPILE ifadesi
kullanılır. Çalıştırırken Exec procedure_adı With recompile veya Exec
sp_recomplie procedure__adı ifadeleri kullanılabilir.
31.
use cuneyt
go
create procyeniden
@a nvarchar(10)
with recompile
as
select COUNT(*) from sati
where filmad=@a
go
Eğer bir Stored Procedure'ün, Cache içinde tutulmasını değil
de, her seferinde yeniden derlenmesini istiyorsak, o zaman With
Recompile komutunu kullanırız. Aşağıdaki ifade bunu sağlar.
32.
Exec yeniden 'superman'
Dbcc freeproccache
Çalıştırmak için aşağıdaki kodu yazalım ve sonucu gözlemleyelim.
Eğer tablolarımız aynı ise "2" değerinin çıkması gerekir.
Cache içinde bulunan tüm Stored Procedure planlamalarını
silmek için, aşağıdaki ifade kullanılır.
33.
HATA MESAJLARI:
Stored Procedure'leridaha etkili kullanmak için;
bünyesinde hata mesajları tanımlanarak bir hata durumunda,
kullanıcı bilgilendirilebilir. Bu sadece hata durumlarında değil, aynı
zamanda olumlu durumlarda da tercih edilebilir.
Burada döndürülecek değer; Return ifadesi ile
belirlenebilir. Eğer Return değeri "0" ise işlem başarılı, "0" ile
"14" arasında ise aktif kullanılan, "15" ile "99" arası ise
gelecekte kullanılacak değerlerdir. Eğer kullanıcı tanımlı Return
değeri desteklenmiyorsa SQL Server, kendisininkini kullanır.
34.
UYGULAMA:
1) Aşağıdaki örnek,sistem fonksiyonu olan @@rowcount ile satır sayısını
döndürmektedir.
use cuneyt
go
create proc kactane
@f char(10)
as
select * from sati
where filmad=@f
return (@@rowcount)
Go
2) Çalıştırmak için, aşağıdaki kodu yazmak yeterlidir.
declare @x int
exec @x=kactane
@f='superman'
print @x
35.
Çıktısı, şekildeki gibiolacaktır
3) Özel hata mesajı oluşturmak için sp_addmessage system stored
procedure'ü kullanılır.
Böylelikle master tablosu içinde bulunan sysmessages; sistem
tablosu içine yazılır. Ayrıca hata durumu, Windows 2003- 2012
Application log yapısında bulunur.
36.
Aşağıdaki ifade buyapıya ait bir örnektir.
use master
exec sp_addmessage
@msgnum=50010,
@severity=10,
@msgtext='yapma böyle hatalar',
@with_log='true'
4) Burada kullanılan parametrelerden msgnum ile kayıt numarasını,
severity parametresi ile hatanın türünü ve önemini belirtiyoruz. Bu,
çeşitli düzeylerden oluşuyor. Eğer "10" değerini verirsek bu;
kullanıcının yanlış bilgi girişi yaptığı bilgisini, 11- 16 arası düzeyde
ise kullanıcının doğru bilgi girmesini, 17-25 arası ise yazılım ve
donanım ile ilgili hataları gösterir. msgtextı çıkacak mesajı belirler.
37.
Master veri tabanıiçindeki sysmessages tablosunu sorgulamak
için aşağıdaki ifadeyi yazarak çalıştırdığımızda, tabloda kendi
mesajımızın eklenmiş olduğunu görebiliriz.
5) Mevcut bir mesajı değiştirmek için, replace özelliği aşağıdaki gibi
kullanılır.
exec sp_addmessage
@msgnum=50010,
@severity=10,
@msgtext='dikkat hatası var',
@with_log='true',
@replace='replace'