Procedure oluştururken hata

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
yokname
Üye
Mesajlar: 77
Kayıt: 17 Nis 2005 08:16
Konum: izmir

Procedure oluştururken hata

Mesaj gönderen yokname »

Arkadaşlar ibConsole da procedure hazırlamaya çalışıyorum birden fazla procedure denedim ama hepsinde aynı hatayı veri mesela

Kod: Tümünü seç

create procedure yazarsil(yazarkodu double precision) as
begin
      delete from kitaplar where kityaplar.yazarkodu=yazarkodu;
      delete from yazarlar where yazarlar.yazarkodu=yazarkodu;
end;
veya

Kod: Tümünü seç

create procedure kitaplistesi(yazarkodu integer)
returns (kitapadi varchar (100)) as
begin
for select kitaplar.kitapadi from kitaplar
where kitaplar.yazarkodu = :yazarkodu
order by kitapadi
into :kitapadi
do suspend;
procodure lerini yazdığımda

Kod: Tümünü seç

Dynamic SQL Error
SQL error code = -104
Unexpected end of command
hatası veriyor nerde yanlış yapıyorum anlamadım
Yardımcı olursanız çok sevinirim.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

"create procedure" den önce

Kod: Tümünü seç

SET TERM !! ;
procedure'un bittiğinde "end" den sonra:

Kod: Tümünü seç

SET TERM ; !!
ekle bir bakalım...

Begin end gibi komutlara ; konulmuyor. :!:
andronoid
Üye
Mesajlar: 35
Kayıt: 26 Tem 2004 06:44

Mesaj gönderen andronoid »

ibconsol kullanmadım ibexperte ben procedureleri yapıyorum. bi bak istersen aşağıdaki koda;

Kod: Tümünü seç

CREATE PROCEDURE SP_MAX_KODU (
    TABLENAME VARCHAR(25))
RETURNS (
    KODU INTEGER)
AS
BEGIN 
 if (:tablename='') then exit;

 execute statement 'select max(kodu) from ' || :tablename INTO :kodu;
 if (kodu is null) then kodu = 1;
 else kodu=kodu+1;
 suspend; 
END
Kullanıcı avatarı
yokname
Üye
Mesajlar: 77
Kayıt: 17 Nis 2005 08:16
Konum: izmir

Mesaj gönderen yokname »

Kod: Tümünü seç

SET TERM !! ;
create procedure yazarsil(yazarkodu double precision) as
begin
      delete from kitaplar where kityaplar.yazarkodu=yazarkodu;
      delete from yazarlar where yazarlar.yazarkodu=yazarkodu;
end
SET TERM ; !!
Böyle denedim bu sefer de

Kod: Tümünü seç

Dynamic SQL Error
SQL error code = -104
Token unknown - line 6, char -1
hatası veriyor tam 2.5 saattir bununla ugrasıyorum valla :?
Kullanıcı avatarı
yokname
Üye
Mesajlar: 77
Kayıt: 17 Nis 2005 08:16
Konum: izmir

Mesaj gönderen yokname »

CREATE PROCEDURE SP_MAX_KODU (
TABLENAME VARCHAR(25))
RETURNS (
KODU INTEGER)
AS
BEGIN
if (:tablename='') then exit;

execute statement 'select max(kodu) from ' || :tablename INTO :kodu;
if (kodu is null) then kodu = 1;
else kodu=kodu+1;
suspend;
END
bundada aynı hatayı veriyor.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

IBAdmin kullanmanı tavsiye ederim. Tembel işidir ama uğraştırmaz. IBAdmin'in oluşturduğu bir DDL'i gönderiyorum.

Kod: Tümünü seç

SET TERM ^ ;

CREATE PROCEDURE ARASINDAKI_DAKIKA (
    ISIMDI TIMESTAMP,
    ISONRA TIMESTAMP)
RETURNS (
    OSONUC BIGINT)
AS
begin
  OSONUC = case when (ISIMDI < ISONRA) then
             (ISONRA - ISIMDI) * 1440
           else
             (ISIMDI - ISONRA) * 1440
           end;
  suspend;
end
^

SET TERM ; ^

