HAFTA 6 T-SQL ile Programlar Yazmak" Yaşar GÖZÜDELİ ygozudeli@verivizyon.com http://blog.verivizyon.com/ygozudeli «BM364» Veritabanı Uygulamaları
Konu Akışı Programlama dili olarak T-SQL Fonksiyonlar Programlamak Prosedürler Programlamak 2
Programlama Dili Olarak T-SQL Değişkenler Değişkenler ve Sorgular İç İçe Döngü ve Karar Yapıları Hata Fırlatma ve Hata Yakalama Cursor ve Tablo Tipi Değişkenler 3
Değişkenler Programlama Dillerindeki Değişkenler DECLARE @degisken_adi veritipi[(boyut)] DECLARE @enpahaliurun VARCHAR(200); DECLARE @enpahaliurun VARCHAR(200) = ABC ; DECLARE @enpahaliurun VARCHAR(80), @urunkod INT, @enyuksekfiyat MONEY; Değer Atamak: SET veya SELECT SET @degiskenadi = deger, @degisken2=deger2 4
Değişkenler ve Sorgular SELECT @degiskenadi=degerifadesi,sutun_isimleri Normal SELECT ifadesinin devamı... DECLARE @enyuksekfiyat MONEY; SELECT @enyuksekfiyat=max(listefiyat) FROM tblurun; SELECT @enyuksekfiyat; DECLARE @enyuksekfiyat MONEY; SELECT @enyuksekfiyat= 23799.0328; İşaret Karşılığı += Kendisi ile Toplayarak Atamak -= Kendisinden çıkartıp atamak *= Kendisi ile çarpıp atamak /= Kendisini bölüp atamak %= Kendisinin modunu alıp atamak DECLARE @sayac INT=0; SET @sayac +=7; SELECT @sayac as arti7; SET @sayac -=2; SELECT @sayac as eksi2; SET @sayac *=10; SELECT @sayac as carpi10; SET @sayac /=5; SELECT @sayac as bolu5; SET @sayac %=8; SELECT @sayac as mod8; 5
Değişkenler ve Sorgular-2 ~ Değil ^ Bit seviye XOR & Bit seviye AND DECLARE @dogrumu BIT SET @dogrumu =1 SELECT ~@dogrumu Bit seviye OR 6
Batch Kavramı : Batch sonu USE dukkan -- Bir T-SQL sorgu yığını bitti ve yenisi başladı. (hata yok) DECLARE @degisken VARCHAR(50) SELECT @degisken = 'Merhaba Dünya.' PRINT @degisken -- (Hata yapıldı! Çünkü değişken bir önceki yığında tanımlanmıştı. Artık geçersiz) --açıklama buraya yazılamamalıdır!!! sp_who --Yeni yığın başladı ve hemen SP çağrıldı. (hata yok) SELECT @@VERSION --Ardından başka bir sorgu..(hata yok) sp_who --(hata var!) doğrusu, EXEC sp_who olacaktı. 7
Tablo Tipi Değişken 8
Karar Yapıları IF WHILE CE(X) TRY-CATCH DECLARE @enyuksekfiyat Money SELECT @enyuksekfiyat=max(listefiyat) FROM tblurun if (@enyuksekfiyat>20000) BEGIN --20.0000'den pahalı ürün varsa print 'Bu ürünlerden bazıları çok pahalı' END else if(@enyuksekfiyat>2000) BEGIN --2.000-20.000 arası ise: print 'Bu ürünler çok da pahalı değil' END else BEGIN END -- 200'dan da az ise: print 'Bu ürünler ucuz ürün kategorisinde' IF(şartlar1) BEGIN kodlar... END ELSE IF(şartlar2) BEGIN... END ELSE BEGIN... END DECLARE @sayac INT SELECT @sayac = 1 WHILE (@sayac < 15) BEGIN SELECT @sayac = @sayac + 1 IF (@sayac=11) CONTINUE PRINT 'sayac=' PRINT @sayac END 9
Konu Akışı Programlama dili olarak T-SQL Prosedürler Programlamak Fonksiyonlar Programlamak 10
Stored Procedure ler Programlamak En Basit Stored Procedure Dışarıdan Parametreler Dışarıya Parametreler SP Ayarlarını Yapmak 11
SP Oluşturmak-Değiştirmek CREATE PROC[EDURE] prosedur_adi [WITH seçenekler] CREATE PROC SP$bugunkiSiparisler SELECT K.isim + ' ' + K.Soyad, K.email, S.* FROM tblsiparis S JOIN tblkullanici K ON K.kullaniciKod=S.KullaniciKod WHERE siparistarih < GETDATE()-1 AND siparistarih > GETDATE()+1 EXEC SP$bugunkiSiparisler ALTER PROC[EDURE] prosedur_adi [WITH seçenekler] T-SQL ifadeleri... ALTER PROC SP$GunlukSatis WITH ENCRYPTION SET NOCOUNT ON SELECT COUNT(*) FROM tblsiparisdetay SD JOIN tblsiparis S ON SD.faturaKOD = S.faturaKOD WHERE S.siparisTarih > GETDATE()-1 AND S.siparisTarih < GETDATE()+ 1 SET NOCOUNT OFF 12
Parametrik SP ler INPUT RETURN CREATE PROC SP$UrunListele ( @marka VARCHAR(50) = NULL ) IF (@marka IS NULL) RETURN. Prosedür veya Fonksiyondan çıkmak için Tek başına return de denilebilir. Devam eden yerler işletilmeden çıkılır Parametre geçerliliğini denetlerken kullanılır Bir durum kodu döndürmek için Sadece ve sadece int tipten bir tek değer döndürebilir. Genellikle kaç kaydın etkilendiğini döndürmede kullanılır CREATE PROC <proc_ismi>( @girdiparametre1 tipi [, @girdiparametre2] ) <SECENEKLER> CREATE PROC SP$sepetim(. Sorgu. {sabit değeri parametre @kullanicikod ile değiştir} INT ) SET NOCOUNT ON SELECT S.UrunKod,U.UrunAd,S.Adet FROM tblsepet S INNER JOIN tblurun U ON U.UrunKod=S.UrunKod WHERE S.KullaniciKod=@KullaniciKod SET NOCOUNT OFF Sp$sepetim @kullanicikod=2 EXEC sp$sepetin 2 13
SP lerde Parametrelerle Çalışmak CREATE PROC Merhaba( @DogumTarih DateTime, ) @AdSoyad Varchar(50) = Sarı Çizmeli Mehmet Ağa, @Mesaj VARCHAR(50) = Merhaba OUTPUT Input parameter, Default Değer SELECT @Mesaj = CT(GETDATE()-@DogumTarih var bu parametre VARCHAR) isteğe + bağlı Yaşındasınız RETURN GETDATE()-@DogumTarih --Nasıl Çalıştırılır?EXEC veya dan sonra SP DECLARE @msg VARCHAR(50),@Yas INT EXEC @Yas=Merhaba, @DogumTarih= 01.01.1974, @AdSoyad= Can CERRAH, @mesaj=@msg OUTPUT --Sonuçları Görmek için: SELECT @msg,@yas Input Parameter Bir tek Integer değer döndürebilir.
M.S. ile OUTPUT parametreleri Test Etmek Örnek SP(Pratikte böyle bir SP kullanılmaz!) CREATE PROC ortalayici( @sayi1 smallint, @sayi2 smallint, @sayi3 smallint, @ortalama decimal OUTPUT) SELECT @ortalama = (@sayi1 + @sayi2 + @sayi3) / 3 Önce Değişken Tanımlanır: DECLARE @sonuc smallint Sonra SP Çağrılır EXEC ortalayici 1,2,12,@sonuc OUTPUT Veya EXEC ortalayici @sayi1=1, @sayi2=2, @sayi3=12, @ortalama=@sonuc Sonra değişkenler SELECT edilir SELECT 'ORTALAMA',@sonuc
Konu Akışı Programlama dili olarak T-SQL Prosedürler Programlamak Fonksiyonlar Programlamak 16
Fonksiyonlar Programlamak Skaler Fonksiyonlar Çoklu İfade ile Tablo Döndüren Fonksiyonlar Satırdan Tablo Döndüren Fonksiyonlar 17
Skaler Fonksiyonlar Kodlamak CREATE FUNCTION dbo.sepetteki_urun_sayisi( @kullanicikod INT = NULL ) SELECT kullaniciad, isim, soyad RETURNS int FROM tblkullanici WITH ENCRYPTION WHERE dbo.sepetteki_urun_sayisi(kullanicikod) > 5 BEGIN DECLARE @urunsayisi INT SELECT @urunsayisi=sum(adet) FROM tblsepet WHERE kullanicikod=@kullanicikod RETURN @urunsayisi END CREATE FUNCTION fn$siparistoplamibul( @faturakod INT ) RETURNS MONEY BEGIN DECLARE @Toplam MONEY SELECT @Toplam= SUM(fiyat*adet) FROM tblsiparisdetay WHERE FaturaKod=@faturaKod RETURN @Toplam END SELECT *, dbo.fn$siparistoplamibul(faturakod) as Toplam FROM tblsiparis 18
Satırdan Tablo Döndüren Fonksiyonlar CREATE FUNCTION FN_AlanlarinKodu(@urunKod INT) RETURNS TABLE RETURN SELECT kullanicikod FROM tblsiparisdetay SD INNER JOIN tblsiparis S ON S.faturaKod=SD.FaturaKod WHERE urunkod=@urunkod CREATE FUNCTION FN_BunuAlanBunlariAldi(@urunKod INT) RETURNS TABLE SELECT * RETURN FROM FN_BunuAlanBunlariAldi(2627) SELECT U.urunKod,U.urunAd FROM tblurun U JOIN tblsiparisdetay SD ON SD.urunKod=U.UrunKod JOIN tblsiparis S ON S.faturaKod=SD.FaturaKod JOIN FN_AlanlarinKodu(@urunKod) FNA ON FNA.KullaniciKod=S.kullaniciKod 19
Çoklu İfade ile Sonuç Döndüren Fonksiyonlar CREATE FUNCTION FN_SEVDIGIM_URUNLER(@KullaniciKod INT) RETURNS @FN_SEPETIM TABLE( urunkod INT,urunAd VARCHAR(250), Adet INT ) BEGIN INSERT @FN_SEPETIM SELECT SD.UrunKod,U.UrunAd,SD.Adet FROM tblsiparisdetay SD INNER JOIN tblurun U ON U.UrunKod=SD.UrunKod INNER JOIN tblsiparis S ON S.FaturaKod=SD.FaturaKod WHERE S.KullaniciKod=@KullaniciKod INSERT @FN_SEPETIM SELECT S.UrunKod,U.UrunAd,S.Adet FROM tblsepet S INNER JOIN tblurun U ON U.UrunKod=S.UrunKod WHERE S.KullaniciKod=@KullaniciKod RETURN END SELECT * FROM FN_SEVDIGIM_URUNLER(2) 20
Ödev Dukkan veritabanındaki(tblurun,tblmarka,tbldoviz tabloları) için Kayıt ekleme, silme ve update etme prosedürlerinin parametre imzalarını oluşturun tblurun tablosu üstünde ürün adı ve ürün marka kodundan arama yapacak bir stored Procedure nasıl kodlarsınız? Ürünleri sepete ekleyecek bir stored procedure kodlayınız. 21
Sonuç Verilere erişim programlanabilir! Prosedürler doğrudan pipeline a çıktı verir. Fonksiyonlar context içerisinde çalışır ve sorgularda çalışabilir. 22