STORED PROCEDURE
Transact-SQL ifadelerinin bir arada 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.
•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.
•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
SQL Server içindeki Stored 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.
STORED PROCEDURE YAPILANDIRMASI:
STORED PROCEDURE 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
* Stored Procedure iç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;
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.
[EXECUTE]
[@ dönen_durum=]
{procedure_adı[;sayı]}
[[parametre)]{değer|@değişken[OUTPUTJ|[DEFAULT]]
[WITH RECOMPLIE]
insert into tablo_adı
exec storedprocedure_adı
Kullanım sekli:
INSERT ifadesinin kullanım şekli;
UYGULAMA
USE user
go
create proc yenisatisekle
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.
•İlk adımda yazdığımız yazı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.
•Şimdi de INSERT ifadesi 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.
Exec turkcelo
•turkcelo isimli stored procedure'ü, aşağıdaki gibi yazarak çalıştıralım. Bunun
sonucunda, şekildeki gibi sadece 0532 ile başlayan telefon numaraları
listelenecektir
Use user
İnsert into merkez
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.
•İşlem başarı ile tamamlandı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.
•Çalıştırdığımızda yeni kayıtlar "merkez" tablosu içine aşağıdaki şekilde
eklenecektir.
create proc fb.fantastik
as
select musterino,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.
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.
Dikkat edilecek noktalar;
•Herhangi bir 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.
alter proc fantastik as 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.
STORED PROCEDURE OLUŞTURMA KILAVUZU:
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.
STORED PROCEDURE İÇİNDE PARAMETRE 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.
INPUT PARAMETRE:
Input türü parametreler kullanarak; SQL Server içine bilgilerin
geçişini sağlarız. CREATE PROC ifadesi ile kullanılan bu yazılım, bir
veya daha fazla olabilir.
Kullanım biçimi:
©parametre adı veritipi[=default]
Dikkat edilecek noktalar;
•Tüm giriş türlü parametreler, stored procedure başında uygun olup-
olmadığı kontrol edilir.
•Eğer input parametre tanımlarken bir default değer verilmiş ise, o
zaman özel bir değer atamaya gerek yoktur. Parametreler mutlaka bir
değer içermeli veya NULL tanımlaması yapılmalıdır. Bunun dışındaki
durumlarda hata oluşur.
•Bir stored procedure iç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.
[EXECUTE] procedure_adı
[@parametre_adı=atanacak_değer[OUTPUT
][DEFAULT
[WITH RECOMPLIE]
Oluşturulan parametreli stored procedure'lerin çalıştırılması
için; EXECUTE stored procedure_adı ifadesinden sonra
@parametre_adı=verilecek_değer ifadesi yazılarak, parametrelere
değer atanır.
Kullanım biçimi;
OUTPUT PARAMETER:
Bir Stored Procedure'ü ç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.
create proc carp
@a int,
@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.
3) Çalıştırıldığı zaman çıktısı, aşağıdaki gibi olacaktır.
TABLE-VALUED PARAMETER:
SQL Server 2012 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.
STORED PROCEDURE'LERİN YENİDEN DERLENMESİ:
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.
use cuneyt
go
create proc yeniden
@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.
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.
HATA MESAJLARI:
Stored Procedure'leri daha 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.
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
Çıktısı, şekildeki gibi olacaktı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.
Aşağıdaki ifade bu yapı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.
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'
Teşekkürler

Stored procedure

  • 1.
  • 2.
    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.
  • 9.
    [EXECUTE] [@ dönen_durum=] {procedure_adı[;sayı]} [[parametre)]{değer|@değişken[OUTPUTJ|[DEFAULT]] [WITH RECOMPLIE] insertinto tablo_adı exec storedprocedure_adı Kullanım sekli: INSERT ifadesinin kullanım şekli;
  • 10.
    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.
  • 16.
    •Çalıştırdığımızda yeni kayıtlar"merkez" tablosu içine aşağıdaki şekilde eklenecektir.
  • 17.
    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.
  • 23.
    INPUT PARAMETRE: Input türüparametreler kullanarak; SQL Server içine bilgilerin geçişini sağlarız. CREATE PROC ifadesi ile kullanılan bu yazılım, bir veya daha fazla olabilir. Kullanım biçimi: ©parametre adı veritipi[=default] Dikkat edilecek noktalar; •Tüm giriş türlü parametreler, stored procedure başında uygun olup- olmadığı kontrol edilir. •Eğer input parametre tanımlarken bir default değer verilmiş ise, o zaman özel bir değer atamaya gerek yoktur. Parametreler mutlaka bir değer içermeli veya NULL tanımlaması yapılmalıdır. Bunun dışındaki durumlarda hata oluşur.
  • 24.
    •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.
  • 25.
    [EXECUTE] procedure_adı [@parametre_adı=atanacak_değer[OUTPUT ][DEFAULT [WITH RECOMPLIE] Oluşturulanparametreli stored procedure'lerin çalıştırılması için; EXECUTE stored procedure_adı ifadesinden sonra @parametre_adı=verilecek_değer ifadesi yazılarak, parametrelere değer atanır. Kullanım biçimi;
  • 26.
    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.
  • 28.
    3) Çalıştırıldığı zamançıktısı, aşağıdaki gibi olacaktır.
  • 29.
    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'
  • 38.