DESCRIBE PROCEDURE ARASINDAKI_DAKIKA
'Verilen iki tarih-saat arasında kaç dakika olduğunu BIGINT
olarak döndürür.';

GRANT EXECUTE ON PROCEDURE ARASINDAKI_DAKIKA TO SYSDBA;
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

yokname yazdı:

Kod: Tümünü seç

SET TERM !! ;
create procedure yazarsil(yazarkodu double precision) as
begin
      delete from kitaplar where kityaplar.yazarkodu=yazarkodu;
      delete from yazarlar where yazarlar.yazarkodu=yazarkodu;
end
[/quote]

Buradaki =yazarkodu, =:yazarkodu olmalıdır!
Kullanıcı avatarı
yokname
Üye
Mesajlar: 77
Kayıt: 17 Nis 2005 08:16
Konum: izmir

Mesaj gönderen yokname »

Yine aynı hatayı verdi ama ibexperti indirip denediğimde çalıştı procedure ama benim ibconsole da hazırlamam lazım çünkü çalıştığım firma ibconslo kullanıyor.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

create procedure yazarsil(yazarkodu double precision) as
begin
delete from kitaplar where kityaplar.yazarkodu=yazarkodu;
delete from yazarlar where yazarlar.yazarkodu=yazarkodu;
end;
Kodda bir yazım hatası olabilir :!: select, delete, insert, update cümleciği kullanırken tek tablo var ise başında alias yazmaya gerek yoktur :idea: yani;

Kod: Tümünü seç

begin
      delete from kitaplar where yazarkodu=yazarkodu;
      delete from yazarlar where yazarkodu=yazarkodu;
end;
demek yeterlidir.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
yokname
Üye
Mesajlar: 77
Kayıt: 17 Nis 2005 08:16
Konum: izmir

Mesaj gönderen yokname »

Hatayı düzelttim hocam yazdığım procedure ibexpertte çalışıyor ancak ibconsole da denediğim zaman

Kod: Tümünü seç

Dynamic SQL Error
SQL error code = -104
Unexpected end of command
hatası veriyor.
ne yaptıysam ne kadar procedure denediysem boş acaba bendeki interbase de bir problem olabilirmi hata ondan kaynaklanıyor olabilirmi.
teşekkür ederim
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Beklenmeyen komut sonlandırması diyor. Son satırda set term veya noktalı virgül olayına dikkat etmelisin :!:
Ayrıca son şeklini kopyalasaydın daha somut bir şey söylemek mümkün olurdu :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
yokname
Üye
Mesajlar: 77
Kayıt: 17 Nis 2005 08:16
Konum: izmir

Mesaj gönderen yokname »

Çok teşekkür ederim hocam set term işimi gördü

Kod: Tümünü seç

SET TERM !! ;
create procedure yazarsil(yazarkodu double precision) as
begin
      delete from kiraci where kiraci.kitapkodu=yazarkodu;
      delete from kitaplar where kitaplar.yazarkodu=yazarkodu;
      delete from yazarlar where yazarlar.yazarkodu=yazarkodu;
end
bir kac sorum daha olacak :oops:
1. set term ne işe yarıyor(ezber olmasını istemiyorum)
2.bu 3 tablo birbirine master detail ilişki ile bağlı
yazarlar ana tablo
kitaplar detay(yazarkodu ile bağlı)
kiraci detay(kitapkodu ile bağlı)

Kod: Tümünü seç

IBStoredProc1.Prepare;
IBStoredProc1.Params.ParamByName 'yazarkodu').Value :=IBDataSet1YAZARKODU.Value;
IBStoredProc1.ExecProc;
IBStoredProc1.Unprepare;
DBGrid1.Refresh;
yazdığımda

Kod: Tümünü seç

violation on foreign key constraint "İNTEG_17" on table "kiraci"
hatası veriyor.
tek bir tabloda denediğimde ise siliyor ancan dbgridde refreshlemiyor.

Kod: Tümünü seç

DBGrid1.Refresh
işe yaramıyor kapatıp acmam gerekiyor.
Umarım bu kadar soruyla canınızı sıkmamışımdır :oops:
Cevapla