Kod İle Stored Procedure Oluştururken Hata Alıyorum

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ı
tsamim
Üye
Mesajlar: 76
Kayıt: 19 Ağu 2004 03:08
Konum: izmir

Kod İle Stored Procedure Oluştururken Hata Alıyorum

Mesaj gönderen tsamim »

Merhaba arkadaşlar;

Delphi projemde veritabanında(Firebird) yaptığım değişklikleri kullanıcıların sistemlerine daha kolay uygulayabilmek için otomatik güncelleme yapacak bir prog. yazmak istedim. Veri tabanında açılan alanları , trigger ve procedure leri kullanıcının sistemine yazdığım bu prog. ile uygulamak istedim.

Sorunum şu field ve tirggerdaki değişklikleri delphi 7.0 da yazmıs olduğum prog. ile kullanıcının sistemindeki veritabanına uygulayabiliyorum fakat store procedure' u veritabanında create etmede sürekli hata alıyorum. İlgili kodlarlar aşağıda;

q.Close;
q.SQL.Clear;
q.SQL.Text:='ALTER TABLE VERSIYON ADD SPADI VARCHAR(25) CHARACTER SET WIN1254 COLLATE WIN1254';
q.Open;

Örneğin üstteki kod ile versiyon tablenda SPADI alanı açılıyo.

Fakat aşağıda yazacağım kod ile store procedure oluşturma işleminde sürekli (SQL ERROR CODE = -104) hata alıyorum. Yardımlarınızı bekliyorum iyi çalışmalar...

HATA :
SQL ERROR CODE = -104
Token unkown -line 1 , char 661 ?

Kod: Tümünü seç

q.Close;
q.SQL.Clear;
q.SQL.Text:='ALTER PROCEDURE KAR_ZARAR2 ( ' +
    'ESRKT VARCHAR(10), ' +
    'EYL SMALLINT, ' +
    'ETRH1 DATE, ' +
    'ETRH2 DATE) ' +
    'RETURNS ( ' +
    'OSTK VARCHAR(15), ' +
    'OFLG VARCHAR(10), ' +
    'OTRH DATE, ' +
    'OFYT DOUBLE PRECISION, ' +
    'OMKTR DOUBLE PRECISION, ' +
    'OLNKKOD DOUBLE PRECISION, ' +
    'OBRM DOUBLE PRECISION, ' +
    'OSTKBRM INTEGER, ' +
    'ODKOD INTEGER) ' +
'AS ' +
'DECLARE VARIABLE BRM INTEGER; ' +
'DECLARE VARIABLE EMKTR DOUBLE PRECISION; ' +
'DECLARE VARIABLE BRMMKTR INTEGER; ' +
'DECLARE VARIABLE FLG INTEGER; ' +
'DECLARE VARIABLE ELNK DOUBLE PRECISION; ' +
'begin ' +

'for select stokkod,tarih,fiyat,miktar,birim,depo_kod ' +
'from stkhar f1 where sirket_kodu = :esrkt and mali_yil = :eyl and ' +
'tarih >= :etrh1 and tarih <= :etrh2 and flag = ''Ç'' and ((yer is null) or (yer = 8)) order by tarih into ' +
':ostk , :otrh , :ofyt , :omktr , :obrm , :odkod ' +
'do ' +
'begin ' +
'oflg = ''S''; ' +
'if (:obrm <> 0) then ' +
'ostkbrm = 1; else ' +
'ostkbrm = 2; ' +
'olnkkod = 0; ' +
'suspend; ' +
'end ' +

'end ';
q.Open;
En son tsamim tarafından 22 Eyl 2010 09:25 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Kod İle Stored Procedure Oluştururken Hata Alıyorum

Mesaj gönderen aslangeri »

s.a.
kodlarınızı code tagı içerisinde yazarsanız daha okunaklı olurlar. netekim şuan kodlardan pek bişey anlaşılmıyor.
104 numaralı hata dan sonra başka birşey yazmıyormu hata mesajında.
genelde satır ve sutun numarasınıda vermesi lazım.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
tsamim
Üye
Mesajlar: 76
Kayıt: 19 Ağu 2004 03:08
Konum: izmir

