Kodbank İndir

! CODEBANK 2012 !

İNDİRMEK&DETAYLI BİLGİ ALMAK İÇİN BURAYI TIKLAYINIZ.

ÖNEMLİ AÇIKLAMA: MUTLAKA OKUYUNUZ!

Gönderen Konu: Stored Procedure Oluşturma  (Okunma sayısı 5114 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı Fatih

  • Emekli Yönetici
  • *****
  • İleti: 2.217
  • Rep: +43/-10
  • Cinsiyet: Bay
    • Delphi Dünyası
Stored Procedure Oluşturma
« : 10 Ekim 2005 15:46:42 »
Stored Procedure Oluşturma

 
Kod: SQL
  1. SET TERM ^ ;
  2.  
  3.  
  4. CREATE PROCEDURE SP_BASIT (AD VARCHAR(15) CHARACTER SET WIN1254)
  5. RETURNS (EN_BUYUK_SIRA_NO INTEGER)
  6. AS
  7. BEGIN
  8. SELECT MAX(SIRA_NO) FROM musteri
  9.  
  10. WHERE ADI=:AD
  11. INTO :EN_BUYUK_SIRA_NO;
  12. suspend;
  13. END ^
  14.  
  15.  
  16.  SET TERM ; ^
  17.  
  18.  
  19.  
  20. GRANT SELECT ON MUSTERI TO PROCEDURE SP_BASIT;
  21.  
  22.  

Yukarıda  en basit şekliyle bir procedure görmekteyiz. adım adım daha komplike Stored Procedure öğreneceğiz.

şimdi Stored Procedureyi tanıyalım

CREATE PROCEDURE > bu kodla prosedürü oluştur komutu veriyoruz. hemen sonrasında prosedüe bir isim vermemiz gerekiyor. ben SP_BASIT Diye bir isim seçtim. siz istediğiniz bir ismi seçebilirsiniz.ö isim tanımlamadan sonra input ( Gitriş ) parametresi olarak adlandırdığımız Alan isimlerini tanımlıyoruz.

 (AD VARCHAR(15) CHARACTER SET WIN1254) Gördüğünüz gibi önce alan ismi Sonra alan tipi ve uzunluğunu tanımladıktan sonra Char ve Varchar tipleri için Türkçe karakter desteğini gösteriyoruz. Tıpkı tablolardaki alan tanımlaması gibi,

peki input (giriş) parametresi nedir. input parametrelerini bir değişken yada alan gibi düşünebilirsiniz. input parametreleri dışardan bilgi alıp Stored Procedurede kullanmanızı sağlar.  örneğin yukarıda Stored Procedure içinde yazdığımız sorgudaki şart İnput parametreinde tanımladığımız Ad parametresine göre sorguyu gerçekleştiriyor.

Kod: SQL
  1. SELECT MAX(SIRA_NO) FROM musteri
  2.  
  3. WHERE ADI=:AD

AD parametresine FAOsoft değerini verdiğinizi düşünürsek Stored Procedureyi çalıştırdığınızda Musteri tablosunda Adı FAOsoft olan kayıtlar arasında musteri tablosundaki Sıra_no alanında en büyük sayıyı tutan kaydın numarasını sonuç  olarak döndürüyor. .

Etkisini görmek için Tools menüsünden SQL Editor açıp şu kodu Select * from SP_BASIT ('FAOsoft') yazın Run buttonuna basın. Gördüğünüz gib tıpkı bir tablo gibi sorguluyoruz. burada gönderdiğimiz parametreyi parantez içine alıyoruz. input parametresinden sonra tanımladığımız RETURNS (EN_BUYUK_SIRA_NO INTEGER)
 Bu bölümede Output ( çıkış ) parametresi diyoruz çıkış parametreleri Stored Procedurede sorgudan çıkan sonucu Gösterir. OUTPUT parametresi tanımlamazsanız Stored Procedure çalışır ama herhangi bir sonuç döndürmez. Sonuç Döndürmesi için mutlaka Output parametresi tanımlayın . Output parametresi tanımlamadan önce mutlaka RETURNS Komutunu kullanmalısınız. Output parametrelerinide tıpkı input parametreleri gibi tanımlayın. input parametrelwerini Where bölümünde kullandığım alanlarla beraber kullanıyorduk. Output parametreleri ise SP ( stored procedurelere kısaca SP  dicem) lerde kullandığımız Sorgu cümlesinde Select ve from arassında seçtiğimiz alanlarla koordineli bir şekilde çalışır.

select max(SIRA_NO) FROM  buradan çıkan sonuç  OUTPUT parametresi tanımladığımız EN_BUYUK_SIRA_NO parametresine atanır. atama işlemi where bölümündeki şarttan  sonra yazdığımız  into komutu ile gerçekleşir  into komutundan sonra Output parametreinnde tanımladığımız  parametreleri önüne ( : ) ekleyerek tanımlayın.

örnek

Kod: SQL
  1. INTO :EN_BUYUK_SIRA_NO;

 

AS > INPUT ve OUTPUT parametreleri ile SP'yi birbirinden ayırt edebillmeyi  kolaylaştırır.

 

suspend; > bu komutu Output parametresi tanımladığınızda End'den önce   kullanmalısınız. Output parametresi tanımlayıp Suspend'i kullanmazsanız  SP çalışacak ancak herhangi bir değer geriye döndürmeyecektir.

 

SP'nin başındaki SET TERM ^ ; ve Stored Procedurenin   sonundaki SET TERM ; ^  tanmlamaları SP'nin aktif  databaseye ait olduğunu gösterir. End'in  sonundaki ^  işareti ise sp nin bittiğini göterir. Buradaki ( ^ ) işareti yerine istediğiniz karakteri kullanabilirsiniz. Varsayyılanı değiştiremenizi tavsiye ederim.  Sayfadayer işgal etmemesi için aşağıdaki örneklerde kullanılmamıştır.

Sorgu Begin ve End Bloğu Arasında olmalıdır. sorgu sonunda ( ; ) kullanılmalıdır.

son olarak GRANT fonksiyonuyla musteri tablosundan seçme hakkını alıyoruz.

seçme hakkını kaldırmak için GRANT yerine REVOKE fonksiyonunu kullanınız. bu komutun kullanımı ilerki konularda anlatılmıştır.

Kod: SQL
  1. GRANT SELECT ON MUSTERI TO PROCEDURE SP_BASIT;
  2.  
  3. REVOKE  SELECT ON MUSTERI TO PROCEDURE SP_BASIT;

select yerine SP'nin yapacağı işlem yada işlemleri  yazmalısınız.

 

1.    all    : Select, delete, insert, update, execute haklarını içerir.    
2.    select    : Bir tablonun tümünü veya bir kısmını görüntüleyebilme.    
3.    delete    : Bir tablodan veya görüntüsünden (view) kayıt silebilme.    
4.    insert    : Bir tabloya veya görüntüsüne kayıt ekleyebilme.    
5.    update     : Bir tablodaki veya gürüntüsündeki kayıtları güncelleyebilme.
6.    execute    : Bir Depolanmış yordamı (Stored Procedure) çalıştırabilme.    
 

Örnek 2

 

Kod: SQL
  1. CREATE PROCEDURE SP_BASIT2 (SIRA INTEGER)
  2. RETURNS (AD VARCHAR(15) CHARACTER SET WIN1254, SOYAD VARCHAR(15) CHARACTER SET WIN1254)
  3. AS
  4. BEGIN
  5. SELECT SIRA_NO, ADI, SOYADI FROM MUSTERI
  6. WHERE musteri.sira_no=:SIRA
  7. INTO :SIRA, :AD, :SOYAD;
  8. suspend;
  9. END


yukarıdaki örnekte 3 Output parametresi tanımladık  1'den fazla parametrede aralarına ( , ) konur. tanımlanan input ve Output parametreleri ve sorguda kullanılan alan adları aynı özelliklere (alan tipi,alan uzunluğu vb.) sahip olmalıdır.

 

Örnek 3

 

Şimdiye kadar yaptığımız SPler Tek kayıt yada tek değer dönderiyordu. SP'den birden çok kayıt alabilmek için sorgumuzu FOR..DO Bloğu içine yazıyoruz.

Birden çok kayıt döndüren SPlerde Delphi içinden IBQUERY veya IBDATASET  gbi bileşenlerinden birini kullanın . IBSTOREDPROC bileşenini kullanırsanız hata alırsınız.

Kod: SQL
  1. CREATE PROCEDURE SP_tumunu_Listele
  2. RETURNS (AD VARCHAR(15) CHARACTER SET WIN1254, SOYAD VARCHAR(15) CHARACTER SET WIN1254)
  3. AS
  4. BEGIN
  5.  
  6. FOR
  7. SELECT SIRA_NO, ADI, SOYADI FROM MUSTERI
  8. INTO :SIRA, :AD, :SOYAD;
  9.  
  10. DO
  11.  
  12. BEGIN
  13. suspend;
  14.  
  15. END
  16.  
  17. END


For...Do kullanıldığında SP'de başka komut varsa başka bir Begin End bloğu arasına alınır.

Örnek 4

Aşağıdaki SP adı FAOsoft Olan tüm kayıtları listeler.

 

Kod: SQL
  1. CREATE PROCEDURE SP_tumunu_Listele2 (ADIM VARCHAR(15) CHARACTER SET WIN1254)
  2. RETURNS (AD VARCHAR(15) CHARACTER SET WIN1254, SOYAD VARCHAR(15) CHARACTER SET WIN1254)
  3. AS
  4. BEGIN
  5.  
  6. FOR
  7. SELECT SIRA_NO, ADI, SOYADI FROM MUSTERI
  8.  
  9. WHERE musteri.ADI,=:ADIM
  10. INTO :SIRA, :AD, :SOYAD;
  11.  
  12. DO
  13. suspend;
  14. END
 


SP İle Kayıt Silme
Aşağıdaki SP de input parametresine verilen numaraya eşit olan kayıtlar silinir.

 
Kod: SQL
  1. CREATE PROCEDURE SP_SIL (SIRA INTEGER)
  2. AS
  3. BEGIN
  4. DELETE FROM musteri WHERE musteri.sira_no=:SIRA;
  5. END
Yukarıda gördüğümüz gibi Output parametresi olmadığı için Suspend komutunu kullanmadık.

SPde silme işlemi ve dolaylı olarak seçme işlemi gerçekleştiği için Grant bölümü aşağıdaki şekilde olmalıdır.

 

Kod: SQL
  1. GRANT SELECT,DELETE ON MUSTERI TO PROCEDURE SP_SIL;


SP İle Kayıt Ekleme

 

Kod: SQL
  1. CREATE PROCEDURE SP_EKLE (SIRA INTEGER, AD VARCHAR(15) CHARACTER SET WIN1254,
  2.  
  3. SOYAD VARCHAR(15) CHARACTER SET WIN1254)
  4. AS
  5. BEGIN
  6. INSERT INTO musteri (SIRA_NO,ADI,SOYADI)
  7. VALUES (:SIRA, :AD, :SOYAD);
  8. END


 Yukarıda kullandığımız gibi bildiğimiz SQL koduyla parametrelerin başına ( : ) işaretini ekleyerek parametrelere gönderilen bilgileri tabloya ekliuyoruz.

 

Grant bölümü aşağıdaki şekilde olmalıdır.

Kod: SQL
  1. GRANT INSERT ON MUSTERI TO PROCEDURE SP_EKLE;


SP İle Kayıt Güncelleme
Kod: SQL
  1.  
  2.  
  3. CREATE PROCEDURE SP_GUNCELLE (
  4. SIRA INTEGER,
  5. AD VARCHAR(15) CHARACTER SET WIN1254,
  6. SOYAD VARCHAR(15) CHARACTER SET WIN1254,
  7. YENI_SIRA INTEGER)
  8. AS
  9. BEGIN
  10. UPDATE musteri
  11. SET SIRA_NO=:YENI_SIRA, ADI=:AD, SOYADI=:SOYAD
  12. WHERE SIRA_NO=:SIRA;
  13. END


Yukarıdaki kodda değiştirilmek istenen kaydın primary key değerini Sıra parametresine verip   diğer parametrelerede yeni değerleri aynı mantıkla SQL Kodlarıyla  atıyoruz.

 

Grant bölümü aşağıdaki şekilde olmalıdır.

Kod: SQL
  1. GRANT SELECT,UPDATE ON MUSTERI TO PROCEDURE SP_GUNCELLE;


SP'de Değişken Kullanma

 

SP'de değişken tanımlama AS Begin sözcükleri arasında yapılır. Değişkenler Declare Variable ile belirtilir. Her değişken tanımından önce Declare Variable tanımı kullanılmalıdır. her değişkenm tanımında nokktalı  virgül bulunmalıdır.

Değişken, input,Output parametrelerinin tipleri ve özellikleri  tablolarda kullandığımız alan tiplerini ve özelliklerini kullanırlar. IB / FB'de End sözcüğünden sonra noktalı virgül kullanılmaz.

/*bu iki işaret arasında yazılanlar açıklamadır. IB / FB bu yazıları dikkate  almaz*/
 

Kod: SQL
  1. CREATE PROCEDURE SP_VAR_ORNEK (SIRA INTEGER)
  2. AS
  3. DECLARE VARIABLE NUMARACONTROL INTEGER;
  4. DECLARE VARIABLE ADCONTROL VARCHAR(15) CHARACTER SET WIN1254;
  5. BEGIN
  6. SELECT SIRA_NO, ADI FROM MUSTERI
  7. WHERE musteri.sira_no=:SIRA
  8. INTO :NUMARACONTROL, :ADCONTROL; /* sorgu soonucu  input ,output  gibi değişkenlere atanıyor*/
  9. IF ((NUMARACONTROL=1) AND (ADCONTROL='FAOsoft')) THEN  /* seçilen kaydın nosu 1 adı FAOsoftsa*/
  10.  
  11. BEGIN
  12. exception silmemezsin;  /* daha önce tanımladığımız mesajı göster*/
  13.  
  14. Exit ; /* SP DEN ÇIKIŞ. kullandığımız  exit komutu burada gereksizdir amaç Öğrenmek*/
  15.  
  16. END
  17. ELSE  /* seçilen kaydın nosu 1 adı FAOsoft değşilse sil*/
  18. DELETE FROM musteri WHERE musteri.sira_no=:SIRA;
  19. suspend;
  20. END


Grant bölümü aşağıdaki şekilde olmalıdır.

Kod: SQL
  1. GRANT SELECT,DELETE ON MUSTERI TO PROCEDURE SP_VAR_ORNEK;


if   then  else  Kullanımı

 

Delphide kullandığımızın benzeridir.

 Elseden önceki komutada Noktalı virgül konur. then veya elsedeki komut birden fazlaysa delpbideki gibi Begin ve End bloğu arasına yazılır. if...then arasındaki  şart parantez  içine alınır. if..then arasında birden fazla şart varsa şartların hepsi bir parantez içine eklenir(kendi parantezleri ile birlikte). yukarıda örneklendirilmiştir.

 

Tablo Kullanmayan SP
 

SPler her zaman tablolardaki işlemleri yapmak için kuıllanmayabiliriz.

Aşağıdaki örnek SP verdiğiniz tarihin haftanın hangi güne denk geldiğini bulacaktır.

 
Kod: SQL
  1.  
  2. CREATE PROCEDURE SP_GUN_BUL (
  3. TARIH DATE)
  4. RETURNS (
  5. GUN_ADI VARCHAR(10))
  6. AS
  7. DECLARE VARIABLE BENIM_TARIH DATE;
  8. DECLARE VARIABLE TARIH_KOPYASI DATE;
  9. DECLARE VARIABLE FARK1 INTEGER;
  10. DECLARE VARIABLE FARK2 INTEGER;
  11. DECLARE VARIABLE GUN_FARKI INTEGER;
  12. DECLARE VARIABLE SONUC INTEGER;
  13. BEGIN
  14. /*DEGİŞKENLERE ATAMA YAP*/
  15. BENIM_TARIH= '15.12.96'; /*HERHANGİ BİR PAZAR GUNU*/
  16. TARIH_KOPYASI= :TARIH;
  17. FARK1 = 1;
  18. FARK2 = 2;
  19. /*HESAPLA*/
  20. WHILE (:FARK1 <> :FARK2) DO
  21. BEGIN
  22. FARK1 = TARIH - BENIM_TARIH;
  23. GUN_FARKI = :FARK1 / 7;
  24. FARK2 = :GUN_FARKI * 7;
  25. IF (:FARK1 <> :FARK2) THEN
  26. TARIH = :TARIH + 1;
  27. END
  28. SONUC = 7-(:TARIH-:TARIH_KOPYASI);
  29. IF (SONUC=1) THEN
  30. GUN_ADI='Pazartesi';
  31. ELSE
  32. IF (SONUC=2) THEN
  33. GUN_ADI='Salı';
  34. ELSE
  35. IF (SONUC=3) THEN
  36. GUN_ADI='Çarşamba';
  37. ELSE
  38. IF (SONUC=4) THEN
  39. GUN_ADI='Perşembe';
  40. ELSE
  41. IF (SONUC=5) THEN
  42. GUN_ADI='Cuma';
  43. ELSE
  44. IF (SONUC=6) THEN
  45. GUN_ADI='Cumartesi';
  46. ELSE
  47. IF (SONUC=7) THEN
  48. GUN_ADI='Pazar';
  49. suspend;
  50. END


Tools> SQL Editörü açıp oraya şu kodu yazarak etkisini görebilirsiniz.

 
Kod: SQL
  1. SELECT * FROM sp_gun_bul ('26.02.2005')


Yukarıda kullandığımız WHILE şart DO Delphide kullandığımızın benzeridir ve verilen şart gerçekleşinceye kadar işler. WHILE şart DO  dan sonra yazılan komut sayısı birden fazlaysa Begin ve End bloğu arasında yazılır.

Değişkenlere = ( eşittir) simgesi ile değer atıyoruz.   = ( eşittir) simgesi ile ayrıca karşılaştırma içinde kullanılır.

 

SP veya Trigger  İçinden Giriş Parametreli Sp Çağırma


EXECUTE PROCEDURE spadı (giriş Patametre1,giriş Patametre2 ) RETURNING_VALUES çıkış Patametre1, çıkış Patametre2

giriş Patametreli bir sp aşağıdaki gibi çağrılır.

Kod: SQL
  1. EXECUTE PROCEDURE SP_Listele  (10,'FAOsoft')
  2.  
  3.  
yukarıda gönderdiğimiz bilgi sabittir.  (10,'FAOsoft') yerine değişken, input,output parametrelerini kullanarak sp yi çağıralım.

 

çağıracağımız sp gösterdiimiz kaydı değiştirip yeni halini listelesin

 

Kod: SQL
  1. CREATE PROCEDURE SP_GUNCELLE (
  2. SIRA INTEGER,
  3. AD VARCHAR(15),
  4. SOYAD VARCHAR(15))
  5. RETURNS (
  6. SIRAM INTEGER,
  7. ADIM VARCHAR(15),
  8. SOYADIM VARCHAR(15))
  9. AS
  10. BEGIN
  11. UPDATE musteri
  12. SET SIRA_NO=:SIRA, ADI=:AD, SOYADI=:SOYAD
  13. WHERE SIRA_NO=:SIRA;
  14.  
  15. SELECT SIRA_NO, ADI, SOYADI FROM MUSTERI
  16. WHERE musteri.sira_no=:SIRA
  17. INTO :SIRAM, :ADIM, :SOYADIM;
  18. suspend;
  19. END


yukarıdaki sp yi çağıracak sp mizde aşağıdaki gibi olsun

 
Kod: SQL
  1. CREATE PROCEDURE SP_CAGIR (
  2. SIRA INTEGER,
  3. AD VARCHAR(15) CHARACTER SET WIN1254,
  4. SOYAD VARCHAR(15) CHARACTER SET WIN1254)
  5. RETURNS (
  6. SIRAM INTEGER,
  7. ADIM VARCHAR(15) CHARACTER SET WIN1254,
  8. SOYADIM VARCHAR(15) CHARACTER SET WIN1254)
  9. AS
  10. BEGIN
  11. EXECUTE PROCEDURE sp_guncelle :SIRA, :AD, :SOYAD returning_values :SIRAM, :ADIM, :SOYADIM;
  12. suspend;
  13. END


Tools> SQL Editörü açıp oraya şu kodu yazarak etkisini görebilirsiniz.

 
Kod: SQL
  1.  
  2. SELECT * FROM SP_CAGIR (2,'fao','soft');
2. sp nin  

Grant bölümü aşağıdaki şekilde olmalıdır.

Kod: SQL
  1. GRANT EXECUTE ON PROCEDURE SP_GUNCELLE TO PROCEDURE SP_CAGIR;

 

CASE...WHEN...THEN...ELSE
Bir değere göre daha fazla alternatifi yerine getirmeyi sağlar.

Kullanım biçimi:

CASE değer

  WHEN değer THEN işlem

  WHEN değer THEN işlem

  ELSE işlem

END

 

AŞAĞIDAKİ ÖRNEK SELECT İÇİNDE ŞARTLI SORGULAMA YAPIYOR.

select ADI, SOYADI, case when YASI > 50 then 'Yaşlı' else 'Genç' end from DEFTER

 

haftanın gununu yazan bir ornek :
Kod: SQL
  1. SELECT CASE EXTRACT(weekday FROM :TARIH)
  2.              WHEN 0 THEN 'PZR'
  3.              WHEN 1 THEN 'PTS'
  4.              WHEN 2 THEN 'SAL'
  5.              WHEN 3 THEN 'ÇRŞ'
  6.              WHEN 4 THEN 'PRŞ'
  7.              WHEN 5 THEN 'CUM'
  8.              WHEN 6 THEN 'CTS'
  9.           END FROM rdb$database


Örnek

WHEN...DO

When .. Do arasına yazdığınız hata kodu gerçekleşirse  Do dan sonra istedğiniz Kodllar yazılarak hata verilmesi engellenir.

WHEN hata1, hata2,hata3 ANY

DO komutlar

 

ANY birden fazla hata kodundan herhangi birinin oluşması durumunda do'dan sonraki komutların çalışmassını sağlar. tek hata belirtilmişse  kullanılmaz. herhangi bir hata  belirtilmeyip sadece any i kullanırsanız herhangi  bir hata oluşursa yazdığınız kod işler.

do'dan sonra komut sayısı birden fazlaysa Begin ve End bloğu arasında yazılır. .

When .. Do arasına  kendi hata şartınızı, exceptionsu, interbasenin ürettiği hataları ve sql kodlarının ürettiği  hataları yakalayabilirsiniz.

When .. Do arasına aşağıdaki gbib yazın

 

  sizin şaartınız

SQLCODE SQLkodnumarası  ............     sql kodlarının ürettiği  hataları

GDSCODE hatakodu             ............... interbasenin ürettiği hatalar

 

Önek

Kod: SQL
  1. CREATE PROCEDURE NUMBERPROC (A INTEGER) RETURNS (B INTEGER) AS
  2.  
  3. BEGIN
  4.  
  5. B = 0;
  6.  
  7. BEGIN
  8.  
  9. UPDATE R SET F1 = F1 + :A;
  10.  
  11. UPDATE R SET F2 = F2 * F2;
  12.  
  13. UPDATE R SET F1 = F1 + :A;
  14.  
  15. WHEN SQLCODE -803 DO
  16.  
  17. B = 1;
  18.  
  19. END
  20.  
  21. EXIT;
  22.  
  23. END!!



Stored Procedure Düzeltme

Tek yapmanız Gereken CREATE PROCEDURE  Yerine ALTER PROCEDURE Yazdıktan sonra  SP ismini yazıp istediğiniz yerleri değiştirmek.

örneğin SP_GUN_BUL SP sinin sonuc değişkeninin tipini smallint yapalım

 

Kod: SQL
  1. ALTER PROCEDURE SP_GUN_BUL (
  2. TARIH DATE)
  3. RETURNS (
  4. GUN_ADI VARCHAR(10))
  5. AS
  6. DECLARE VARIABLE BENIM_TARIH DATE;
  7. DECLARE VARIABLE TARIH_KOPYASI DATE;
  8. DECLARE VARIABLE FARK1 INTEGER;
  9. DECLARE VARIABLE FARK2 INTEGER;
  10. DECLARE VARIABLE GUN_FARKI INTEGER;
  11. DECLARE VARIABLE SONUC SMALLINT;
  12. BEGIN
  13. /*DEGİŞKENLERE ATAMA YAP*/
  14. BENIM_TARIH= '15.12.96'; /*HERHANGİ BİR PAZAR GUNU*/
  15. TARIH_KOPYASI= :TARIH;
  16. FARK1 = 1;
  17. FARK2 = 2;
  18. /*HESAPLA*/
  19. WHILE (:FARK1 <> :FARK2) DO
  20. BEGIN
  21. FARK1 = TARIH - BENIM_TARIH;
  22. GUN_FARKI = :FARK1 / 7;
  23. FARK2 = :GUN_FARKI * 7;
  24. IF (:FARK1 <> :FARK2) THEN
  25. TARIH = :TARIH + 1;
  26. END
  27. SONUC = 7-(:TARIH-:TARIH_KOPYASI);
  28. IF (SONUC=1) THEN
  29. GUN_ADI='Pazartesi';
  30. ELSE
  31. IF (SONUC=2) THEN
  32. GUN_ADI='Salı';
  33. ELSE
  34. IF (SONUC=3) THEN
  35. GUN_ADI='Çarşamba';
  36. ELSE
  37. IF (SONUC=4) THEN
  38. GUN_ADI='Perşembe';
  39. ELSE
  40. IF (SONUC=5) THEN
  41. GUN_ADI='Cuma';
  42. ELSE
  43. IF (SONUC=6) THEN
  44. GUN_ADI='Cumartesi';
  45. ELSE
  46. IF (SONUC=7) THEN
  47. GUN_ADI='Pazar';
  48. suspend;
  49. END


 

bu şekilde içindeki kodlarıda değiiştirebilirsiniz.

Stored Procedure Silme

DROP PROCEDURE ADI;

 

Örnek

 
Kod: SQL
  1. DROP PROCEDURE SP_GUN_BUL;


SP kullanımdaysa veya başka bir SP yada Trigger  tarafından kullanılıyorsa silinmeyeceektir

 

Not : Grant vb. ni IB Expertle kolayca halledebilirsiniz. amaç mantığını bilmeniz. SP ve, Viewler tablolar gibi seçilebildiğinden aynı isme sahip olamaazlar. Bir sp ile tablo silme vb.. yapamazsınız. sp de kullandığımız kodları triggerdada kullanabiliriz.
« Son Düzenleme: 21 Haziran 2009 02:04:23 by Kocaturk »
Malulen emekli programcı / yazar. Bildiklerini unutmakta olduğundan size cevap veremez.

Çevrimdışı Fatih

  • Emekli Yönetici
  • *****
  • İleti: 2.217
  • Rep: +43/-10
  • Cinsiyet: Bay
    • Delphi Dünyası
Herşeyiyle Stored Procedure (Firebird / Interbase)
« Yanıtla #1 : 10 Ekim 2005 15:49:22 »
Yorumlar



Alıntı yapılan: vedatkaba
Örnek 3







Şimdiye kadar yaptığımız SPler Tek kayıt yada tek değer dönderiyordu. SP'den birden çok kayıt alabilmek için sorgumuzu FOR..DO Bloğu içine yazıyoruz.



Birden çok kayıt döndüren SPlerde Delphi içinden IBQUERY veya IBDATASET gbi bileşenlerinden birini kullanın . IBSTOREDPROC bileşenini kullanırsanız hata alırsınız.



Kod: SQL
  1.  
  2.  
  3. CREATE PROCEDURE SP_tumunu_Listele
  4.  
  5. RETURNS &#40;AD VARCHAR&#40;15&#41; CHARACTER SET WIN1254, SOYAD VARCHAR&#40;15&#41; CHARACTER SET WIN1254&#41;
  6.  
  7. AS
  8.  
  9. BEGIN
  10.  
  11.  
  12.  
  13. FOR
  14.  
  15. SELECT SIRA_NO, ADI, SOYADI FROM MUSTERI
  16.  
  17. INTO &#58;SIRA, &#58;AD, &#58;SOYAD;
  18.  
  19.  
  20.  
  21. DO
  22.  
  23.  
  24.  
  25. BEGIN
  26.  
  27. suspend;
  28.  
  29.  
  30.  
  31. END
  32.  
  33.  
  34.  
  35. END
  36.  
  37.  




  hocam yukarıdaki kodda bulunan
Kod: SQL
  1. INTO &#58;SIRA, &#58;AD, &#58;SOYAD;
cumlesinin sonundaki ; varken kod çalışmadı ama kaldırınca promlemsiz çalıştı.anlaşılan o orda fazlalık.bilginize..



  ama güzel bir makale olmuş şehsen teşekkür ederim.başarılar dilerim.






Alıntı yapılan: doganzorlu
Selam,



Çok güzel bir döküman, elinize sağlık. Bir ufak hatırlatma yapmak gereği hissettim;



Alıntı


SP'nin başındaki SET TERM ^ ; ve Stored Procedurenin sonundaki SET TERM ; ^ tanmlamaları SP'nin aktif databaseye ait olduğunu gösterir. End'in sonundaki ^ işareti ise sp nin bittiğini göterir. Buradaki ( ^ ) işareti yerine istediğiniz karakteri kullanabilirsiniz. Varsayyılanı değiştiremenizi tavsiye ederim. Sayfadayer işgal etmemesi için aşağıdaki örneklerde kullanılmamıştır.





Burada ifade edilmeye çalışılan, SET TERM ile komut bitiş karakterini set ediyoruz sanırım. Bu karakter daha çok client ile ilgilidir server bununla ilgilenmez. Client (örn isql), girilmiş olan metni ilk önce SQL cümleleri olarak parçalar. Zira bir defada birden fazla komut girmiş olabilirsiniz. Default olarak bunun için ; karakterini kullanır.



Böyle bir durumda, eğer default SQL ayıracı değiştirilmemişse, FB engine e bilgi aşağıdaki gibi gidecektir;



Kod: SQL
  1. CREATE PROCEDURE SP_GUNCELLE &#40;
  2.  
  3. SIRA INTEGER,
  4.  
  5. AD VARCHAR&#40;15&#41;,
  6.  
  7. SOYAD VARCHAR&#40;15&#41;&#41;
  8.  
  9. RETURNS &#40;
  10.  
  11. SIRAM INTEGER,
  12.  
  13. ADIM VARCHAR&#40;15&#41;,
  14.  
  15. SOYADIM VARCHAR&#40;15&#41;&#41;
  16.  
  17. AS
  18.  
  19. BEGIN
  20.  
  21. UPDATE musteri
  22.  
  23. SET SIRA_NO=&#58;SIRA, ADI=&#58;AD, SOYADI=&#58;SOYAD
  24.  
  25. WHERE SIRA_NO=&#58;SIRA;
  26.  
  27. <<
  28.  
  29. >> ERROR




select SIRA_NO, ADI, SOYADI FROM MUSTERI

where musteri.sira_no=:SIRA

into :SIRAM, :ADIM, :SOYADIM;

<<

>> ERROR



suspend;

<<



Bu durumdan kaçınmak için alternatif bir ayıraç set ederiz, örneğin SET TERM !!. Bu komutla SQL komutlarımızın !! ile ayrıldığını söylüyoruz. (Dikkat, database e değil, SQL cümlemizi alıp ona gönderecek client a söylüyoruz bunu zira parse işlemi orada yapılıyor) Bu durumda;





Kod: SQL
  1. CREATE PROCEDURE SP_GUNCELLE &#40;
  2.  
  3. SIRA INTEGER,
  4.  
  5. AD VARCHAR&#40;15&#41;,
  6.  
  7. SOYAD VARCHAR&#40;15&#41;&#41;
  8.  
  9. RETURNS &#40;
  10.  
  11. SIRAM INTEGER,
  12.  
  13. ADIM VARCHAR&#40;15&#41;,
  14.  
  15. SOYADIM VARCHAR&#40;15&#41;&#41;
  16.  
  17. AS
  18.  
  19. BEGIN
  20.  
  21. UPDATE musteri
  22.  
  23. SET SIRA_NO=&#58;SIRA, ADI=&#58;AD, SOYADI=&#58;SOYAD
  24.  
  25. WHERE SIRA_NO=&#58;SIRA;
  26.  
  27. SELECT SIRA_NO, ADI, SOYADI FROM MUSTERI
  28.  
  29. WHERE musteri.sira_no=&#58;SIRA
  30.  
  31. INTO &#58;SIRAM, &#58;ADIM, &#58;SOYADIM;
  32.  
  33. suspend;
  34.  
  35. .....
  36.  
  37. !!
  38.  
  39. <<
  40.  
  41. >> CREATED
  42.  
  43.  
  44.  
  45. CREATE PROCEDURE SP_KAYDET &#40;
  46.  
  47. .....
  48.  
  49.  
  50.  
  51. !!
  52.  
  53. <<
  54.  
  55. >> CREATED
  56.  
  57.  
  58.  
  59. CREATE PROCEDURE SP_SIL &#40;
  60.  
  61. .....
  62.  
  63. !!
  64.  
  65. <<
  66.  
  67. >> CREATED




Seklindeki bir metni client, 3 ayrı komut olarak algılayacaktır zira !! ifadesini bitiş karakteri olarak set etmiştik. Bu karakter set iken kullanacağınız tüm SQL cümleleri bununla bitmelidir. Misal;



commit!!



gibi. Tabi alışıldık ; a dönmek daha konforlu olacağından en sonunda;



SET TERM ;!!

diyerek ayıracı tekrar ; haline getiririz.



-----



Çalışmalarınızın devamını bekliyoruz, kolay gelsin.
Malulen emekli programcı / yazar. Bildiklerini unutmakta olduğundan size cevap veremez.

Çevrimdışı Fatih

  • Emekli Yönetici
  • *****
  • İleti: 2.217
  • Rep: +43/-10
  • Cinsiyet: Bay
    • Delphi Dünyası
Herşeyiyle Stored Procedur (Firebird / Interbase)
« Yanıtla #2 : 10 Ekim 2005 15:50:48 »
IB Expert'le Stored Procedure Oluşturma
Procedures e sağ tıklayıp New Procedure dediğinizde aşağıdaki gibi bir pencere gelecektir

Malulen emekli programcı / yazar. Bildiklerini unutmakta olduğundan size cevap veremez.

Çevrimdışı erkanmrs

  • Üye
  • ***
  • İleti: 45
  • Rep: +1/-0
Ynt: Stored Procedure Oluşturma
« Yanıtla #3 : 04 Ağustos 2006 12:21:16 »
öncelikle makale çok aydınlatıcı olmuş tşklr. benim sorunum şu İBEXPERT DE  sp oluştururken sürekli parsing hatası veriyo
.
..
...
begin
select * from MUSTERI;
.
..
..
gibi basit birseyde bile. ibexperte sp oluşturmayı biraz daha açıklaya bilirmisiniz tşklr...
Oyun bitince şahta piyonda aynı kutuya konur!

Çevrimdışı Fatih

  • Emekli Yönetici
  • *****
  • İleti: 2.217
  • Rep: +43/-10
  • Cinsiyet: Bay
    • Delphi Dünyası
Ynt: Stored Procedure Oluşturma
« Yanıtla #4 : 04 Ağustos 2006 12:33:48 »
oluşturmaya çalıştığınız SP'yi görebilir miym?
Malulen emekli programcı / yazar. Bildiklerini unutmakta olduğundan size cevap veremez.

Çevrimdışı erkanmrs

  • Üye
  • ***
  • İleti: 45
  • Rep: +1/-0
Ynt: Stored Procedure Oluşturma
« Yanıtla #5 : 07 Ağustos 2006 19:50:35 »
öncelikle ilgilendigin için teşekürler..
ibexperte ,create procedure dedikten sonra
begin  end blogu arasını çok basit bi ifade yazsam bile pasing hatası veriyor.

select * musteritablosu; <yazdıgım sadece bu>

gibi sql server da böyle bişey olmuyo..

ufak bi yazım farkı var herhalde ama ben çözemedim sürekli parsing hatası veriyo...

umarım acıklaya bilmişimdir...
Oyun bitince şahta piyonda aynı kutuya konur!

Çevrimdışı Fatih

  • Emekli Yönetici
  • *****
  • İleti: 2.217
  • Rep: +43/-10
  • Cinsiyet: Bay
    • Delphi Dünyası
Ynt: Stored Procedure Oluşturma
« Yanıtla #6 : 07 Ağustos 2006 21:13:24 »
geriye brden fazzla kayıt dönüyor, into ve for..do kullanmamışsın
makaleyi tekrar oku :P
Malulen emekli programcı / yazar. Bildiklerini unutmakta olduğundan size cevap veremez.

Çevrimdışı nedimtrc

  • Yeni Üye
  • *
  • İleti: 2
  • Rep: +0/-0
Ynt: Stored Procedure Oluşturma
« Yanıtla #7 : 06 Mayıs 2007 15:03:36 »
üstad merhaba açıklamanız çok faydalı şu konular hakkında bir kaç örnek verseniz çok güzel olacak
stored procedure içinde 4 -5 datayla çalışmak bunlar arasında döngü kurup hesaplama yapmak şeklinde inanın çok faydalı olur

Çevrimdışı hercule

  • Yeni Üye
  • *
  • İleti: 1
  • Rep: +0/-0
Ynt: Stored Procedure Oluşturma
« Yanıtla #8 : 05 Kasım 2011 00:30:46 »
selamlar
güzel anlatım için öncelikle teşekkürler.

bir sorum olucak firebird' üzerinde sp yazmaya çalışıyorum fakat
kafama takılan bir şey var.

Verilerin çağırıldığı sql cümlesinde table'ların field larını teker teker yazmak yerine

table.*,table.* gibi çağırmak mümkünmü
table'a daha sonradan eklenen fieldlar olabilir diye düşünüyorum.
bu fieldlar eğer sp içerisinde işlem görmüyorsa (herhangi bir aritmetik işlemi veya kontrol yoksa)
sadece kullanıcıya göstermek için var ise

sonradan eklenen fieldlar sp'yi ve kullanıcı arayüzünü etkilemicektir diye düşünüyorum
return olan veriler grid'e bağlanıp grid'in field'larıda return olan fieldların hepsini göstererek kullanıcın bu fieldları grid üzerinden görünür veya görünmez hale getirmesi daha mantıklı olur diye düşünüyorum.

performans konusunda tabi diyecek birşeyim yok illaki etkileyecektir.
ama kullanıcıya çok daha esnek bir yapı sunabilir diye düşünüyorum ama tüm çabalarıma rağmen firebird alışma süreci sanırım başaramadım bunun bir yolu var ise bir örnek verirseniz sevinirim 2 tabloyu birbirine tüm alanlarıyla bağlayıp tüm alanların çekilmesi vebu alanlarda out extra eklenmiş olan parametrelerinde işlem yapılarak extra field olarak dışarı fırlatılması ile ilgili bir örnek mümkünse sevinirim.

şimdiden teşekkürler.