Tablo karşılaştırma..

Oracle veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
Nick_
Üye
Mesajlar: 122
Kayıt: 01 Eki 2007 09:28
Konum: Konya

Tablo karşılaştırma..

Mesaj gönderen Nick_ »

S.a arkadaşlar
Fb dekı kayıtları oracle a aktarıyorum.takıldıgım yer ıse Fb dekı kayıt oracle a yok ıse kaydı o zaman gırecek. kayıt zaten oracle da var ıse gırmeyecek. karsılastırma olarak asagıdakı gıbı bı yapı kurdum ancak kayıt sayısı fazla olan tablolar cok uzun suruyor.

Kod: Tümünü seç

 
Query1.First; 
 while not Query1.Eof do// Fb dekı kayır ıcın
      begin
      ZQuery1.First;
            while not ZQuery1.Eof do // oracle dakı kayıtlar ıcın
             begin
                   Application.ProcessMessages;
               if trim(Query1.FieldByName('ID').AsString)=trim(ZQuery1.fieldbyname('ID').AsString) then
              begin
                .
                .
                .
Forumda kayıt karsılastırma- arama (Locate) olarak arama yaptım ancak ıstedıgım sonucu alamadım.. baska nasıl halledebılırım?
Bilmemek ayıp değil öğrenmek isteyene öğretmemek ayıp:)
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: Tablo karşılaştırma..

Mesaj gönderen Battosai »

Eğer ID alanı tekrarsız bir alan ise ki öyledir işte sana kolay yöntem....

-İlk önce oracle daki en büyük ID değerini bul select Max(ID) From Tablo
-Sonra MaxID gibi bir değişkene bu değeri ata...
-Sonra firbird deki tablonda şu sorguyu çalışıtır.Select * From Tablo where ID>MaxID
-Böylece firebird tablosunda oracle da olmayanlar gelir...Artık tek bir While döngüsü ile kayıtları insert edersin....Hız farkında farkedilir hani :twisted:
Kullanıcı avatarı
Nick_
Üye
Mesajlar: 122
Kayıt: 01 Eki 2007 09:28
Konum: Konya

Re: Tablo karşılaştırma..

Mesaj gönderen Nick_ »

hocam Id alanı unique degıl maalesef. yanı mecburen tum kayıtları dolasıp ID esıtmı degılmı kontrolu yapmam lazım:s

Kod: Tümünü seç

Query1.First;
    while not Query1.Eof do   // Fb dekı kayır ıcın
      begin
         ZQuery1.First;
            while not ZQuery1.Eof do  // oracle dakı kayır ıcın
             begin
                if trim(Query1.FieldByName('ID').AsString)=trim(ZQuery1.fieldbyname('ID').AsString) then
                   begin
                     FieldCTRL:=1;
                     break;// aynı kayıt varsa break
                  end
             else
                begin
                 FieldCTRL:=0;//kayıt yoksa 0
                end;
               Application.ProcessMessages;
               ZQuery1.Next;
             end;//while not ZQuery1.Eof do
       

     if FieldCTRL=0 then  // kayıt yoksa
        begin
          .
          .   //kayıt ekleme ıslemlerı
          .
Kayıt sayısı fazla olan tablolarda ılk baslarda arama ıslemı cok hızlı gıdıyor ancak Fb dekı yaklasık 10.000 kayıtı gectıkten sonra baya bı yavaslama oluyor
Bilmemek ayıp değil öğrenmek isteyene öğretmemek ayıp:)
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: Tablo karşılaştırma..

Mesaj gönderen Battosai »

ID alanı tekrarlı olmasının sebebi nedir acep...Database yapısını sen kurduysan bi hata var bu işte. Her tabloda bir tane Unique alan olmalıdır.ID unique değilse unique olan kayıt varsa ona göre yap işlemi yoksa Tablo yapını değiştir....
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Re: Tablo karşılaştırma..

Mesaj gönderen Hakan Can »

"FindKey" fonksiyonu sorunu çözebilir.

Diğer bir çözüm de FireBird tablosundaki her kaydı Oracle tablosuna "try except end" bloğu içinde atmaya çalışmak ve hata olursa zaten kayıt vardır diye hata mesajı verdirmeden devam etmek.
Kullanıcı avatarı
Nick_
Üye
Mesajlar: 122
Kayıt: 01 Eki 2007 09:28
Konum: Konya

Re: Tablo karşılaştırma..

Mesaj gönderen Nick_ »

Battosai yazdı:ID alanı tekrarlı olmasının sebebi nedir acep...Database yapısını sen kurduysan bi hata var bu işte. Her tabloda bir tane Unique alan olmalıdır.ID unique değilse unique olan kayıt varsa ona göre yap işlemi yoksa Tablo yapını değiştir....
Hocam Tablo cok eskıden olusturulmus bı tablo ıcınde bı suru kayıt var.benım yapmak ıstedıgım ıse Fb dekı aynı tablonun ıcındekı kayıtları oracle dakı tabloya kontrol ederek (kayıt varmı yokmu) atmak. bıraz karısık bı durum
Bilmemek ayıp değil öğrenmek isteyene öğretmemek ayıp:)
Kullanıcı avatarı
Nick_
Üye
Mesajlar: 122
Kayıt: 01 Eki 2007 09:28
Konum: Konya

Re: Tablo karşılaştırma..

Mesaj gönderen Nick_ »

Firebird den kaydı okuyup oracle a asagıdakı sql cumlesını gondererek hız problemını buyuk bı olcude astım. yardımlarınız ıcın tesekkurler..

Kod: Tümünü seç

Query1.First;
while not Query1.Eof do   // Fb dekı kayır ıcın
  begin
         ZQuery1.Sql.Text:='Select ID from ....... where ID='+Trim(Query1.Fieldbyname('ID').Asstring);
         ZQuery1.Open;
          if ZQuery1.RecordCount=0 then// kayıt yok ıse
              begin
               
                //Fb dekı kayıtın Oracle a ıslenmesı..
          
             end;// if ZQuery1.RecordCount=0 then
       Query1.Next;
  end://while not Query1.Eof do
Bilmemek ayıp değil öğrenmek isteyene öğretmemek ayıp:)
Cevapla