Re: Kod İle Stored Procedure Oluştururken Hata Alıyorum

Mesaj gönderen tsamim »

a.s dediğiniz gibi kodları code tabı arasına aldım. Hata kodunda yazan ifadeyide suan açıkça belirttim.

İlgilendiğiniz için teşekkür ediyorum yardımlarınızı bekliyorum.

İyi çalışmalar...
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Kod İle Stored Procedure Oluştururken Hata Alıyorum

Mesaj gönderen aslangeri »

1. satır 661 karakterde bir hata olduğunu söylüyor.
661.karakteri bulursanız orada bir hata var.
muhtemelen noktalı virgül ile ilgili bir şey olabilir.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Kod İle Stored Procedure Oluştururken Hata Alıyorum

Mesaj gönderen Lost Soul »

sql cümlenizin başına

Kod: Tümünü seç

SET TERM ^ ;
sonuna

Kod: Tümünü seç

^

SET TERM ; ^
ekleyerek deneyiniz.

";" işareti default olarak bir deyimin sonu anlamına gelir. Ancak stored procedure ve trigerlerın içinde de ";" konulabileceği için işinizi bitirene kadar ";" işaretini "^" (veya başka bir) işaretle değiştiriniz. işinizi bitiiğinde "^" işareti ile deyiminizi sonlandırıp sonra da
";" işaretini tekrar sonlandırıcı olarak belirtiniz.

Sonuç olarak.

Kod: Tümünü seç

q.Close;
q.SQL.Clear;
With q.SQL do
Begin
    Add('SET TERM ^ ; ');
    Add('    ALTER PROCEDURE KAR_ZARAR2 ( ');
    Add('    ESRKT VARCHAR(10), ');
    Add('    EYL SMALLINT, ');
    Add('    ETRH1 DATE, ');
    Add('    ETRH2 DATE) ');
    Add('    RETURNS ( ');
    Add('    OSTK VARCHAR(15), ');
    Add('    OFLG VARCHAR(10), ');
    Add('    OTRH DATE, ');
    Add('    OFYT DOUBLE PRECISION, ');
    Add('    OMKTR DOUBLE PRECISION, ');
    Add('    OLNKKOD DOUBLE PRECISION, ');
    Add('    OBRM DOUBLE PRECISION, ');
    Add('    OSTKBRM INTEGER, ');
    Add('    ODKOD INTEGER) ');
    Add('    AS ');
    Add('        DECLARE VARIABLE BRM INTEGER; ');
    Add('        DECLARE VARIABLE EMKTR DOUBLE PRECISION; ');
    Add('        DECLARE VARIABLE BRMMKTR INTEGER; ');
    Add('        DECLARE VARIABLE FLG INTEGER; ');
    Add('        DECLARE VARIABLE ELNK DOUBLE PRECISION; ');
    Add('    begin ');
    Add('');
    Add('        for select stokkod,tarih,fiyat,miktar,birim,depo_kod ');
    Add('        from stkhar f1 where sirket_kodu = :esrkt and mali_yil = :eyl and ');
    Add('        tarih >= :etrh1 and tarih <= :etrh2 and flag = ''Ç'' and ((yer is null) or (yer = 8)) order by tarih into ');
    Add('        :ostk , :otrh , :ofyt , :omktr , :obrm , :odkod ');
    Add('        do ');
    Add('        begin ');
    Add('            oflg = ''S''; ');
    Add('            if (:obrm <> 0) then ');
    Add('            ostkbrm = 1; else ');
    Add('            ostkbrm = 2; ');
    Add('            olnkkod = 0; ');
    Add('            suspend; ');
    Add('        end ');
    Add('    end ');
    Add('^ ');
    Add('SET TERM ; ^');
