StoredProcedure içersinde giren parametrelerin kullanımı

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

StoredProcedure içersinde giren parametrelerin kullanımı

Mesaj gönderen name »

İyi çalışmalar

StoredProcedure içersinde giren parametreler sadece bir sql sorgusu içersinde mi kullanılabiliyor?

Örnek ile şöyle anlatayım; aşağdaki sp'de, PAR1 parametresi ilk satır olan "SELECT M22 FROM KDV WHERE DONEM=:PAR1 INTO RET1" içersinde kullanıldığında bir problem ile karşılaşmıyorum. Ancak bu sql ifadesinden sonra gelen if bloğunda PAR1 parametresini kullandığımda "token unknown" hatası alıyorum.

PAR1 parametresini sql sorgusu dışında nasıl kullanmam gerekir yada kullanabilir miyim?
(Not: Şu şekildede işe yaramıyor "IF :PAR1 IN [1,15] THEN :PAR1=12;")

Kod: Tümünü seç

CREATE PROCEDURE P_xxx (PAR1 Integer) returns (RET1 Double Precision)
AS
BEGIN
   SELECT M22 FROM KDV WHERE DONEM=:PAR1 INTO RET1;

   IF (RET1 IS NULL) THEN
     BEGIN
       IF PAR1 IN [1,15] THEN PAR1=12;
     END
   ......
END
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

Sp'yi çalıştırmayı başardım.
Sp'leri yeni öğrenmeye başladığım için basit bir dizim hatası yapmışım :oops: . if bloğu içersindeki şart kısmının parentez içersinde olması gerekiyormuş.

Çalışan kod aşağıda

Kod: Tümünü seç

CREATE PROCEDURE P_xxx (PAR1 Integer) returns (RET1 Double Precision) 
AS 
BEGIN 
   SELECT M22 FROM KDV WHERE DONEM=:PAR1 INTO RET1; 

   IF (RET1 IS NULL) THEN 
     BEGIN 
       IF (PAR1 IN (1,15)) THEN PAR1=12; 
     END 
   ...... 
END 
Bu arada FireBird kullandığımı belirtmeyi unutmuşum :oops: .

İyi çalışmalar
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

Evet sp'yi çalıştırdım ama başka bir problem ile karşılaştım :oops: .

Bu sql ifadesini çalışıtırdığımda başarı ile veri alıyorum

Kod: Tümünü seç

select * from kdv where DONEM=:DONEM
Ama bu şekilde kullandığımda sadece alan isimlerini alıyorum hiç bir veri gelmiyor.

Kod: Tümünü seç

select * from kdv,P_xxx(:DONEM) where DONEM=:DONEM
İkinci ifade neden sağlıklı çalışmıyor?
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

kolay gelsin

Kod: Tümünü seç

select * from kdv,P_xxx(:DONEM) where DONEM=:DONEM
ne yapmak istiyorsun.
p_xxx kdv tablosundan veri çeken bir sp ise

Kod: Tümünü seç

select * from p_xxx(:DONEM) 
şeklinde kullanmalısın.
iyi çalışmalar.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

Merhaba
İlk sql sorgusu ile kdv tablosundan veri almak istiyorum ve problemlemsiz bir şekilde çalışıyor. İkinci sql sorgusu ilede kdv tablosundan ve p_xxx prosedurunden veri almak istiyorum. Belirttiğim gibi ikinci sorguda sadece alan isimlerini alabiliyorum hiç bir veri gelmiyor.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

en son elde etmek istediginiz sonucun tamamını tek bir SP olarak olusturun....
Bir de

Kod: Tümünü seç

IF PAR1 IN [1,15] THEN PAR1=12; 
buna bir anlam veremedim....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

eğer sp nin bir record set dondürmesini istiyorsanız (ki ben öyle anladım)
for select yapısını kullanmalısınız.

Kod: Tümünü seç

BEGIN
  FOR SELECT T.AD,T.SOYAD FROM ISIMLER T
      INTO :AD,:SOYAD DO
  BEGIN
    SUSPEND;
  END
END
kullanılacak yapı kısaca bu sekilde
ÜŞENME,ERTELEME,VAZGEÇME
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

İyi çalışmalar

Öncelikle kullandığım sp'nin tamamını vereyim ve ne yapmak istediğimi açayım.

Kod: Tümünü seç

SET TERM ^^ ;
CREATE PROCEDURE P_KDVDEVIR (P1 Integer, P2 Integer, P3 Integer) returns (DEVIR Double Precision)
AS
BEGIN

  IF (P2 IN (1,15)) THEN
    BEGIN
      IF (P2=1) THEN P2=12;
      IF (P2=15) THEN P2=18;
      P3=P3-1;
    END
  ELSE
    BEGIN
      P2=P2-1;
    END
  SELECT M28 FROM KDV1 WHERE SNO=:P1 AND DONEM=:P2 AND YIL =:P3 INTO DEVIR;
