Stored Procedure de Sql hatası?

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Kullanıcı avatarı
ömer faruk
Üye
Mesajlar: 97
Kayıt: 29 Eki 2003 09:34
Konum: Bursa
İletişim:

Stored Procedure de Sql hatası?

Mesaj gönderen ömer faruk »

CREATE PROCEDURE FATURA_TOP_FIYAT (
FATURA_NO DOUBLE PRECISION)
RETURNS (
TOPFIYAT DOUBLE PRECISION,
TOPMIKTAR DOUBLE PRECISION,
TOPMAL DOUBLE PRECISION,
KDVTUTARI DOUBLE PRECISION,
TOPLAMTUTAR DOUBLE PRECISION)
AS
DECLARE VARIABLE fiyat DOUBLE PRECISION;
DECLARE VARIABLE miktar DOUBLE PRECISION;


BEGIN
SELECT sum(fiyat),sum(miktar),sum(fiyat*miktar),sum(fiyat*miktar*0.18),sum(fiyat*miktar*1.18) FROM faturaa
WHERE faturaa.fatura_no=:fatura_no INTO :topfiyat,topmiktar,topmal,kdvtutari,toplamtutar;


SUSPEND;
END

s.A
Ya arkadaşlar dünden beri sp lerle ugrasmaya başladım yukarıdaki kod canavar gibi calışıyor ama aşşaıdaki
kod başka bir işlem yaptırmak isteyorum ama hata veriyor ne denediysem olmadı ya neden hata veriyor
yukarıdaki kod da yapmak istedigin fatura detayındaki toplam fiyatları ve miktarları bulmak ki oldu problem yok
aşşağıda da aynı cari kod daki müşterilerin butun fatura detayındaki fiyat ve miktarları toplatmak istiyorum
bir türlü olmadı ama aşşağıdaki kodun sql kısmı şu halde sql explorer de çalışıyor
{
SELECT Sum(FATURAA.FIYAT),Sum(FATURAA.MIKTAR),CARI.CARI_KOD
FROM FATURAA,CARI,FATURA
WHERE CARI.CARI_KOD=FATURA.CARI_KOD
AND FATURA.FATURA_NO=FATURAA.FATURA_NO
GROUP BY CARI.CARI_KOD} bu kodu sp ye aktarıyorum fatura_no kısmını ayarlayıp ama olmuyor...umarım yeterince açıklayabilmişimdir...




CREATE PROCEDURE DDDDD (
FATURA_NO DOUBLE PRECISION)
RETURNS (
TOPLAMMIKTAR DOUBLE PRECISION,
TOPLAMTUTAR DOUBLE PRECISION)
AS
DECLARE VARIABLE fiyat DOUBLE PRECISION;
DECLARE VARIABLE miktar DOUBLE PRECISION;



BEGIN
SELECT Sum(FATURAA.FIYAT),Sum(FATURAA.MIKTAR),CARI.CARI_KOD FROM FATURAA,CARI,FATURA
WHERE CARI.CARI_KOD=FATURA.CARI_KOD AND (bu kısımda
"precompiler Error: parsing error - ;." şu hatayı veriyor)
FATURA.FATURA_NO=:FATURA_NO;


SUSPEND;
END
Hakimiyet ALLAH' ındır...
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

whereden sonda iki karsılastırma ifaden var
parantez kullan
if li ifadelerde de parantez kullanmazsan hata vermekte...
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
ömer faruk
Üye
Mesajlar: 97
Kayıt: 29 Eki 2003 09:34
Konum: Bursa
İletişim:

Mesaj gönderen ömer faruk »

S.A
WHERE (CARI.CARI_KOD=FATURA.CARI_KOD) AND (FATURA.FATURA_NO=:FATURA_NO);

WHERE (CARI.CARI_KOD)=(FATURA.CARI_KOD) AND (FATURA.FATURA_NO)=:(FATURA_NO);

WHERE (CARI.CARI_KOD=FATURA.CARI_KOD AND FATURA.FATURA_NO=:FATURA_NO);

