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

Mesaj gönderen name »

Merhaba

@Kuri_TLJ teşekkürler.Bende tam yeni bir mesaj atacaktım. Şimdi iki soru sormam gerekiyor :)

soru 1: "SELECT M28 FROM KDV1 WHERE SNO=:P1 AND DONEM=:P2 AND YIL =:P3 INTO DEVIR;" bu sorgu kesinlikle tek bir kayıt geri gönderiyor. buna rağmen "suspend" kullanmadan çalışmıyor. Neden?

soru 2: enson verdiğim sp'yi biraz geliştirmem gerekti.Ve sp'yi aşağıdaki hale getirdim ama bu yeni iki satırı ekleyine sp yine çalışmamaya başladı. yeni eklenen satırları kaldırınca sp sağlıklı bir şekilde çalışıyor. sp'yi yeni eklenen satırlarla birlikte nasıl çalıştıra bilirim?

sp'nin yeni hali

Kod: Tümünü seç

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

  SELECT M22 FROM KDV1 WHERE SNO=:P1 AND DONEM=:P2 AND YIL =:P3 INTO X; 
  IF (NOT (X IS NULL)) THEN EXIT; 

  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ı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,
Benim dikkatimi çeken bu satır oldu, yani eğer X NULL Değil ise procedure'den çık diyorsun.

IF (NOT (X IS NULL)) THEN EXIT;

SUSPEND komutu senin yazdığın gibi bir procedure'de kullanılmaz (Tavsiye edilmiyor). Dokumanlarda özellikle Not Recommended diyor.

Şimdi geriye hiçbirşey mi döndürmüyor, yoksa NULL filan mı döndürüyor.

Bir küçük ayrıntı daha, INTO ProcedureDegiskeni şeklinde kullanırken,

INTO :ProcedureDegiskeni şeklinde kullanırsan bakalım bir farklılık olacak mı? Bir de bunu dene bakalım :)

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
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,

Bir soru daha, SP'den error code dönüyor mu? Yani Code 100 filan dönüyor mu? Eğer dönüyorsa, dokumanlarda geçen bir şeyden bahsedeyim.

Select procedure'lerde işletilen son SUSPEND'den sonra herhangi bir işletilebilir satır var ise, Procedure apllication'a Code 100 döndürür, son işletilen işlemin sonucunu döndürmez diyor.

Bilgin olsun (LANGREF.PDF, SUSPEND açıklamasında var.)

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

İyi günler

Öncelikle özürdileyerek sp'de değişiklik yapıyorum. 1. sp' çalışmıyor.
sp'yi ibexperde "execute procedure" diyerek çalıştırdığımda problemsiz bir şekilde sp çalışıyor. Ancak bir sql ifadesi içersinde aynı parametreler ile kullandığımda hiç bir hata mesajı almadan sadece alan adı geri dönüyor. Herhangi bir data gelmiyor.

"select * from P_KDVDEVIR(:SNO,:DONEM,:YIL)" sadece alan isimi geri dönüyor.

Kod: Tümünü seç

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

  SELECT M22 FROM KDV1 WHERE SNO=:P1 AND DONEM=:P2 AND YIL =:P3 INTO DEVIR;
  IF (NOT (DEVIR IS NULL)) THEN EXIT; // önceki dönemden devir alınacak tutar belirtilmiş ise exit; null ise devam;

  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 ; ^^ 


dediğim gibi sp'yi aşağıdaki gibi yazarsam her şey sağlıklı bir şekilde işliyor.

Kod: Tümünü seç

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

  /*SELECT M22 FROM KDV1 WHERE SNO=:P1 AND DONEM=:P2 AND YIL =:P3 INTO DEVIR;
  IF (NOT (DEVIR IS NULL)) THEN EXIT;*/ 

  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ı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Evet anladığım kadarı ile, FIREBIRD

EXECUTE PROCEDURE'ün çalıştırılması ve sonuç döndürme mantığı ile

SELECT'in içerisinde kullanılan Procedure'lerin çalışma mantıkları arasında fark var.

Muhtemelen SELECT çalıştırıldığında Server bir Synchronisation ihtiyacı duyuyor (Yani Select ile Procedure'den dönen Result setin) eşlenik bir biçimde hareket etmesi zorunluluğundan kaynaklanıyor.

Yani Tek başına çağırdığınızda (Tek bir satır bile döndürse) herhangi bir synchronisation'a ihtiyaç duymuyor lap diye sonucu yapıştırıyor)

Ama bir Select içinde kullanıldığında synchronisation'a ihtiyaç duyuyor (ki böyle olmalı) SUSPEND ile bu synchronisation sağlanmış oluyor.

Öyle değil mi Fahrettin?

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
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 »

Tekrar selam,

Şimdi source da dikkatimi bir nokta çekti. Değişikliği sadece SUSPEND satırında yaparak dener misin?

Yani yukarıdaki kapattığın şeyleri kapatmadan bir dener misin. Sadece SUSPEND'i açıp kapatarak.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

Merhaba

@Kuri_TLJ söylediğiniz gibi ilk verdiğim sp kodunda "SUSPEND" satırını açıp kapayarak deneme yaptım. Sonuç yine olumsuz. Söylediğim problemlerin hepdi aynen devam ediyor. :?: :?: :?:
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,

O zaman SUSPEND ile synchronisation istiyor olabilir... Başka bir neden aklıma gelmiyor benim.

Freeman sen ne dersin bu işe?

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