sp 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.
ercere
Üye
Mesajlar: 48
Kayıt: 23 Kas 2004 02:38
Konum: Ulus-BARTIN

sp procedure oluştururken hata

Mesaj gönderen ercere »

Merhaba
Benide aranıza aldığınız için teşekkürler.İb ile yeni tanışıyorum.Güzelliklerinden yararlanayım derken başta tökezledim.
(Bu arada forumda incelediğim kadarı ile sp ler ib/fb sql ile yaratılmış.
Ben ısrarla delphi içinde query'i ile yaratmak için uğraşıyorum.Doğru yada yanlış yaptığımı bilemiyorum ama bana tüm işi delphi ile yapmak daha mantıklı geliyor)

aşağıdaki birinci kodu yazdığım da problem yok sp oluşuyor.Ama ikinci kod da hata veriyor.

Kod: Tümünü seç

  ibquery1.SQL.Add('CREATE PROCEDURE "Ornek2"(');
    ibquery1.SQL.Add('GIREN INTEGER)') ;
    ibquery1.SQL.Add('RETURNS') ;
    ibquery1.SQL.Add('(NUM VARCHAR(15))') ;
    ibquery1.SQL.Add('AS BEGIN') ;
    ibquery1.SQL.Add('NUM=''123456'';') ;
    ibquery1.SQL.Add('END') ;

  
Bu sp procedure vb tabanına ekleniyor.

Kod: Tümünü seç

   ibquery1.SQL.Add('CREATE PROCEDURE "ornek1"(');
    ibquery1.SQL.Add('GIREN INTEGER)') ;
    ibquery1.SQL.Add('RETURNS') ;
    ibquery1.SQL.Add('(NUM VARCHAR(15))') ;
    ibquery1.SQL.Add('AS BEGIN') ;
    ibquery1.SQL.Add('SELECT * FROM "musteri" WHERE 
       MUSNO=":GIREN"') ;
    ibquery1.SQL.Add('NUM=MUSNO;') ;
    ibquery1.SQL.Add('end') ;


İşte burada hata oluşuyor num değişkenini tanımıyor

SQL Error code=-104
Token unknown -line 7 ,char-1
NUM'.process stopped.

hata mesajı veriyor.
Bilginin sınırı öğrenmenin yaşı yoktur.
selm@n
Kıdemli Üye
Mesajlar: 442
Kayıt: 01 Oca 2004 11:52
Konum: Adapazarı
İletişim:

Mesaj gönderen selm@n »

Hocam bu işlemler için Bir editör kullansanız mesela IB EXPERT gibi..
:wink:
;)
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7602
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

aramıza tekrar hoşgeldiniz. Biz de yeni arkadaşları aramızda görmekten son derece memnunuz.

Öncelikle soru sormadan önce :ara Arama yaparsanız, pek çok sorununuza hemen çözüm bulabilirsiniz ;)

Sorunuza gelnice, select cümlesi ile bir değişkene atama yapma olayında temel yapı şu şekilde.

select alan_adı from tablo_adı where şartlar into atanacak_değişken

sizin sorunuzda şu şekilde olmalı :

SELECT MUS_NO FROM musteri WHERE MUSNO=:GIREN into NUM

NOT : Bu arada zaten müşteri numarasını parametre olarak giriyorsunuz, tekrar böyle bir ifade garip olumş biraz???

Kolay gelsin.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

Hoşgeldin. Forum kuralları konusunda çok hassasız. Arama yapmadan soru sormıyalım, konu çok yakın bir zamanda geçti.

Kod: Tümünü seç

 MUSNO=":GIREN"
tırnaklar olmıyacak.

yav kardeşim bu ne hız yaw :P daha post ederken cevap yazılmış bile :P

kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
ercere
Üye
Mesajlar: 48
Kayıt: 23 Kas 2004 02:38
Konum: Ulus-BARTIN

