Stored Procedure Oluşturma Gönderen: Fatih Tarih: 10 October 2005 16:46:42
Stored Procedure Oluşturma SET TERM ^ ;
CREATE PROCEDURE SP_BASIT (AD VARCHAR(15) CHARACTER SET WIN1254)
RETURNS (EN_BUYUK_SIRA_NO INTEGER)
AS
begin
select max(SIRA_NO) FROM musteri
WHERE ADI=:AD
into :EN_BUYUK_SIRA_NO;
suspend;
end ^
SET TERM ; ^
GRANT SELECT ON MUSTERI TO PROCEDURE SP_BASIT;
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.
select max(SIRA_NO) FROM musteri
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
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.
GRANT SELECT ON MUSTERI TO PROCEDURE SP_BASIT;
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
CREATE PROCEDURE SP_BASIT2 (SIRA INTEGER)
RETURNS (AD VARCHAR(15) CHARACTER SET WIN1254, SOYAD VARCHAR(15) CHARACTER SET WIN1254)
AS
begin
select SIRA_NO, ADI, SOYADI FROM MUSTERI
where musteri.sira_no=:SIRA
into :SIRA, :AD, :SOYAD;
suspend;
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.
CREATE PROCEDURE SP_tumunu_Listele
RETURNS (AD VARCHAR(15) CHARACTER SET WIN1254, SOYAD VARCHAR(15) CHARACTER SET WIN1254)
AS
begin
FOR
select SIRA_NO, ADI, SOYADI FROM MUSTERI
into :SIRA, :AD, :SOYAD;
DO
begin
suspend;
end
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.
CREATE PROCEDURE SP_tumunu_Listele2 (ADIM VARCHAR(15) CHARACTER SET WIN1254)
RETURNS (AD VARCHAR(15) CHARACTER SET WIN1254, SOYAD VARCHAR(15) CHARACTER SET WIN1254)
AS
begin
FOR
select SIRA_NO, ADI, SOYADI FROM MUSTERI
where musteri.ADI,=:ADIM
into :SIRA, :AD, :SOYAD;
DO
suspend;
end
SP İle Kayıt Silme Aşağıdaki SP de input parametresine verilen numaraya eşit olan kayıtlar silinir.
CREATE PROCEDURE SP_SIL (SIRA INTEGER)
AS
begin
DELETE FROM musteri WHERE musteri.sira_no=:SIRA;
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.
GRANT SELECT,DELETE ON MUSTERI TO PROCEDURE SP_SIL;
SP İle Kayıt Ekleme CREATE PROCEDURE SP_EKLE (SIRA INTEGER, AD VARCHAR(15) CHARACTER SET WIN1254,
SOYAD VARCHAR(15) CHARACTER SET WIN1254)
AS
begin
INSERT INTO musteri (SIRA_NO,ADI,SOYADI)
VALUES (:SIRA, :AD, :SOYAD);
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.
GRANT INSERT ON MUSTERI TO PROCEDURE SP_EKLE;
SP İle Kayıt Güncelleme
CREATE PROCEDURE SP_GUNCELLE (
SIRA INTEGER,
AD VARCHAR(15) CHARACTER SET WIN1254,
SOYAD VARCHAR(15) CHARACTER SET WIN1254,
YENI_SIRA INTEGER)
AS
begin
update musteri
set SIRA_NO=:YENI_SIRA, ADI=:AD, SOYADI=:SOYAD
where SIRA_NO=:SIRA;
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.
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*/
CREATE PROCEDURE SP_VAR_ORNEK (SIRA INTEGER)
AS
DECLARE VARIABLE NUMARACONTROL INTEGER;
DECLARE VARIABLE ADCONTROL VARCHAR(15) CHARACTER SET WIN1254;
begin
select SIRA_NO, ADI FROM MUSTERI
where musteri.sira_no=:SIRA
into :NUMARACONTROL, :ADCONTROL; /* sorgu soonucu input ,output gibi değişkenlere atanıyor*/
if ((NUMARACONTROL=1) and (ADCONTROL='FAOsoft')) then /* seçilen kaydın nosu 1 adı FAOsoftsa*/
Begin
exception silmemezsin; /* daha önce tanımladığımız mesajı göster*/
Exit ; /* SP DEN ÇIKIŞ. kullandığımız exit komutu burada gereksizdir amaç Öğrenmek*/
end
else /* seçilen kaydın nosu 1 adı FAOsoft değşilse sil*/
DELETE FROM musteri WHERE musteri.sira_no=:SIRA;
suspend;
end
Grant bölümü aşağıdaki şekilde olmalıdır.
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.
CREATE PROCEDURE SP_GUN_BUL (
TARIH DATE)
RETURNS (
GUN_ADI VARCHAR(10))
AS
DECLARE VARIABLE BENIM_TARIH DATE;
DECLARE VARIABLE TARIH_KOPYASI DATE;
DECLARE VARIABLE FARK1 INTEGER;
DECLARE VARIABLE FARK2 INTEGER;
DECLARE VARIABLE GUN_FARKI INTEGER;
DECLARE VARIABLE SONUC INTEGER;
begin
/*DEGİŞKENLERE ATAMA YAP*/
BENIM_TARIH= '15.12.96'; /*HERHANGİ BİR PAZAR GUNU*/
TARIH_KOPYASI= :TARIH;
FARK1 = 1;
FARK2 = 2;
/*HESAPLA*/
WHILE (:FARK1 <> :FARK2) DO
BEGIN
FARK1 = TARIH - BENIM_TARIH;
GUN_FARKI = :FARK1 / 7;
FARK2 = :GUN_FARKI * 7;
IF (:FARK1 <> :FARK2) THEN
TARIH = :TARIH + 1;
END
SONUC = 7-(:TARIH-:TARIH_KOPYASI);
if (SONUC=1) then
GUN_ADI='Pazartesi';
else
if (SONUC=2) then
GUN_ADI='Salı';
else
if (SONUC=3) then
GUN_ADI='Çarşamba';
else
if (SONUC=4) then
GUN_ADI='Perşembe';
else
if (SONUC=5) then
GUN_ADI='Cuma';
else
if (SONUC=6) then
GUN_ADI='Cumartesi';
else
if (SONUC=7) then
GUN_ADI='Pazar';
suspend;
end
Tools> SQL Editörü açıp oraya şu kodu yazarak etkisini görebilirsiniz.
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ğırmaEXECUTE PROCEDURE spadı (giriş Patametre1,giriş Patametre2 ) RETURNING_VALUES çıkış Patametre1, çıkış Patametre2
giriş Patametreli bir sp aşağıdaki gibi çağrılır.
EXECUTE PROCEDURE SP_Listele (10,'FAOsoft')
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
CREATE PROCEDURE SP_GUNCELLE (
SIRA INTEGER,
AD VARCHAR(15),
SOYAD VARCHAR(15))
RETURNS (
SIRAM INTEGER,
ADIM VARCHAR(15),
SOYADIM VARCHAR(15))
AS
begin
update musteri
set SIRA_NO=:SIRA, ADI=:AD, SOYADI=:SOYAD
where SIRA_NO=:SIRA;
select SIRA_NO, ADI, SOYADI FROM MUSTERI
where musteri.sira_no=:SIRA
into :SIRAM, :ADIM, :SOYADIM;
suspend;
end
yukarıdaki sp yi çağıracak sp mizde aşağıdaki gibi olsun
CREATE PROCEDURE SP_CAGIR (
SIRA INTEGER,
AD VARCHAR(15) CHARACTER SET WIN1254,
SOYAD VARCHAR(15) CHARACTER SET WIN1254)
RETURNS (
SIRAM INTEGER,
ADIM VARCHAR(15) CHARACTER SET WIN1254,
SOYADIM VARCHAR(15) CHARACTER SET WIN1254)
AS
begin
execute procedure sp_guncelle :SIRA, :AD, :SOYAD returning_values :SIRAM, :ADIM, :SOYADIM;
suspend;
end
Tools> SQL Editörü açıp oraya şu kodu yazarak etkisini görebilirsiniz.
select * from SP_CAGIR (2,'fao','soft');
2. sp nin
Grant bölümü aşağıdaki şekilde olmalıdır.
GRANT EXECUTE ON PROCEDURE SP_GUNCELLE TO PROCEDURE SP_CAGIR;
CASE...WHEN...THEN...ELSEBir 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 :
select case extract(weekday from :TARIH)
when 0 then 'PZR'
when 1 then 'PTS'
when 2 then 'SAL'
when 3 then 'ÇRŞ'
when 4 then 'PRŞ'
when 5 then 'CUM'
when 6 then 'CTS'
end from rdb$database
Örnek
WHEN...DOWhen .. 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
CREATE PROCEDURE NUMBERPROC (A INTEGER) RETURNS (B INTEGER) AS
BEGIN
B = 0;
BEGIN
UPDATE R SET F1 = F1 + :A;
UPDATE R SET F2 = F2 * F2;
UPDATE R SET F1 = F1 + :A;
WHEN SQLCODE -803 DO
B = 1;
END
EXIT;
END!!
Stored Procedure DüzeltmeTek 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
ALTER PROCEDURE SP_GUN_BUL (
TARIH DATE)
RETURNS (
GUN_ADI VARCHAR(10))
AS
DECLARE VARIABLE BENIM_TARIH DATE;
DECLARE VARIABLE TARIH_KOPYASI DATE;
DECLARE VARIABLE FARK1 INTEGER;
DECLARE VARIABLE FARK2 INTEGER;
DECLARE VARIABLE GUN_FARKI INTEGER;
DECLARE VARIABLE SONUC SMALLINT;
begin
/*DEGİŞKENLERE ATAMA YAP*/
BENIM_TARIH= '15.12.96'; /*HERHANGİ BİR PAZAR GUNU*/
TARIH_KOPYASI= :TARIH;
FARK1 = 1;
FARK2 = 2;
/*HESAPLA*/
WHILE (:FARK1 <> :FARK2) DO
BEGIN
FARK1 = TARIH - BENIM_TARIH;
GUN_FARKI = :FARK1 / 7;
FARK2 = :GUN_FARKI * 7;
IF (:FARK1 <> :FARK2) THEN
TARIH = :TARIH + 1;
END
SONUC = 7-(:TARIH-:TARIH_KOPYASI);
if (SONUC=1) then
GUN_ADI='Pazartesi';
else
if (SONUC=2) then
GUN_ADI='Salı';
else
if (SONUC=3) then
GUN_ADI='Çarşamba';
else
if (SONUC=4) then
GUN_ADI='Perşembe';
else
if (SONUC=5) then
GUN_ADI='Cuma';
else
if (SONUC=6) then
GUN_ADI='Cumartesi';
else
if (SONUC=7) then
GUN_ADI='Pazar';
suspend;
end
bu şekilde içindeki kodlarıda değiiştirebilirsiniz.
Stored Procedure Silme DROP PROCEDURE ADI;
Örnek
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.
Herşeyiyle Stored Procedur (Firebird / Interbase) Gönderen: Fatih Tarih: 10 October 2005 16:49:22
YorumlarÖ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:
CREATE PROCEDURE SP_tumunu_Listele
RETURNS (AD VARCHAR(15) CHARACTER SET WIN1254, SOYAD VARCHAR(15) CHARACTER SET WIN1254)
AS
begin
FOR
select SIRA_NO, ADI, SOYADI FROM MUSTERI
into :SIRA, :AD, :SOYAD;
DO
begin
suspend;
end
end
hocam yukarıdaki kodda bulunan
into :SIRA, :AD, :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.
Selam,
Çok güzel bir döküman, elinize sağlık. Bir ufak hatırlatma yapmak gereği hissettim;
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;
CREATE PROCEDURE SP_GUNCELLE (
SIRA INTEGER,
AD VARCHAR(15),
SOYAD VARCHAR(15))
RETURNS (
SIRAM INTEGER,
ADIM VARCHAR(15),
SOYADIM VARCHAR(15))
AS
begin
update musteri
set SIRA_NO=:SIRA, ADI=:AD, SOYADI=:SOYAD
where SIRA_NO=:SIRA;
<<
>> 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;
CREATE PROCEDURE SP_GUNCELLE (
SIRA INTEGER,
AD VARCHAR(15),
SOYAD VARCHAR(15))
RETURNS (
SIRAM INTEGER,
ADIM VARCHAR(15),
SOYADIM VARCHAR(15))
AS
begin
update musteri
set SIRA_NO=:SIRA, ADI=:AD, SOYADI=:SOYAD
where SIRA_NO=:SIRA;
select SIRA_NO, ADI, SOYADI FROM MUSTERI
where musteri.sira_no=:SIRA
into :SIRAM, :ADIM, :SOYADIM;
suspend;
.....
!!
<<
>> CREATED
CREATE PROCEDURE SP_KAYDET (
.....
!!
<<
>> CREATED
CREATE PROCEDURE SP_SIL (
.....
!!
<<
>> 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.
Herşeyiyle Stored Procedur (Firebird / Interbase) Gönderen: Fatih Tarih: 10 October 2005 16:50:48
IB Expert'le Stored Procedure OluşturmaProcedures e sağ tıklayıp New Procedure dediğinizde aşağıdaki gibi bir pencere gelecektir

Ynt: Stored Procedure Oluşturma Gönderen: erkanmrs Tarih: 04 August 2006 13: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...
Ynt: Stored Procedure Oluşturma Gönderen: FetihlerFatihi Tarih: 04 August 2006 13:33:48
oluşturmaya çalıştığınız SP'yi görebilir miym?
Ynt: Stored Procedure Oluşturma Gönderen: erkanmrs Tarih: 07 August 2006 20: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...
Ynt: Stored Procedure Oluşturma Gönderen: FetihlerFatihi Tarih: 07 August 2006 22:13:24
geriye brden fazzla kayıt dönüyor, into ve for..do kullanmamışsın
makaleyi tekrar oku

Ynt: Stored Procedure Oluşturma Gönderen: nedimtrc Tarih: 06 May 2007 16: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