üstad bu şekilde de olmadı nerede yanlış yapıyorum acaba :(
Hakimiyet ALLAH' ındır...
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

sonunda into ve cıkıs parametrelerini yazmamıssın
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
ömer faruk
Üye
Mesajlar: 97
Kayıt: 29 Eki 2003 09:34
Konum: Bursa
İletişim:

Mesaj gönderen ömer faruk »

off yok üstad yaa senin dedigin gibide yapmıstım şimdide deniyorum üsteki kod canavar gibim çlışıyor bu koda gelince gümlüyor anlamadım
bu stored prosedur lerde sql farklımı yazılıyor en sonunda kitap alacam varmı güzel şöyle bu sql stored prosedur leri anlatan....
Altaki kodda ne hata var da çalışmıyor anlamadım gitti

CREATE PROCEDURE DDDDD (
FATURAA_NOO DOUBLE PRECISION)
RETURNS (
TOPFIYAT DOUBLE PRECISION)
AS
DECLARE VARIABLE fiyat DOUBLE PRECISION;
DECLARE VARIABLE miktar DOUBLE PRECISION;


BEGIN
SELECT Sum(FIYAT),Sum(MIKTAR),CARI_KOD FROM FATURAA,CARI,FATURA
WHERE fatura_no=:FATURAA_NOO INTO :TOPFIYAT;Column unknown. burada bu hatayı veriyor)

SUSPEND;
END
Hakimiyet ALLAH' ındır...
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

kullandıgın tabloların ddl lerini gonder ben de deneyeyim olmazsa
enson yazdıgında column unknow yanında hangi column oldugu yazmıyor mu?
degisken olarak tanımladıgın fiyat ve miktar ı hic kullanmadın galiba
sum icinde ki fiyat ve miktar tablonda olan alanlar degilmi?

ayrıca select te 3 alan seciyorsan into dan sonra 3 cıkıs parametresini : ile yazman lazım asagıdaki gibi

Kod: Tümünü seç

SELECT EVR_TARIH,EVR_BAS_ZAMAN,EVR_BIT_ZAMAN FROM EVRAK
    WHERE EVR_NO=:EVR_NO  INTO :TARIH,:BAS_ZAMAN,:BIT_ZAMAN;
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Evet benim de gozume çarpan select listteki alan sayisi ile sonuclarin atandigi parametre sayisi birbirini tutmuyor....
* 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 »

Ayrıca Sp yada trigger yada bilmem ne icin en huzel kaynak
ibphoenix.com dan da indirebilecegin Langref isimli pdf.
http://www.ibphoenix.com/idpl.htm?a=ibp ... umentation
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
ömer faruk
Üye
Mesajlar: 97
Kayıt: 29 Eki 2003 09:34
Konum: Bursa
İletişim:

Mesaj gönderen ömer faruk »

S.A abi olmıyan kodlar varya bilgisayarım sabahtan beri açık yogun çalıştıgımdan olcak bende fakedemedim, tamamen bilgisayardan kaynaklanıyormuş neyse hallettım yavs :P sağolasın abi.....
Kod çalışıyor ama sql yordamın birtürlü istedigim şeyi yaptırtamıyorum
sp içindek ikomut dizimi şu
SELECT sum(faturaa.fiyat),sum(faturaa.miktar) FROM FATURAA,CARI,FATURA WHERE CARI.CARI_KOD=:CARI_KODU AND FATURA.FATURA_NO=FATURAA.FATURA_NO GROUP BY CARI.CARI_KOD INTO :toplammiktar,toplamtutar;

ben yukarıdaki koyu renkli cari_kodu inpt olarak ayarlaıyorum cari kodunu ben veriyorum yani o cari koddaki butun fatura miktar ve fiyatlarnı toplaması lazım gelgeleim bizim sql nevar neyok butun carilerinde fatura nolarını topluyor tam emin degilim ama AND olayı ve ondan sonraki yordamdan kaynaklanıyor bu durumda istedigim şeyi yapabilmem için nasıl bir değişikliklik yapmam lazım?
Sağolasın üstad....
Hakimiyet ALLAH' ındır...
Kullanıcı avatarı
ömer faruk
Üye
Mesajlar: 97
Kayıt: 29 Eki 2003 09:34
Konum: Bursa
İletişim:

Mesaj gönderen ömer faruk »

S.A
abi btün uğraşlarım sonuçu şeşikilde hallettim bilmem zararlımı bende anlamadım sonuçları nıye dörtle çarpıyor..Buşeklilde olması sağlıklımı acaba sonuçlar doğru çıkyor...veri büyüdükçe de doğrumu çıkar acaba...