Mesaj gönderen ercere »

İlginize Teşekkürler.
freeman35 arkadaşım eleştirmişsiniz.Ama forumda konu ile ilgili aramadığım köşe denemediğim kod kalmadı.Ne kadar makale ,ipucu ,kod varsa kağıda print edip inceledim.Tırnakları kullanmadığımda SQL sorgusunu text hale çevirince parametrenin yerinde ? işareti çıkıyor ve yine hata veriyor.

Mustafa Bey yolladığım kod örnek çalışma idi.Orada musno sembolik ona tekrar no atamak falan değil amacım.Ben şu anda procedurü yaratmak için uğraşıyorum.İlk kod oluşuyor fakat kayıt sorguladığım kod bir türlü çalışmıyor
İnto ekliyerek denemiştim.Dediğiniz gibi tekrar denedim maalesef olumsuz.


Selman Bey Ben veritabanını programın ilk kuruluşunda oluşmasını istiyorum.Yani exe çalıştırıldığında (ib mevcutsa) vt'nin kendiliğinden oluşmasını istediğim için delphi içinden yazıyorum.Çalışma yılı firma vs değiştirirkende program içinden geçiş yapabilirim düşüncesi ile bu yolu seçtim.

Çalışmayan kodumda bir eksiğim var ama ne olduğunu hala çözemedim.
Bilginin sınırı öğrenmenin yaşı yoktur.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

gordugum kadari ile Mustafa nin de soyledigi gibi into eksik gorunuyor...
ibquery1.SQL.Add('CREATE PROCEDURE "ornek1"(');
ibquery1.SQL.Add('GIREN INTEGER)') ;
ibquery1.SQL.Add('RETURNS') ;
ibquery1.SQL.Add('(NUM VARCHAR(15))') ;
ibquery1.SQL.Add('AS BEGIN') ;
ibquery1.SQL.Add('SELECT * FROM "musteri" WHERE
MUSNO=":GIREN"') ;
ibquery1.SQL.Add(' into NUM=MUSNO;') ;
ibquery1.SQL.Add('end') ;
Ayrica Freeman in dedigi gibi kirmizi tirnaklar da fazla diye dusunuyorum....
* 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ı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

MUSNO integer tipinde olduğunu sanıyorum, NUM varchar tipinde
Sp ler le hiç ilgilenmedim ama sanki Tür uyuşmazlığı var gibi :roll:

Kolay gelsin...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
selm@n
Kıdemli Üye
Mesajlar: 442
Kayıt: 01 Oca 2004 11:52
Konum: Adapazarı
İletişim:

Mesaj gönderen selm@n »

hııımm şimdi anladım :oops:
;)
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

S.A.
procedurelerin sonunda "SUSPEND" olması gerekmiyormu arkadaşlar.
aşağıdaki kodu bir incele bu direk procedurenin DDL i ama sana bi fikir verir.

Kod: Tümünü seç

CREATE PROCEDURE FATURALISTESI(
    IN_ID INTEGER) 
RETURNS (
    ID INTEGER,
    YIL SMALLINT,
    FATURANO INTEGER,
    FATURATURU SMALLINT,
    SIPARISID INTEGER,
    FATURATARIHI TIMESTAMP)
AS
BEGIN
  FOR SELECT F.ID, F.YIL, F.FATURANO, F.FATURATURU, F.SIPARISID, F.FATURATARIHI,
      FROM FATURALAR F
      WHERE F.ID=:IN_ID
      INTO :ID, :YIL, :FATURANO, :FATURATURU, :SIPARISID, :FATURATARIHI,
  DO
  BEGIN
    SUSPEND;
  END
END
Kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

özür dilerim ben eksik yazmışım
ercere yazdı:tüm işi delphi ile yapmak
bu konu yani script i delphi içinden oluşturma daha önce geçmişti.
Ayrıca detaylı yazarsan daha anlaşılır oluyor, Text e çevirince Parametreler ? oluyor ? text e nasıl neyle çevirmek ?? FB de "" kullanılmıyor, eğer string bir ifade yani değişken yerine sabit bir string kullanılacaksa tek tırnak kullanılmalı

