firebird veri aktarı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.
Cevapla
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

firebird veri aktarımı

Mesaj gönderen esistem »

Selam;
Programda devir işlemi yapıyorum, yeni çalışma yılına eski verileri aktarmam gerekiyor, 11.415 adet kaydı aktarıyorum. Aktarımı while not eof ile döngüye sokarak stored procedure ile yapıyorum. Tabloda KOD, UYEKODU, TARIH, MAKBUZNO, BORC, ALACAK, ACIKLAMA şeklinde 7 alan var. Aktarım (döngü) bittikten sonrada commitretaining yapıyorum. Fakat döngü bazen 5000, bazende 10.000 gibi rakamlara ulaştığında aşağıdaki hatayı veriyor ve işlemi yarıda kesiyor. Sanırım firebird server ile alakalı bir durum.

Dynamic SQL error
SQL Error Code : -502
Invalid cursor declaration
Statement already has a cursor 14888517 (burdaki rakam değişiyor sürekli) assigned.

şeklinde hata veriyor, acaba sebebi nedir?
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: firebird veri aktarımı

Mesaj gönderen Kuri_YJ »

Selamlar,

SPnin kodunu gönderir misin.

Bir de öyle bakalım.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: firebird veri aktarımı

Mesaj gönderen esistem »

Kuri_YJ merhaba;
Sorunu şöyle hallettim;
Dediğim gibi kodu devir işlemleri için kullanıyordum, yeni çalışma yılına bütün üyeleri ve hareketleri döngü ile aktarıyordum fakat kayıt sayısı çoğalınca önce yazdığım hatayı vermeye başladı, bende vt yi yedek alıp, yeni vt adında kaydedip, devirde olmaması gereken kayıtları silerek devrediyorum sorunsuz ve çok hızlı çalışan bir şekilde olayı çözdüm.

Önceki hataya gelince, yaptığım araştırmalarda şu cursor olayının bu soruna sebep olduğunu okudum. Döngü çok fazla cursor oluşturuyordu sanırım fakat detaylı olarak neyin böyle bir hataya sebep olduğunu çözemedim. SQL sorgusuna gelince kısaca aşağıda yazacağım şekilde bir döngü idi.

Tablolarım ; UYE , GELIR, GIDER, UYE_HESAP (11475 kayıt bu tabloda idi) vs.vs.

Kod: Tümünü seç

QueryUYE : SELECT * FROM UYE (45 alanlı tablo)
QueryUYE.First;
WHILE NOT QueryUYE.EOF DO BEGIN
SP_UYE(UYE Kayıtları); // Stored Procedure ile yeni veritabanına uyeleri kaydet
QueryUYE_HESAP : SELECT * FROM UYE_HESAP WHERE uye_id=QueryUYEid.AsInteger (Döngüdeki üye nin hesap hareketlerini getir.)
QueryUYE_HESAP.First;
WHILE NOT QueryUYE_HESAP.EOF DO BEGIN
SP_UYE_HESAP(UYE_HESAP Kayıtları); // Stored Procedure ile yeni veritabanına uye hesaplarını aktar
QueryUYE_HESAP.Next;
END;
QueryUYE.Next;
END;
TRANS.CommitRetaining;
Projede 2 Ayrı DATA bağlantısı ile 2 ayrı veritabanına ulaşıp, eski vt den yeni vt ye bilgileri aktarıyordum.
İşlemi direk sp ye yaptırmıyorum yani.
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: firebird veri aktarımı

Mesaj gönderen ikra »

bir degisken olusturup döngünün icerisinde degiskenin degerini artiriniz.
degiskenin degeri 100'e ulastiginda commitretaining yapip degiskeni tekrar sifirlayiniz.
döngüden cikista tekrar commitretaining yapiniz.

Kod: Tümünü seç

procedure
begin
  I := 0;
  while not query.eof do
  begin
    islem;
    Inc(I)
    if I = 100 then
    begin
       Trans.Commitretaining; 
       I := 0;
   end;
    query.next;
  end;
  Trans.Commitretaining;
end;
Kolay gelsin.
kıdemsiz üye
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: firebird veri aktarımı

Mesaj gönderen esistem »

ikra yazdı:bir degisken olusturup döngünün icerisinde degiskenin degerini artiriniz.
degiskenin degeri 100'e ulastiginda commitretaining yapip degiskeni tekrar sifirlayiniz.
döngüden cikista tekrar commitretaining yapiniz.

Kod: Tümünü seç

procedure
begin
  I := 0;
  while not query.eof do
  begin
    islem;
    Inc(I)
    if I = 100 then
    begin
       Trans.Commitretaining; 
       I := 0;
   end;
    query.next;
  end;
  Trans.Commitretaining;
end;
Kolay gelsin.
Selam, her 100 döngüde değilde, her 500, 1000, 1500 döngüde bir denedim yine aynı hatayı verdi, sonuna kadar hiç gitmedi.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: firebird veri aktarımı

Mesaj gönderen freeman35 »

Ben tabloları tek tek aktarmayı herzaman tercih ederim, yani önce üye bilgileri kaydeder ardından hesaplarını kaydederim. Ayrıca bu iş için sp kullanmak yerine delphi tarafında yapardım, kontrol etmesi daha kolay, table yada field değişikliklerinde db güncellemek sıkıntı olabilir. ayrıca
"if I mod 100 = 0 then " daha kısa, hatta 100 yerine değişken koyarak parametrik olarakta kullanabilirsiniz.
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 !!!
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: firebird veri aktarımı

Mesaj gönderen Kuri_YJ »

Selamlar,

Bu tür durumlarda, CommitRetaining yerine Commit Edip Transaction'ı tekrar active hale getirirseniz manyak hızda devam eder. Bir arkadaşın yaptığı programı burada düzeltmiştik, CommitRetaining git gide yavaşlıyordu ama Commit edince Hiç Hız Kaybı Yaşamadan verileri transfer ediyordu.

Bilginiz olsun,

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Cevapla