SELECT sum(faturaa.fiyat/4),sum(faturaa.miktar/4) FROM FATURAA,CARI,FATURA WHERE CARI_KOD=:CARI_KODU AND FATURA_NO=FATURAA.FATURA_NO INTO :toplammiktar,toplamtutar;
Hakimiyet ALLAH' ındır...
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

Bir örnek yaptım
asagıdaki ddl i calıstırıp bir dene

Kod: Tümünü seç

/*******************************************************************************
 * Selected metadata objects
 * -------------------------
 * Extracted at 16.04.2004 11:45:12
 ******************************************************************************/

SET TERM ^^ ;
/*******************************************************************************
 * Procedure Headers
 * -----------------
 * Extracted at 16.04.2004 11:45:12
 ******************************************************************************/

CREATE PROCEDURE P_CARI_TOPLAM (
  CARI_KODU Double Precision)
 returns (
  TOPLAM_FIYAT Double Precision) AS
BEGIN
  SUSPEND;
END^^
^^

SET TERM ; ^^
/*******************************************************************************
 * Tables
 * ------
 * Extracted at 16.04.2004 11:45:12
 ******************************************************************************/

RECREATE TABLE CARI
(
  CARI_KOD     DOUBLE PRECISION         NOT NULL,
  CARI_ADI              VARCHAR(    20),
 CONSTRAINT PK_CARI PRIMARY KEY (CARI_KOD)
);

RECREATE TABLE FATURA
(
  FARURA_NO     DOUBLE PRECISION         NOT NULL,
  CARI_KOD      DOUBLE PRECISION,
 CONSTRAINT PK_FATURA PRIMARY KEY (FARURA_NO)
);

RECREATE TABLE FATURA_DETAY
(
  DETAY_NO        DOUBLE PRECISION         NOT NULL,
  FATURA_NO       DOUBLE PRECISION,
  MIKTAR                   INTEGER,
  BIRIM_FIYAT     DOUBLE PRECISION,
  MAL_NO                   INTEGER,
 CONSTRAINT PK_FATURA_DETAY PRIMARY KEY (DETAY_NO)
);

SET TERM ^^ ;
/*******************************************************************************
 * Procedure Bodies
 * ----------------
 * Extracted at 16.04.2004 11:45:12
 ******************************************************************************/

ALTER PROCEDURE P_CARI_TOPLAM (
  CARI_KODU Double Precision)
 returns (
  TOPLAM_FIYAT Double Precision)
AS
begin

SELECT  SUM(F2.MIKTAR*F2.BIRIM_FIYAT)
   FROM  FATURA F JOIN FATURA_DETAY F2 ON F.FARURA_NO = F2.FATURA_NO
   GROUP BY  F.CARI_KOD HAVING F.CARI_KOD=:CARI_KODU INTO :TOPLAM_FIYAT;

end
^^

SET TERM ; ^^
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

4'e bolmek sagliksiz. Zira muhtemelen from'daki tablolardan biri ile iliskiyi where kısmında belirtmediginiz icin kartezyen carpim sonucu geliyor. Yani kayıtlar 4'der defa tekrar ederek geliyor. Ama yarın ilgili tablolardaki kayit sayilari degistiginde bu 4 degil 5, 6,10 olabilir....

Yapmaniz gereken where kismina dikkat etmek. FATURAA,CARI,FATURA tablolari arasindaki iliskileri where ksımında kullanarak kayıtların teker teker gelemsini saglayabilirsiniz...

Kolay gelsin...
* 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ı
ömer faruk
Üye
Mesajlar: 97
Kayıt: 29 Eki 2003 09:34
Konum: Bursa
İletişim:

Mesaj gönderen ömer faruk »

S.A

SELECT sum(faturaa.fiyat),sum(faturaa.miktar) FROM FATURAA,CARI,FATURA WHERE FATURA.FATURA_NO=FATURAA.FATURA_NO
AND CARI.CARI_KOD=:CARI_KODU INTO :toplammiktar,toplamtutar;

Fahrettin abi yukarıdaki komutu uyguluyorum butun carilere ait fatura toplamlarının toplamını veriyor...ama ben verdigin cari numarasının butun fatura toplamını istiyorum sql explorerda