Kod: Tümünü seç

SELECT * FROM musteri 
WHERE MUSNO=:GIREN
           NUM=MUSNO;/*Burası ne için */ 
NUM=MUSNO eğer 2. kriter ise başında AND olmalı ve MUSNO da değişkense :MUSNOolmalı

Kod: Tümünü seç

SELECT * FROM musteri 
WHERE MUSNO=:GIREN
    AND NUM=:MUSNO; 
eğer dışarıya çıkacak bir sonuç değeri ise

Kod: Tümünü seç

SELECT * FROM musteri 
WHERE MUSNO=:GIREN
INTO :MUSNO;
olmalı ve SUSPEND; eklenmeli

kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
AraGorN
Üye
Mesajlar: 28
Kayıt: 30 Eyl 2003 02:02
Konum: Bornova - İzmir
İletişim:

Mesaj gönderen AraGorN »

herşey iyi hoş da neden query ile yapmaya çalışıyorsun anlamadım query create kodlarında zaman zaman hatalar verebiliyor. hem daha fazla bellek tüketimine sebep oluyor. bence bu tür create işlemlerini, atomik update işlemlerini, yani sonuçta sana bi data dönmeyecek yada transaction bağımsız yapmak istediğin işlemleri IBSql componenti ile yapmak daha uygun olur. tabii olarak sadece ib ve fb için. Kolay gelsin..
ercere
Üye
Mesajlar: 48
Kayıt: 23 Kas 2004 02:38
Konum: Ulus-BARTIN

Mesaj gönderen ercere »

Önce Hepinize ilgilerinizden dolayı tşk.ederim.

freeman35 arkadaşım texte çevirmekten kastım ibquery 'nin script i nasıl oluşturduğunu görmek için ibquery1.text ile oluşturulan textdir.
Bu şekilde ibquery nin oluşturduğu scripte yazım hatası olup olmadığını
görebiliyorum.
olması gereken kod

Kod: Tümünü seç

SELECT * FROM musteri WHERE musNO=:GIREN INTO :cikan
  suspend 

bu burada hem fikiriz.Şimdi açıklamam tam olsun diye kodu şu şekilde yazıp run lıyorum

Kod: Tümünü seç

    ibquery1.SQL.Add('create procedure "ornek1"(');
    ibquery1.SQL.Add('giren integer)') ;
    ibquery1.SQL.Add('returns') ;
    ibquery1.SQL.Add('(cikan varchar(15))') ;
    ibquery1.SQL.Add('as  begin') ;
    ibquery1.SQL.Add('select musadi from "musteri" where  musno=":giren"') ;
    ibquery1.SQL.Add('into ":cikan";') ;
    ibquery1.SQL.Add('suspend') ;
    ibquery1.SQL.Add('end') ;
    showmessage(ibquery1.Text);
ibquery1.text'in verdiği sonuç da şöyle dönüyor.
  • create procedure "ornek1"(
    giren integer)
    returns
    (çikan varchar(15))
    as begin
    select musadi from "musteri" where musno=":giren"
    into ":cikan";
    suspend
    end
Görünüşte hata yok gibi ama aşağıdaki hata mesajını veriyor
  • SQL error code=-104
    Token unknown-line 9,char -1

    end'.process stopped...


Şimdide Fahrettin Beyin Vede Freeman35 Beyin dediği gibi " tırnakları kaldırıyorum.

Kod: Tümünü seç

  ibquery1.SQL.Add('select musadi from musteri where musno=:giren') ;
  ibquery1.SQL.Add('into :cikan;') ;
ibquery1.text'in verdiği sonuç şöyle

  • ...
    select musadi from musteri where musno=?
    into ?;

