<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tunahan.net &#187; Prosedür</title>
	<atom:link href="http://www.tunahan.net/tag/prosedur/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tunahan.net</link>
	<description>Tunahan H. MADEN Personal Page</description>
	<lastBuildDate>Thu, 01 Jul 2010 23:48:59 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SQL &#8211; Stored Prosedür Oluşturmak</title>
		<link>http://www.tunahan.net/2010/01/29/sql-stored-prosedur-olusturmak/</link>
		<comments>http://www.tunahan.net/2010/01/29/sql-stored-prosedur-olusturmak/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 17:25:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[EXEC]]></category>
		<category><![CDATA[ISBN]]></category>
		<category><![CDATA[Kod]]></category>
		<category><![CDATA[Oluşturmak]]></category>
		<category><![CDATA[Procedure]]></category>
		<category><![CDATA[Prosedür]]></category>
		<category><![CDATA[Source]]></category>
		<category><![CDATA[Stored]]></category>

		<guid isPermaLink="false">http://www.tunahan.net/?p=136</guid>
		<description><![CDATA[Prosedür ne demektir?
Nesneye dayalı programlama bu kadar popüler değilken, programlar sadece prosedür denilen parçacıklardan oluşurdu. Her bir prosedür, belli bir işlevi yerine getimrke için özenle yapılandırılmış program parçacığıdır. Mesela, iki sayı alıp bunların toplamlarını hesaplayan bir kod parçasını toplayıcı adında bir prosedür içerisine paketleyebiliriz. Bir prosedür, başka bir prosedür içerisinden çağrılabilir. Bu da sık kullanılan [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Prosedür ne demektir?</p>
<p></strong>Nesneye dayalı programlama bu kadar popüler değilken, programlar sadece prosedür denilen parçacıklardan oluşurdu. Her bir prosedür, belli bir işlevi yerine getimrke için özenle yapılandırılmış program parçacığıdır. Mesela, iki sayı alıp bunların toplamlarını hesaplayan bir kod parçasını toplayıcı adında bir prosedür içerisine paketleyebiliriz. Bir prosedür, başka bir prosedür içerisinden çağrılabilir. Bu da sık kullanılan işlemler için yazılmış kodların bir defa yazılıp çok defa kullanılmasını böylelikle de programlamayı kolyalaştırmayı amaçlar.</p>
<p>Saklı prosedürler, bir çok gelişmiş programlama dilindeki fonksiyon yapılarına karşılık gelir. Birden fazla işlemi, paketlenmiş bir halde bir tek komut ile çalıştırmamız gerektiğinde stored procedures kullanılır. İşlemden kasıt T-SQL ile yapılabilen her şeydir.</p>
<p>Stored procedure, 1980’li yılların sonunda Sybase SQLServer ile birlikte kullanıma girdi. En büyük özelliği sorguların önceden hazırlanması(derlenemesi) ve VTYS ile aynı uzayda çalışmasından dolayı daha hızlı sonuç vermesidir.</p>
<p>Bir SP oluşturulduktan sonra, veritabanı sunucusunda saklanır. Her ihtiyaç duyulduğunda aynı sp defalarca çağrılabilir. Cursor gibi oturum kapandığında silinmez.</p>
<p>Network bazlı çalışmalarda ağ trafiği ve sistem kaynaklarının kullanımın düzenleyerek de performans artışı sağlar. Bir dize işlem, bir tek paket içerisinde yer alır. Gerektiğinde bir tek komut ile tetiklenebilir. Paketin tamamı çalışıncaya kadar istemde bulunan terminale hiçbir şey gönderilmez. Tüm komutlar bittiğinde bir tek sonuç gönderilir. Bu da bazı durumlarda ağ trafiğini rahatlatır.<br />
Bir SP sistem tarafından oluşturulduğu anda şu aşamalara tabi tutulur:</p>
<p><strong>1.</strong> SP’nin bileşenleri parçalara ayrıştırılır<br />
<strong>2.</strong> Veritabanı içerisinde table,view gibi başka nesnelere atıfta bulunan referanslar varsa, geçerli olup olmadıkları kontrol edilir.(Geçerli:1-nesne varmı, 2-izin var mı)<br />
<strong>3.</strong> Kontrollerden geçen SP’nin adı sysobjects tablosuna, kodları ise syscomments tablosuna saklanır.<br />
<strong>4.</strong> Bu işlemlerle birlikte derleme işlemi yapılır. Normalizasyon işlemleri olarak da anılan bu işlemler sonucunda, ağaç şeması elde edilir. Bu şema da sysprocedures tablosunda saklanır.<br />
<strong>5.</strong> SP herhangi bir anda çağrıldığında, ilk kez çalışıyorsa bu işlemler gerçekleştirilir. İlk sefa çağrılmıyorsa, kontrol, sorgulama ağacı oluşturma işlemleri yapılmaz ve oldukça hızlı bir şekilde SP’nin derlenmiş hali çalışır. Bundan dolayı sp’ler derlenen nesnelerden biri olarak anılır.</p>
<p><strong>SP’ler şu faydaları sağlar:</strong></p>
<p><strong>1.</strong> Uygulamanın getirdiği bazı iş kuralları prosedür içinde tanımlanabilir. Bir kez oluştuktan sonra bu kurallar birden çok uygulama tarafından kullanılarak daha tutarlı bir veri yönetimi sağlanır. Ayrıca bir fonksiyonelliğin değişmesi ihtiyacı doğduğunda her uygulama için değişiklik yapmak yerine, sadece bir platformda değişiklik yapılır.</p>
<p><strong>2.</strong> Tüm prosedürler üstün performansla çalışır ancak birden fazla çalıştırılacak olan prosedürler sorgulama planları procedure cache içinde saklandığından daha da hızlı çalışırlar.<br />
<strong>3.</strong> Stored Procedure’ ler SQL Server start ettikten sonra otomatik olarak çalıştırılmak üzere ayarlanabilirler.<br />
4. Stored Procedure’ ler harici olarak kullanılırlar. Trigger’ lardan farklı olarak prosedürler uygulama tarafından ya da script tarafından bir şekilde çağrılmak zorundadırlar. Otomatik devreye giremezler.<br />
<strong>5.</strong> Stored Procedure’ lerın içinde SQL sorgulama diline ek olarak T-SQL komutlarını kullanabiliriz.<br />
<strong>6.</strong>Kullanıcının bir tabloya erişim izni olmasa bile o tablo üzerinde işlem yapan bir stored procedure’ ü kullanma izni olabilir.</p>
<p><strong>SP oluşturma:</strong></p>
<p><span style="background-color: #ffffff;">CREATE PROC [ EDURE ] procedure_name [ ; number ]<br />
[ { @parameter data_type }<br />
[ VARYING ] [ = default ] [ OUTPUT ]  ]<br />
[ ,...n ]</span><br />
<strong>Örnek:<br />
</strong>Çalıştırıldığı tarih itibariyle, aldığı kitapları getirmeyen üyelerin adını veren bir SP yazalım:</p>
<p>CREATE  PROCEDURE sp_cezaliUye<br />
AS<br />
&#8211; Bugünün tarihini al<br />
DECLARE @buGun DATETIME<br />
SET  @buGun = GetDate()</p>
<p>SELECT uyeAdi FROM odunc<br />
WHERE geldiMi=0 AND VermeTarihi + VermeSuresi &lt; @buGun<br />
&#8211; bugünden önce gelmesi gereken ödünç işlemlerindeki üye adını seç.</p>
<p><strong>Daha sonra bu SP şu komut ile çağrılır:</strong></p>
<p><strong>EXEC sp_cezaliUye</strong><br />
&#8211; sp_cezaliUye stored procedure&#8217;ünü çalıştır.</p>
<p>SP üstünde değişiklik yapmak istediğimizde ise,</p>
<p><strong>Sp_helptext sp_adi</strong></p>
<p>Diyerek SP’nin içeriğini görebiliriz.<br />
Daha sonra bu içeriği Query Analyzer kod penceresine yapıştırıp,</p>
<p>ALTER PROCEDURE sp_cezaliUye<br />
AS</p>
<p>DECLARE @buGun DATETIME<br />
SET  @buGun = GetDate()</p>
<p>SELECT uyeAdi FROM odunc<br />
WHERE geldiMi=0 AND VermeTarihi + VermeSuresi &lt; @buGun</p>
<p>Diyerek yeni halini kaydettirebiliriz.</p>
<p><strong>İPUCU:</strong><br />
Bir çok işlemi kod yazmaksızın yapmayı sağlayan Enterprise Manager’i kullanarak sp’leri de kolayca değiştirebilirisiniz. Bunun için Enterprise manager ile bir sp’yi seçip çift tıklamak yeterlidir.</p>
<p><strong>SP’ye parametre yollama:<br />
</strong>Bazen SP’ler dışarıdan parametre alabilirler:</p>
<p><strong>Örnek:</strong><br />
Herhangi bir tarih verildiğinde, bu tarihte süresi bittiği halde teslim edilmeyen kitapları bulan bir SP yazalım ancak tarih olarak bu günden daha büyük bir parametre alamasın. Böyle bir durum olduğunda, bu günün tarihini versin.</p>
<p>CREATE  PROCEDURE <a style="color: #000000; font-family: Arial; text-decoration: none;" href="mailto:sp_cezaliUye_1@referansTarih">sp_cezaliUye_1@referansTarih</a> DATETIMEASDECLARE @buGun DATETIME SET @buGun = GetDate()IF @referansTarih &gt; @buGun SET @referansTarih = @buGun &#8212; şayet, bugünün tarihi referans tarihten küçük ise,<br />
referans tarihi bugünün tarihi ile değiştir.<br />
SELECT uyeAdi FROM odunc<br />
WHERE geldiMi=0 AND VermeTarihi + VermeSuresi &lt; @referansTarih<br />
&#8211; bugün veya daha eski bir tarihte, gelmemiş kitapları alan üyelerin listesini veren sorgu</p>
<p>Bazen dışarıdan gelen parametrelerin isteğe bağlı olması istenebilir.<br />
Bu durumda DEFAULT değer atama seçeneği kullanılır. Şayet dışarıdan parametreye değer atanmazsa, geçerli değer default atanmış değer olarak alınır ve işlem yapılır:</p>
<p><strong>Örnek:</strong><br />
CREATE  PROCEDURE sp_cezaliUye_2<br />
@referansTarih DATETIME = NULL<br />
&#8211; dışarıdan referans tarihi gelmedi ise, NULL olarak kabul et.<br />
AS</p>
<p>DECLARE @buGun DATETIME<br />
SET  @buGun = GetDate()</p>
<p>IF (@referansTarih IS NULL) OR (@referansTarih&gt;@buGun)<br />
SET @referansTarih = @buGun<br />
&#8211; Referans tarih gelmedi ise veya bugünün tarihinden büyük ise, bugünün tarihini al.</p>
<p>SELECT uyeAdi FROM odunc<br />
WHERE geldiMi=0 AND VermeTarihi + VermeSuresi &lt; @referansTarih<br />
Go</p>
<p>şeklinde yazabiliriz. Daha sonra</p>
<p>EXEC sp_cezaliUye_2 @referansTarih=’01.01.2003’</p>
<p><strong>İle veya</strong></p>
<p>EXEC sp_cezaliUye_2<br />
Diyerek sp’yi çağırabiliriz.</p>
<p><strong>DİKKAT:</strong><br />
SP’de bir parametre için default değer tanımı yaparken, bu değerin sabit bir değer veya NULL olması gerektiğine dikkat etmelidir.</p>
<p><strong>İPUCU:</strong><br />
Bazı durumlarda, SP içerisinde SQL ifadesini bir değişkene atamak suretiyle durumlara göre dinamik olarak meydana getirip, daha sonra da onu çalıştırabiliriz. Bu durumda da EXEC fonksiyonu kullanılır. EXEC fonksiyonu, bir stored procedure batch&#8217;in ilk ifadesi değil ise de stored procedure çalıştırılırken kullanılmak zorundadır.</p>
<p><strong>Örnek:</strong></p>
<p>&#8212; Yanlış ifade(çalışmaz):<br />
DECLARE @isim VARCHAR(10)<br />
&#8230;<br />
sp_cezaliUye_2</p>
<p>&#8211; Doğru ifade(çalışır)<br />
DECLARE @isim VARCHAR(10)<br />
&#8230;.<br />
EXEC sp_cezaliUye_2</p>
<p><strong>Örnek:</strong><br />
Kitaplar tablosu üstünde aşağıdaki parametrelere göre arama yapabilecek bir SP yazalım. Parametrelerden gelenler için filtreleme yapılsın.<br />
Dışarıdan alınabilecek Parametreler: ISBNNo, KitapAdi, Yazari, Ozeti</p>
<p>CREATE  PROCEDURE sp_kitapBul<br />
@ISBNNo CHAR(16) =NULL,<br />
@KitapAdi VARCHAR(55)=NULL,<br />
@kitapYazari VARCHAR(55)=NULL,<br />
@KitapOzeti VARCHAR(55)=NULL<br />
AS</p>
<p>DECLARE @sSQL VARCHAR(500)<br />
&#8211; Bir SQL değişkeni tanımlıyoruz<br />
Set @sSQL= &#8216;SELECT * FROM Kitap WHERE 1=1 &#8216;<br />
IF @ISBNNo IS NOT NULL<br />
SET @sSQL = @sSQL + &#8216;  AND ISBNNo = &#8221;&#8217; + @ISBNNo + &#8221;&#8221;<br />
&#8211; ISBNNo parametresi null değilse sorguya ekliyoruz.</p>
<p>IF @KitapAdi IS NOT NULL<br />
SET @sSQL <a style="color: #000000; font-family: Arial; text-decoration: none;" href="mailto:=@sSQL">=@sSQL</a> + &#8216; AND KitapAdi  LIKE  &#8221;%&#8217;  + @KitapAdi +  &#8216;%&#8221;&#8217;<br />
&#8211; KitapAdi parametresi NULL değil ise sorguya ekliyoruz.</p>
<p>IF @KitapYazari IS NOT NULL<br />
SET @sSQL = @sSQL + &#8216; AND KitapYazari  LIKE  &#8221;%&#8217;  + @KitapYazari +  &#8216;%&#8221;&#8217;<br />
&#8212;KitapYazari Null değil ise sorguya ekliyoruz.</p>
<p>IF @KitapOzeti   IS NOT NULL<br />
SET @sSQL = @sSQL + &#8216;  AND KitapOzeti  LIKE  &#8221;%&#8217;  + @KitapOzeti +  &#8216;%&#8221;&#8217;<br />
&#8211; kitapOzeti null değil ise sorguya ekliyoruz.<br />
print @sSQL &#8211;nasıl bir SQL oluşturduğumuzu yazdırıyoruz.</p>
<p>EXEC(@sSQL)<br />
&#8211; bir VARCHAR değişkenin içerdiği T-SQL ifadesini çalıştırıyoruz.</p>
<p>Farklı parametre değerleri ile SP’yi çağırabiliriz:</p>
<p>&#8211; sadece ISBN vererek çağıralım<br />
EXEC Sp_kitapBul @ISBNNo=’12345’<br />
&#8211; ISBN ve KitapAdi parametreleri ile çağırma<br />
EXEC Sp_kitapBul @ISBNNo=’12345’, @kitapAdi=’Yol’</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tunahan.net/2010/01/29/sql-stored-prosedur-olusturmak/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