SELECT Sum(FATURAA.FIYAT),Sum(FATURAA.MIKTAR),FATURA.FATURA_NO,CARI.CARI_KOD
FROM CARI,FATURAA,FATURA
WHERE FATURA.FATURA_NO=FATURAA.FATURA_NO
AND CARI.CARI_KOD=FATURA.CARI_KOD
GROUP BY FATURA.FATURA_NO,CARI.CARI_KOD

yukarıdaki komut sql explorer da istedigim sonucu veriyor ama bu seferde yukarıdaki komut storud proc ta calışmıyor..sağolsun gkimirti abim benim için kod yazmış ama en daha yeniyim stored proclarda kavrayamadım interbase de çalışıyorum birde neyse en azından neden hata verdigini anlasam yetecek storud proc larda sql lin kullnımı nı haladaha çözemedim sql explorerda istedigim sonucu alabiliyorum ama stored proc lara gelince bir türlü olmuyor ornek olarak ta yukarıdaki komutlar group by kısmın ekleyince "multiple rows in singleton select" hatası veriyor :( ...neyse çok sağolun uğraştıgınız için .....




GROUP BY FATURA.FATURA_NO,CARI.CARI_KOD
Hakimiyet ALLAH' ındır...
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

tablo yapını ddl olarak buraya yaz ben kendi makinamda olusturmaya calısayım. dbworkbench yada ibexpert ile ddl i copy/paste yapabilirsin
yukarda benim yaptıgım gibi
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
ömer faruk
Üye
Mesajlar: 97
Kayıt: 29 Eki 2003 09:34
Konum: Bursa
İletişim:

Mesaj gönderen ömer faruk »

S.A abi ya sağolasın senide çok uğraştırıyoz hakkını helal et Allah razı olsun....

/******************************************************************************/
/**** Generated by IBExpert 20.04.2004 09:36:39 ****/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES NONE;



/******************************************************************************/
/**** Tables ****/
/******************************************************************************/

CREATE TABLE CARI (
AD_UNVAN CHAR(30),
TELEFON CHAR(20),
FAX CHAR(20),
YETKILI CHAR(20),
VNUMARASI CHAR(20),
CARI_ID DOUBLE PRECISION NOT NULL,
CARI_KOD CHAR(20),
VDAIRESI CHAR(20),
"NOT" CHAR(40),
ADRES CHAR(40)
);





/******************************************************************************/
/**** Primary Keys ****/
/******************************************************************************/

ALTER TABLE CARI ADD PRIMARY KEY (CARI_ID);


/******************************************************************************/
/**** Privileges ****/
/******************************************************************************/
/******************************************************************************/
/**** Generated by IBExpert 20.04.2004 09:37:36 ****/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES NONE;



/******************************************************************************/
/**** Tables ****/
/******************************************************************************/

CREATE TABLE FATURA (
FATURA_ID DOUBLE PRECISION NOT NULL,
FATURA_NO CHAR(20),
ACIK_KAPALI CHAR(7),
MIKTAR DOUBLE PRECISION,
FIYAT DOUBLE PRECISION,
MAL_CINSI CHAR(20),
CARI_KOD CHAR(20),
ACIKLAMA CHAR(30),
FATURA_TARIHI CHAR(20)
);





/******************************************************************************/
/**** Primary Keys ****/
/******************************************************************************/

ALTER TABLE FATURA ADD PRIMARY KEY (FATURA_ID);


/******************************************************************************/
/**** Privileges ****/
/******************************************************************************//******************************************************************************/
/**** Generated by IBExpert 20.04.2004 09:37:57 ****/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES NONE;



/******************************************************************************/
/**** Tables ****/
/******************************************************************************/

CREATE TABLE FATURAA (
FATURAA_ID DOUBLE PRECISION NOT NULL,
FATURA_NO CHAR(20),
MAL_CINSI CHAR(30),
ACIKLAMA CHAR(30),
MIKTAR DOUBLE PRECISION,
FIYAT DOUBLE PRECISION
);





/******************************************************************************/
/**** Primary Keys ****/
/******************************************************************************/

ALTER TABLE FATURAA ADD PRIMARY KEY (FATURAA_ID);


/******************************************************************************/
/**** Privileges ****/
/******************************************************************************/
Hakimiyet ALLAH' ındır...
Cevapla