ve hata mesajıda böyle
  • SQL error code=-104
    Token unknown-line 7,char 4

    ?.process stopped...
Yine kodda seğişiklik yapıp

Kod: Tümünü seç

 ibquery1.SQL.Add('select musadi from "musteri" where musno=":giren"') ;
 ibquery1.SQL.Add('into ":cikan";') ;
 //ibquery1.SQL.Add('suspend') ;
yapıp suspend kaldırırsam.(tırnaklar var)

ibquery1.text'in verdiği sonuç da sadece 'suspend' eksik

ama yine hata
  • SQL error code=-206
    COLUMN unknown

    MUSNO'.process stopped...

Kod: Tümünü seç

  ibquery1.SQL.Add('select musadi from musteri where musno=":giren"') ;
  ibquery1.SQL.Add('into ":cikan";') ;
  //ibquery1.SQL.Add('suspend') ;
Şeklinde suspend yok vede "musteri" nin tırnaklarını kaldırırsam

ibquery1.text'in verdiği sonuç şöyle
  • ...
    select musadi from musteri where musno=":giren"
    ....

hata mesajı da
  • SQL error code=-204
    Table unknown
    MUSTERI'.process stopped.

şeklinde

Bir türlü çözemiyorum.Detaylı yazmaya çalıştım .Gözden kaçan bir şey varmı diye ama.
Bilginin sınırı öğrenmenin yaşı yoktur.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

him......

Evet tırnaklar kesin olarak kalkmalı fakat o zaman da

Kod: Tümünü seç

select musadi from musteri where musno=? 
into ?;
seklinde bir kod olusuyor. Zira ikinokta dan sonraki degiskeni bir parametre olarak kabul ettigi icin querynin execsql metodunu cagirinca bu sefer de o parametrelere deger ariyor....

Belki Tquery deki paramcheck i False yapmak bu durumu cozebilir....

Bir de genel yontem olarak oncelikle bu procedure'u IBExpert, SQLexplorer vs... gibi bir ortamda olusturan dogru kodu bulduktan sonra bunu Delphi icine tasimak lazim zira aksi taktirde hem delphi icine tasima problemleri hem de scripteki hatalra birbirine karisiyor ve problemi lokalize etmek mumkun olamiyor....
* 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ı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

SQL error code=-204
Table unknown
MUSTERI'.process stopped.
Bu ise MUSTERI isimli bir tablonun olmadigini soyluyor...

Dedigim gibi once bu SP yi olusturma isini harici bir araç içinde yapmayi başardiktan sonra bu işi Delphi icine tasimalisiniz...
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
ercere
Üye
Mesajlar: 48
Kayıt: 23 Kas 2004 02:38
Konum: Ulus-BARTIN

Mesaj gönderen ercere »

Evet haklısınız ben Birde İBConsole de aşağıdaki gibi denedim

Kod: Tümünü seç

CREATE PROCEDURE musteri(  giris INTEGER)
RETURNS (        cikis varchar(15))
AS
BEGIN
  FOR SELECT musadi
      FROM musteri 
      WHERE musno=:giris
      INTO :cikis;
  DO
  BEGIN
    SUSPEND;
  END
END
dönen hata mesajı

  • SQL error code=-104
    Unexpected end of command
    Statement :CREATE PROCEDURE musteri(
    giris INTEGER)
    RETURNS (
    cikis varchar(15))
    AS
    BEGIN
    FOR SELECT musadi
    FROM musteri
    WHERE musno=:giris
    INTO :cikis


Dikkat ederseniz INTO:cikis ; koymadan kodun kalan
kısmını hata mesajına eklemedi
Bu ayzdığım kodun kalıbı sizin makalenizde ,örnekleriniz de kullandığınız la ayni ozaman sorun nerede olabilir?
Bilginin sınırı öğrenmenin yaşı yoktur.
Cevapla