Veritabanından A çok sayıda veri almak, bu verilerle bazı manipülasyonlar yapmak ve sonra manipüle edilmiş veriyi veri tabanına eklemek için büyük bir işlem var. Yalnızca izinlerim var A veritabanında seçmek için
Manipülasyon ve ekleme bölümü, diğer veri kaynaklarından B veritabanına veri yüklemek için kullanılan ve zaten kullanımda olan tüm gerekli olan A veri tabanından gerekli verileri almak ve perl sınıflarını başlatmak için kullanmaktır.
Bunu yapmak için nasıl yapabilirim? Geri alma ve düzeltme veya ekleme yordamları sırasında herhangi bir hata oluşması durumunda hataların nerede olduğunu kolayca bulabilirim (veritabanı bağlantısı kesilmesi, geçersiz değerler nedeniyle sınıf başlatmayla ilgili sorunlar, sabit disk başarısızlık vb ...)? İşlemin tek seferde yapılması iyi bir seçenek gibi görünmemektedir, çünkü A veri tabanından elde edilen miktar verileri, veri manipülasyonu ve veri tabanına girmek için en az bir gün veya 2 alacağı anlamına gelmektedir.
A veri tabanındaki veriler Her biri 1000'er satır içeren her bir anahtarla benzersiz anahtarlar kullanarak yaklaşık 1000 gruba ayrılabilir. Yapabileceğimi düşündüğüm yollardan biri, grup başına taahhüt veren bir betik yazmaktır. Bu da, hangi grubun daha önce B veritabanına girildiğini izlemem gerekiyordu. Hangi grupların ilerlemesini izlemeyi düşünebilmemin tek yolu. işlenmiş ya da değil, bir günlük dosyasında ya da B veritabanında bir tabloda. Çalıştırılabileceğini düşündüğüm ikinci bir yöntem, bir düz dosyaya ekleme ve ekleme için sınıfları yüklemek için gereken tüm gerekli alanları dökmek, dosyayı başlatmak için okumaktır sınıfları ve B veritabanına eklemek. Bu aynı zamanda, bazı günlük işlemleri yapmak zorunda olduğum anlamına gelir, ancak herhangi bir hata oluşursa, düz dosyadaki tam satıra kadar daraltması gerekir. komut dosyası aşağıdaki gibi görünecektir: Herhangi bir hata oluşursa yoksa
use strict;
use warnings;
use DBI;
#connect to database A
my $dbh = DBI->connect('dbi:oracle:my_db', $user, $password, { RaiseError => 1, AutoCommit => 0 });
#statement to get data based on group unique key
my $sth = $dbh->prepare($my_sql);
my @groups; #I have a list of this already
open my $fh, '>>', 'my_logfile' or die "can't open logfile $!";
eval {
foreach my $g (@groups){
#subroutine to check if group has already been processed, either from log file or from database table
next if is_processed($g);
$sth->execute($g);
my $data = $sth->fetchall_arrayref;
#manipulate $data, then use it to load perl classes for insertion into database B
#.
#.
#.
}
print $fh "$g\n";
};
if ([email protected]){
$dbh->rollback;
die "something wrong...rollback";
}
Yani, sadece tekrar bu komut dosyasını çalıştırabilir ve işlenmiş olan gruplar veya satırları atlayarak devam etmelidir.
Her iki yöntem de aynı temada yalnızca varyasyonlardır ve her ikisi de ilerlememi (tablo veya dosya) izlediğim yere geri gitmeyi gerektirir, B veritabanına taahhüt edilenleri atlar ve kalan veriler.
Eminim bunu yapmanın daha iyi bir yolu var ama diğer çözümleri düşünmek için uğraşıyorum. Birinden veri alıp diğerine yerleştirme arasında veri manipülasyonu gerektiren veritabanları arasında büyük işlemlerin ele alınmasının başka bir yolu var mı? Perl sınıflarını veriyi manipüle etmek ve veritabanına eklemek için yeniden kullanabildiğim sürece sürecin Perl'de olması gerekmiyor.
teşekkürler, ben her ihtimale karşı herhangi bir alternatif Ben çok dar düşünüyordum olup olmadığını görmek istedim ve daha basit/bariz bir şey kaçırmış – 1stdayonthejob