Hello all,

I'm just new to DBI, it's my first working DBI script so please don't laugh too hard 
at me. The script below works fine (AFAIK) but is slow - inserting 100000 records into 
the table takes ~1 hour 20 minutes. I think that's because I placed $sth = 
$dbh->prepare in the while loop inside the for block. I tried to place it outside the 
for block but some data was missing and some wasn't correct.  How can I improve my 
script? How can I speed it up? Any advice, any comment and any information are greatly 
appreciated.
TIA
Greg

Here goes my script:

#########################
#!perl

use strict;
#use Date::Format;
use DBI;
use diagnostics;

my $dir = "G:\\apps\\quickedi\\ib";
my $recv_file = "padrecv.1";
my $elite_file = "item_upc.txt";

print "Poczekaj chwile..............\n";
open(ITEMUPC, "> $dir/$elite_file ")            || die "can't create $dir/$elite_file: 
$!";

my %upc_itemlist;
my %item_upclist;
my ($upc_num,$item_num);

my $DSN = "Elite";

my $dbh1 = DBI->connect ("dbi:ODBC:$DSN", "rpt_user", "",
{RaiseError => 1, AutoCommit => 0});

my $SQL = $dbh1->prepare("select upc, item_num from item where org_code = '01' and 
item_num = report_item_num and memo_1 <> 'TITLE' and upc is not null and upc <> 'NONE' 
order by upc");
$SQL->execute;
while ( my @row = $SQL->fetchrow_array) {
        my($upc_num,$item,$price) = @row;
        ($upc_num = $upc_num) =~ 
s/^(\d)\s(\d{5})\s(\d{5})\s(\d)|^(\d)(\d{5})(\d{5})(\d)\s{3}/$1$2$3$4/;
        ($item =$item) =~ s/\s+$//;
        print ITEMUPC "$upc_num,$item\n";
}

$dbh1->disconnect;
close ITEMUPC;

open(CHECK, "< $dir/$elite_file");

while (<CHECK>) {
chomp;

        ($upc_num, $item_num) = split /\s*,\s*/;
        $upc_itemlist{$upc_num} = $item_num;

}

close CHECK;

my $dbh = DBI->connect( "dbi:ODBC:EDI Data", "", "" )or die "Can't connect to ODBC 
database: $DBI::errstr\n";
open(RECV, "< $dir/$recv_file")         || die "can't open $recv_file: $_!";

my @names = 
qq(customer,upc_num,item_num,store_num,activity,quantity,beginning_date,ending_date);
my ($count,$customer,$pad_num,$upc,$xq02,$xq03,$za01);

while (<RECV>) {
no warnings 'uninitialized';
                s/QA/Current Inventory/;
                s/QS/Net Quantity Sold/;
                s/.$//; 

chomp;
 my @fields = split /\</;
 
        if (/^ISA<00<          <00<          <12<2017781300/) {
                $customer = "LNT";
        } elsif (/^GS<PD<2017781300/) {
                #ignore
        } elsif (/^ST<852/) {
                $pad_num = $fields[2];
        } elsif (/^XQ/) {
                my @fields = split /\</;
                ($xq02 = $fields[2]) =~ s/(\d{4})(\d{2})(\d{2})/$2\/$3\/$1/; #Begining 
Date Range
                ($xq03 = $fields[3]) =~ s/(\d{4})(\d{2})(\d{2})/$2\/$3\/$1/; #Ending 
Date Range
        } elsif (/^N9/) {
                #ignore
        } elsif (/^LIN/) {
                $upc = $fields[3];      #UPC number
        } elsif (/^ZA/) {
                $za01 = $fields[1]; #QA = Current Inventory Qty, QS = Net Qty Sold
        } elsif (/^SDQ/) {
                $upc_itemlist{$upc} = "NO_ELITE_ITEM_NUM_FOR_LNT_UPC" if 
length($upc_itemlist{$upc}) == 0;
                my @sdq = split/\</;
                for (my $i=3;$i<=21;$i+=2) {
                        if (defined $pad_num) { # because other transactions also have 
a SDQ lines
                        if (defined $sdq[$i]) { # some SDQ lines have less then 22 
fields
                        $count++;
                        my $sth = $dbh->prepare("INSERT INTO edi_pad (@names) VALUES 
('$customer','$upc','$upc_itemlist{$upc}','$sdq[$i]','$za01','$sdq[$i+1]','$xq02','$xq03')");
              
                                print  "Processing 
$count:\t$pad_num,$upc,$sdq[$i],$sdq[$i+1]\n";
                                $sth->execute or die "can't execute SQL statement: 
$DBI::errstr\n";

                                } else {
                                        #ignore
                                }
                                } else {
                                        #ignore
                                }
        }

        } elsif (/^CTT/) {
                #ignore
        } elsif (/^SE/) {
                #ignore
        } elsif (/^GE/) {
                #ignore
        } elsif (/^IEA/) {
                next unless (/^GS<PD<2017781300/);
        } else {
                print "Unrecognized: ", substr ($_, 0, 10), "\n";
        }
}
close RECV;
$dbh->disconnect;

#######################

and the part of the input file:

ISA<00<          <00<          <12<2017781300     <12<7084061572     
<010611<0537<U<00401<000000588<0<P<: 
GS<PD<2017781300<7084061572<20010611<0537<588<X<004010VICS 
ST<852<5880001 
XQ<H<20010603<20010609 
N9<IA<1982 
LIN<<UP<009281020035 
ZA<QA 
SDQ<EA<92<129<5<183<25<187<9<191<9<194<7<206<6<288<16<302<9<305<4<320<30 
SDQ<EA<92<329<5<338<6<342<6<346<7<347<8<348<7<350<5<351<5<354<17<355<6 
SDQ<EA<92<358<8<359<7<360<8<362<14<363<8<364<7<365<12<367<11<368<3<369<5 
SDQ<EA<92<370<7<371<6<372<6<373<11<374<9<375<17<376<10<377<7<378<-2<379<6 
ZA<QS 
SDQ<EA<92<129<2<187<1<206<1<371<1<387<1<391<1<398<1<400<1<403<1<425<1 
SDQ<EA<92<429<1<440<2<441<2<442<1<444<1<446<1<454<1<463<2<470<1<476<1 
SDQ<EA<92<478<2<479<1<480<1<483<1<487<1<494<1<498<1<505<1<512<2<514<1 
SDQ<EA<92<525<1<528<1<534<1<541<2<549<1<552<1<554<1<562<1<575<1<585<1 
SDQ<EA<92<593<1<598<1<616<1<620<2<625<1<627<1<633<2 
LIN<<UP<009281021315 
ZA<QA 
SDQ<EA<92<305<31<320<-3<338<2<346<31<348<95<354<31<355<-2<360<37<373<102<374<9 
SDQ<EA<92<377<77<379<-6<381<49<382<2<386<54<390<89<392<84<399<7<402<-5<405<6 
SDQ<EA<92<409<74<421<90<425<-1<431<2<437<-3<441<59<462<210<468<18<480<9<494<1 
SDQ<EA<92<495<17<502<-1<515<82<523<1<526<-1<527<101<536<9<552<92<555<2<564<-1 
SDQ<EA<92<574<58<581<109<586<12<601<16<609<2<616<30<632<1<646<5<654<-2<673<4 
ZA<QS 
SDQ<EA<92<346<1<360<1<381<1<399<1<436<1<437<1<495<1<515<2<564<1<574<1 
CTT<698 
SE<8943<5880001 
GE<1<588 
IEA<1<000000588 


Reply via email to