W poprzednim artykule poruszyłem temat ładowania danych do bazy SQL. Tym razem pokażę jak jednocześnie z kilku plików źródłowych można ładować bazę SQL.
Założenie jest takie. Mamy kilka tabel w standardzie Xbasei dane w nich zawarte powinny być przeniesione w jak najkrótszym czasie. Wykorzystamy do tego funkcję eval która jest dostępna w języku perl.
Funkcja ta opakuje nam procedurę zasysania, uruchomi ją i wykona zadanie niezależnie od działania innych części programu. Jednocześnie uruchomione zostaną trzy takie procedury. Jakie mamy korzyści. Po pierwsze szybkość – równoległe pobieranie danych. Po drugie jeśli w jednej tabeli są wadliwe dane to z innych informacje zostaną pobrane. Warto wypróbować poniższy przykład. Zachęcam do eksperymentów wszystkich programujących w języku perl.
#!/usr/bin/perl
use strict;
use XBase;
use DBI;
my %attr = (
PrintError => 0,
RaiseError => 1,
ib_date_format => '%Y-%m-%d',
ib_timestampformat => '%Y-%m-%d %H:%M',
);
my ($sciezka_xbase,$sciezka_IB_hurt,$uzytkownik,$haslo) = "";
$sciezka_xbase = q{dbi:XBase:/home/tabele};
$sciezka_IB_hurt = q{dbi:InterBase:db=/home/hurtownia/hurtownia.fdb};
$uzytkownik = q{xxxxxxx};
$haslo = q{xxxxxxx};
system("clear");
################## PROCEDURY WYKONAWCZE z funkcją EVAL#########################
eval {HT_PLIK1();};
print q{Wystąpił błąd: $@ } if $@;
eval {HT_PLIK2();};
print q{Wystąpił błąd: $@ } if $@;
eval {HT_PLIK3();};
print q{Wystąpił błąd: $@ } if $@;
###################### Koniec procedur ########################################
sub HT_PLIK1 {
print {*STDERR} q{---------------------------------------------},"\n";
print {*STDERR} q{Rozpoczynam wczytywanie danych do HT_PLIK1...},"\n";
print {*STDERR} q{---------------------------------------------},"\n";
my $dbh = DBI->connect($sciezka_xbase,\%attr)||
die "Nie moge otworzyc tabeli";
my $dbh1 = DBI->connect($sciezka_IB_hurt,$uzytkownik,$haslo,\%attr)||
die "Nie moge otworzyc tabeli";
my $command = qq {
SELECT INDEKS,KOD_TOW,ILE,JM,CENA_SRED
FROM PLIK1
;};
my $sth = $dbh->prepare($command);
$sth->execute();
while (my @line = $sth->fetchrow_array()){
$result = join "#", @line,"\n";
my ($INDEKS,$KOD_TOW,$ILE,$JM,$CENA_SRED) = split(/\#/,$result);
my $sql = "INSERT INTO HT_CEL1";
$sql.= "(INDEKS,KOD_TOW,ILE,JM,CENA_SRED)";
$sql.= "VALUES(?,?,?,?,?);";
my $sth1= $dbh1->prepare($sql);
$sth1->execute($INDEKS,$KOD_TOW,$ILE,$JM,$CENA_SRED);
}
$dbh->disconnect();
$dbh1->disconnect();
print {*STDERR} '#############################################',"\n";
print {*STDERR} 'Zakończyłem wczytywanie danych do HT_CEL1 ...',"\n";
print {*STDERR} '#############################################',"\n";
}
sub HT_PLIK2 {
print {*STDERR} q{---------------------------------------------},"\n";
print {*STDERR} 'Rozpoczynam wczytywanie danych do HT_PLIK2...' ,"\n";
print {*STDERR} q{---------------------------------------------},"\n";
my $dbh = DBI->connect($sciezka_xbase,\%attr)||
die "Nie moge otworzyc tabeli";
my $dbh1 = DBI->connect($sciezka_IB_hurt,$uzytkownik,$haslo,\%attr)||
die "Nie moge otworzyc tabeli";
my $command = qq {
SELECT INDEKS,KOD_TOW,ILE,JM,CENA_SRED
FROM PLIK2
;};
my $sth = $dbh->prepare($command);
$sth->execute();
while (my @line = $sth->fetchrow_array()){
$result = join "#", @line,"\n";
my ($INDEKS,$KOD_TOW,$ILE,$JM,$CENA_SRED) = split(/\#/,$result);
my $sql = "INSERT INTO HT_CEL2";
$sql.= "(INDEKS,KOD_TOW,ILE,JM,CENA_SRED)";
$sql.= "VALUES(?,?,?,?,?);";
my $sth1= $dbh1->prepare($sql);
$sth1->execute($INDEKS,$KOD_TOW,$ILE,$JM,$CENA_SRED);
}
$dbh->disconnect();
$dbh1->disconnect();
print {*STDERR} '#############################################',"\n";
print {*STDERR} 'Zakończyłem wczytywanie danych do HT_CEL2 ...',"\n";
print {*STDERR} '#############################################',"\n";
}
sub HT_PLIK3 {
print {*STDERR} q{---------------------------------------------},"\n";
print {*STDERR} 'Rozpoczynam wczytywanie danych do HT_PLIK3...' ,"\n";
print {*STDERR} q{---------------------------------------------},"\n";
my $dbh = DBI->connect($sciezka_xbase,\%attr)||
die "Nie moge otworzyc tabeli";
my $dbh1 = DBI->connect($sciezka_IB_hurt,$uzytkownik,$haslo,\%attr)||
die "Nie moge otworzyc tabeli";
my $command = qq {
SELECT INDEKS,KOD_TOW,ILE,JM,CENA_SRED
FROM PLIK3
;};
my $sth = $dbh->prepare($command);
$sth->execute();
while (my @line = $sth->fetchrow_array()){
$result = join "#", @line,"\n";
my ($INDEKS,$KOD_TOW,$ILE,$JM,$CENA_SRED) = split(/\#/,$result);
my $sql = "INSERT INTO HT_CEL3";
$sql.= "(INDEKS,KOD_TOW,ILE,JM,CENA_SRED)";
$sql.= "VALUES(?,?,?,?,?);";
my $sth1= $dbh1->prepare($sql);
$sth1->execute($INDEKS,$KOD_TOW,$ILE,$JM,$CENA_SRED);
}
$dbh->disconnect();
$dbh1->disconnect();
print {*STDERR} '#############################################',"\n";
print {*STDERR} 'Zakończyłem wczytywanie danych do HT_CEL3 ...',"\n";
print {*STDERR} '#############################################',"\n";
}
|