PerlGtk.pl

  
Menu główne
use PerlMongers::Warszawa;
use PerlMongers::Krakow;
NG_gRadio
Perl a zasysanie danych - ciąg dalszy
  przez szycha (918 odsłon)
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";

}
Powrót
Szukaj w PerlGtk.pl
The Perl Job site
Szukaj kodu :