FireBird'de insert ettiğim kaydın id'sini nasıl alırı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.
Kullanıcı avatarı
hdayi
Kıdemli Üye
Mesajlar: 1284
Kayıt: 29 Oca 2004 01:53
Konum: Erciyes'in eteklerinden.

FireBird'de insert ettiğim kaydın id'sini nasıl alırım?

Mesaj gönderen hdayi »

Merhaba,
Bu soruyu buraya mı yoksa programlamaya mı yazacağıma bir türlü karar vermedim.
FireBird'de bir stored procedure ile bir kayıt ekliyorum ancak bu kaydın id'sini nasıl geri elde edebilirim? Query ile mi? Yoksa bir output parameter ekleyerek mi? Cevap output parameter ise bu paramtreye sp içinde nasıl değer atayabilirim ve bunu delphi de nasıl kullanabilirim?

dbexpress tabındaki TSQLConnection ve TSqlStoredProc'u kullanıyorum? (bunlar da doğru component mi emin değilim :) )

Kullandığım stored procedure şu:

Kod: Tümünü seç

CREATE PROCEDURE SP_INS_ARIZA (V_USER_ID Integer,
     V_BASLIK  Varchar(30),
     V_TARIH   Date)
AS 

begin 
    insert into tbl_ariza (user_id, baslik, tarih) values (:v_user_id, :v_baslik, :v_tarih);
end 
Teşekkürler...
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Resim
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

merhaba ,
bildiğimiz gibi Firebird de autoincrement alan olayı yok, bu gibi ihtiyaçlarda GENERATOR adı verilen numara üreteçlerini kullanıyoruz, dolayısıyla sen INSERT procedure ' nde id alanına önce bu generator un ürettiği numarayı atayacaksın hazır numarayı elde etmişken bir çıkış parametresinede bunu gönderirsin,
dephiden erişim için bence TIBStoreProc nesnesini kullan , gönderdiğin çıkış paametresinide örneğin

Kod: Tümünü seç

UretilenIDNumarasi:=IbStoredProc.ParamByName('UretilenID').AsCurrency
şeklinde basitçe alabilirsin,
kolay gelsin.
Volkan KAMADAN
www.polisoft.com.tr
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

insert into tbl_ariza (user_id, baslik, tarih) values (:v_user_id, :v_baslik, :v_tarih);

Bu dizilimde user_id trigger ile generator'u arttırarak yazılıyorsa şöyle yapabilirsin.

Öncelikle trigger ile generator'u almayacaksın. Bu işi SP'de yapacaksın

yani:

USER_ID = GEN_ID(GEN_USER_ID, 1);

ile generator'den user_id'yi alacaksın. Daha sonra Insert ile ekleyeceksin. Böylece elinde, aldığın ID kalacak. Dönüş değerinde suspend; yaparak bu id değerine ulaşacaksın.
Kullanıcı avatarı
hdayi
Kıdemli Üye
Mesajlar: 1284
Kayıt: 29 Oca 2004 01:53
Konum: Erciyes'in eteklerinden.

Mesaj gönderen hdayi »

bir dönüş değeri tanımladım ancak bu dönüş değerine id'yi atayamıyorum :(
Nasıl yapacağım ki?

Kod: Tümünü seç

CREATE PROCEDURE SP_INS_ARIZA (V_USER_ID Integer,
     V_BASLIK  Varchar(30),
     V_TARIH   Date)
returns (v_id Integer)
AS 

begin 
    insert into tbl_ariza (id, user_id, baslik, tarih) values (GEN_ID(gen_ariza,1), :v_user_id, :v_baslik, :v_tarih);
end 
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Resim
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

