38
STORED PROCEDURE

Stored procedure

Embed Size (px)

Citation preview

Page 1: Stored procedure

STORED PROCEDURE

Page 2: 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.

Page 3: Stored procedure

•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.

Page 4: Stored procedure

•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

Page 5: Stored procedure

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.

Page 6: Stored procedure

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 DEFAULTCREATE PROCEDURECREATE RULECREATE TRIGGERCREATE VIEW

Page 7: Stored procedure

* 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.sysadmindb_ownerdb_ddladminVeya 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;

Page 8: Stored procedure

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.

Page 9: Stored procedure

[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;

Page 10: Stored procedure

UYGULAMA

USE usergocreate proc yenisatisekleasinsert 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.

Page 11: Stored procedure

•İ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.

Page 12: Stored procedure

•Ş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.

Page 13: Stored procedure

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

Page 14: Stored procedure

Use userİnsert into merkezExec 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.

Page 15: Stored procedure

•İşlem başarı ile tamamlandıktan sonra merkez tablosunu açarak, kayıtları kontrol edelim.

use cuneyt;gocreate proc fantastik as select musterino,upper(SUBSTRING(mad,1,2)),null,nullfrom 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.

Page 16: Stored procedure

•Çalıştırdığımızda yeni kayıtlar "merkez" tablosu içine aşağıdaki şekilde eklenecektir.

Page 17: Stored procedure

create proc fb.fantastik asselect musterino,upper(SUBSTRING(mad,1,2)),null,nullfrom musterigo

•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.

Page 18: Stored procedure

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.

Page 19: Stored procedure

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.

Page 20: Stored procedure

alter proc fantastik as select CONVERT(char(3),musterino)musterino,UPPER(substring(mad,1,2)),null,null from musterigo

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.

Page 21: Stored procedure

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.

Page 22: Stored procedure

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.

Page 23: Stored procedure

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.

Page 24: Stored procedure

•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.

Page 25: Stored procedure

[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;

Page 26: Stored procedure

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.

Page 27: Stored procedure

create proc carp@a int,@b int,@sonuc int output*asset @sonuc=@a*@bgo

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 intexecute 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.

Page 28: Stored procedure

3) Çalıştırıldığı zaman çıktısı, aşağıdaki gibi olacaktır.

Page 29: Stored procedure

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.

Page 30: Stored procedure

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.

Page 31: Stored procedure

use cuneytgocreate proc yeniden@a nvarchar(10)with recompileasselect COUNT(*) from satiwhere filmad=@ago

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.

Page 32: Stored procedure

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.

Page 33: Stored procedure

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.

Page 34: Stored procedure

UYGULAMA:

1) Aşağıdaki örnek, sistem fonksiyonu olan @@rowcount ile satır sayısını döndürmektedir.

use cuneytgocreate proc kactane@f char(10)asselect * from satiwhere filmad=@freturn (@@rowcount)Go

2) Çalıştırmak için, aşağıdaki kodu yazmak yeterlidir.

declare @x intexec @x=kactane@f='superman'print @x

Page 35: Stored procedure

Çı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.

Page 36: Stored procedure

Aşağıdaki ifade bu yapıya ait bir örnektir.use masterexec 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.

Page 37: Stored procedure

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'

Page 38: Stored procedure

Teşekkürler