End;
q.Open;
Not: Ayrıca kodlarınızı yukarıdaki gibi add diyerek yaparsanız hem hata payınız azalır hem de sql hatalarında
line 1 char 661 yerine line 17 char 4 gibi bir hata alıp daha rahat hatayı bulabilirsiniz.
Kullanıcı avatarı
tsamim
Üye
Mesajlar: 76
Kayıt: 19 Ağu 2004 03:08
Konum: izmir

Re: Kod İle Stored Procedure Oluştururken Hata Alıyorum

Mesaj gönderen tsamim »

Merhaba "Lost Soul" öncelikle ilgilendiğin için teşekkür ederim.

Delphide dediğin şekilde kodu uygulayıp çalıştırdığımda aşağıdaki hata ile karşılaştım :

Sql Error Code = - 104
Token Unkown - line 1 , char 5 TERM

Acaba bu hatanın sebebi ne olabilir?

İyi Çalışmalar...
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Kod İle Stored Procedure Oluştururken Hata Alıyorum

Mesaj gönderen Lost Soul »

Query nesnesi ile yapmaya çalışıyorsanız onun yerine InterBase kullanıyorsanız TIBSCript, FIBPlus kullanıyorsanız TPFIBScript, zeos kullanıyorsanız zScript(yanlış hatırlamıyorasam) nesnelerini kulanarak bu işlemi yapmayı deneyiniz.
Kullanıcı avatarı
tsamim
Üye
Mesajlar: 76
Kayıt: 19 Ağu 2004 03:08
Konum: izmir

Re: Kod İle Stored Procedure Oluştururken Hata Alıyorum

Mesaj gönderen tsamim »

"Lost Soul" yardımların için çok teşekkür ederim.

TIBScript nesnesi ile çözüme ulaştım.

İyi Çalışmalar.

Kod: Tümünü seç

With IBScript1.Script do
    Begin
        Add('    ALTER PROCEDURE KAR_ZARAR2 ( ');
        Add('    ESRKT VARCHAR(10), ');
        Add('    EYL SMALLINT, ');
        Add('    ETRH1 DATE, ');
        Add('    ETRH2 DATE) ');
        Add('    RETURNS ( ');
        Add('    OSTK VARCHAR(15), ');
        Add('    OFLG VARCHAR(10), ');
        Add('    OTRH DATE, ');
        Add('    OFYT DOUBLE PRECISION, ');
        Add('    OMKTR DOUBLE PRECISION, ');
        Add('    OLNKKOD DOUBLE PRECISION, ');
        Add('    OBRM DOUBLE PRECISION, ');
        Add('    OSTKBRM INTEGER, ');
        Add('    ODKOD INTEGER) ');
        Add('    AS ');
        Add('        DECLARE VARIABLE BRM INTEGER; ');
        Add('        DECLARE VARIABLE EMKTR DOUBLE PRECISION; ');
        Add('        DECLARE VARIABLE BRMMKTR INTEGER; ');
        Add('        DECLARE VARIABLE FLG INTEGER; ');
        Add('        DECLARE VARIABLE ELNK DOUBLE PRECISION; ');
        Add('    begin ');
        Add('');
        Add('        for select stokkod,tarih,fiyat,miktar,birim,depo_kod ');
        Add('        from stkhar f1 where sirket_kodu = :esrkt and mali_yil = :eyl and ');
        Add('        tarih >= :etrh1 and tarih <= :etrh2 and flag = ''Ç'' and ((yer is null) or (yer = 8)) order by tarih into ');
        Add('        :ostk , :otrh , :ofyt , :omktr , :obrm , :odkod ');
        Add('        do ');
        Add('        begin ');
        Add('            oflg = ''S''; ');
        Add('            if (:obrm <> 0) then ');
        Add('            ostkbrm = 1; else ');
        Add('            ostkbrm = 2; ');
        Add('            olnkkod = 0; ');
        Add('            suspend; ');
        Add('        end ');
        Add('    end ');
    End;
    IBScript1.ExecuteScript;
Cevapla