V_id = GEN_ID(....

INSERT .... (V_ID, ......)

suspend;

yapabilirsin.
Kullanıcı avatarı
hdayi
Kıdemli Üye
Mesajlar: 1284
Kayıt: 29 Oca 2004 01:53
Konum: Erciyes'in eteklerinden.

Mesaj gönderen hdayi »

Şöyle yaptım doğru mudur?

Kod: Tümünü seç

CREATE PROCEDURE SP_INS_ARIZA (V_USER_ID Integer,
     V_BASLIK  Varchar(30),
     V_TARIH   Date)
returns (V_ID Integer)
AS 

begin 
    insert into tbl_ariza (id, user_id, baslik, tarih) values (GEN_ID(gen_ariza,1), :v_user_id, :v_baslik, :v_tarih);
    select id from tbl_ariza where user_id=:v_user_id and baslik=:v_baslik and tarih=:v_tarih into :v_id;

end 
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Resim
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Select'e gerek yok.

Bak ilk önce V_ID dönüş değerine GEN_ID'den aldığın değeri koy. Daha sonra insert'ini V_ID'yi kullanarak yap. INSERT'ten sonra suspend yaptığında V_ID'ye atanan GEN_ID değerini alabileceksin zaten.

Kod: Tümünü seç

  V_ID = GEN_ID(GEN_BILMEMNE, 1);
  INSERT INTO HEBE (ID, ZID, BID) VALUES (:V_ID, 'VID', 'RID');
  SUSPEND;
gibi.
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

@hdayi ya inanmıcaksınız, aynı işlevi yapan bi sp bende şimdi hazırlıyordum ve düşünüyordun nasıl yapıcam ben bunu diye :D tesadüfün böylesi :)

(alarm tutan bi tablo için, geri dönen id de başka bi tabloda saklanıyor :lol: )

@coderlord teşekkürler. :bravo: :elsalla:

ya artık soru sormadan cevap alır oldum ya :D maşallah forumcak erdik haerhalde :wink:
.-.-.-.-.-.-.-. ^_^
onaydin

Mesaj gönderen onaydin »

Sonuç dönüyorsa doğrudur :) .
Birbirine yakın iki farklı yöntem, direkt gen_id ye erişiyoruz.
viewtopic.php?t=5520&highlight=genid+rdb+database
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Buradaki amaç generator'un ne olduğunu sorgulamak değil, insert ettiğimiz kaydın id'sini öğrenebilmek. Çok kullanıcılı bir ortamda "generator'un son değeri benim son insert ettiğim kaydın id'sidir" diyemezsiniz.
onaydin

Mesaj gönderen onaydin »

evet hocam çaktık davayı hatta geriyo doğru mesajı siliyodum ama
boş durmamış o arada da cevap yazmışssın. Silcektim ben her ikisini de.
Kullanıcı avatarı
hdayi
Kıdemli Üye
Mesajlar: 1284
Kayıt: 29 Oca 2004 01:53
Konum: Erciyes'in eteklerinden.

Mesaj gönderen hdayi »

Herkese teşekkür ederim.
Şöyle yaptım şimdi de, @coderlord'un dediği gibi

Kod: Tümünü seç

CREATE PROCEDURE SP_INS_ARIZA (V_USER_ID Integer,
     V_BASLIK  Varchar(30),
     V_TARIH   Date)
returns (V_ID Integer)
AS 

begin 
    v_id=GEN_ID(gen_ariza,1);
    insert into tbl_ariza (id, user_id, baslik, tarih) values (:v_id, :v_user_id, :v_baslik, :v_tarih);
    suspend;


end 
@mege sayemde yazdın sp'yi programın yarısı benim artık bilmem ne yapacağız :P
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Resim
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,

TIBQuery'nin GeneratorField Özelliği olması lazım. Bu özellik ile siz Generator'den istediğiniz değeri online (On New Record, On Post, On Server) gibi seçeneklerden birini kullanarak istediğiniz anda ID değer,ini çekebilirsiniz.

SP'den de kurtarır sizi bu diye tahmin ediyorum. Generator Field özelliğini inceleyin muhtemelen işinizi görecektir.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
abdulkadir
Kıdemli Üye
Mesajlar: 489
Kayıt: 13 Eyl 2003 09:10
Konum: istanbul
İletişim:

Mesaj gönderen abdulkadir »

S.A
Degişiklik olsun

Eyer sadece kaydı ilk eklerken almak istersen
buda olabir kaydı ekledikten sonra

Kod: Tümünü seç

Select Max(ID) From TABLO_ADI
Kullanıcı avatarı
hdayi
Kıdemli Üye
Mesajlar: 1284
Kayıt: 29 Oca 2004 01:53
Konum: Erciyes'in eteklerinden.

Mesaj gönderen hdayi »

Abdulkadir çok kullanıcılı ortamda senin yol problem oluşturabilir. Sen kaydı girdikten sonra onu olana kadar yeni bir daha kayıt girebilir.

Kolay Gelsin....
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Resim
Cevapla