END
^^
SET TERM ; ^^
Sp içersinde yapmak istediğim, kdv1 tablosundan belirtilen dönemden bir önceki dönem'e ait bir "DoublePrecision" alanın değerini döndürmek istiyorum.

Yani;
"select * from kdv1 where SNO=:SNO AND DONEM=:DONEM AND YIL=:YIL" :)
Bu sql satırı ile belirtilen döneme ait tek bir kayıt dönüyor. Bu satır normal bir şekilde çalışıyor.

"select * from kdv1,P_KDVDEVIR(:SNO,:DONEM,:YIL) where SNO=:SNO AND DONEM=:DONEM AND YIL=:YIL" :(
Bu sql satırı ilede kdv1 tablosundan istenen döneme ait kayıdı ve P_KDVDEVIR dende belirtilen dönemin bir öncesinden bilgi almak istiyorum. İşte bu satırı çalıştırdığımda hiç bir data geri dönmüyor.

Yeni fark ettiğim bir şeyi daha ekleyeyim, sp'yi ibexperte oluşturdum ve aynı parametreler ile "Execute Procedure" dediğimde veri alıyorum ama sp'yi şu şekilde çalıştırdığımda yine herhangi bir data gelmiyor "select * from P_KDVDEVIR(:SNO,:DONEM,:YIL)" :(
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

SP'yi delphi tarafinda TStoredProc ile calistirmayi deneyin bir de....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

biraz once benzer bir deneme yaptım sizin sorunuzdakine benzer.
ilk once sp de for select yerine sadece select kullandım
hic kayıt gelmedi
sp sonucu tek kayıt donse bile for select yapısı ile sorunsuz calıstı
suspend eklemedigimde yine kaıt dondurmedi

Kod: Tümünü seç

CREATE PROCEDURE NEW_PROCEDURE (
    ID INTEGER)
RETURNS (
    ADI VARCHAR(10))
AS
BEGIN
  FOR
  SELECT URUN.ADI FROM URUN WHERE URUN.ID=:ID INTO :ADI DO
  BEGIN
    SUSPEND;
  END
END
sql cumlesi de
SELECT H.ID,P.ADI FROM NEW_PROCEDURE(4) P,HAREKETLER H
ÜŞENME,ERTELEME,VAZGEÇME
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

Teşekkürler gökmen bey dediğiniz gibi for select içersinde kullandığımda veri alabildim. Peki bu bir bug mı?

Gerçi yine bu şekilde kullanamıyacam gibi çünkü sp'den bir değer dönmediğinde (önceki dönem yok yada null ise) kdv1 tablosundanda hiç bir veri alamıyorum.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

zannetmiyorum, genel kullanım sekli bu olmalı
ayrıca query ve sp seklinde degilde
problemi tekbir sp ye indirgeyebilirseniz istediginiz recordseti sp uretse size
belki daha iyi olur.
ÜŞENME,ERTELEME,VAZGEÇME
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

Merhaba

sp'ye suspend satırını ekleyince kod başarılı bir şekilde çalıştı :D :D . Kod üzerinde hertürlü test'i yaptım sorun yok. Suspend satırını daha öncede eklemiştim gerçi ama... :?: :?:

Cevap yazan herkese teşekkürler. Çalışan kod aşağıda

Kod: Tümünü seç

SET TERM ^^ ; 
CREATE PROCEDURE P_KDVDEVIR (P1 Integer, P2 Integer, P3 Integer) returns (DEVIR Double Precision) 
AS 
BEGIN 

  IF (P2 IN (1,15)) THEN 
    BEGIN 
      IF (P2=1) THEN P2=12; 
      IF (P2=15) THEN P2=18; 
      P3=P3-1; 
    END 
  ELSE 
    BEGIN 
      P2=P2-1; 
    END 
  SELECT M28 FROM KDV1 WHERE SNO=:P1 AND DONEM=:P2 AND YIL =:P3 INTO DEVIR; 
  SUSPEND;
END 
^^ 
SET TERM ; ^^
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

sorununuzu hallettiginize sevindm
iyi calısmalar:)
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Gökmen'in de belirttiği gibi eğer SP'den herhangi bir ResultSet dönecek ise (Yani tek bir kayıttan fazla birşeyler dönüyor ise) FOR SELECT ve SUSPEND eklemek gerekiyor. SUSPEND burada parametrelerin Client'e ulaşması için server'ı bekletir. Yani Server turlama yaparken birinci Return Parametrelerini gönderiri ve Client'tan, Tamam Aldım yanıtını bekler, ondan sonra ikinci, üçüncü... böyle gider taaa ki SP kendi içerisindeki döngüyü bitirene kadar...

Çalışma mantığı bu şekilde.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Cevapla