On Wed, 2004-01-07 at 12:37, [EMAIL PROTECTED] wrote:

> The following block was identified by the error message:
> 
> foreach my $exp_id (values %experiments) {
>    eval {
>       my $q_delete_old_data = qq{DELETE DATA_TM
>                                   WHERE EXP_ID = $exp_id};
>       my $sth_delete_old_data = $dbh->prepare_cached($q_delete_old_data);
>       $sth_delete_old_data->execute();
>       $sth_delete_old_data->finish();
>       undef $sth_delete_old_data;
>    };
> }

(taking this back on-list, as there are some common DBI mistakes here)

Try this instead:

my $q_delete_old_data = q{ DELETE DATA_TM WHERE EXP_ID = ? };
my $sth_delete_old_data = $dbh->prepare($q_delete_old_data);
foreach my $exp_id (values %experiments) {
   eval {
      $sth_delete_old_data->execute($exp_id);
   };
}

This code uses the placeholder functionality of DBI to let you prepare
the statement once, and then bind in different values each time you
execute it.

Your code was preparing a new statement for each value from
%experiments, which is very inefficient compared to using placeholders. 
In addition, since you used prepare_cached, each of those prepared
statements was cached permanently.  Each prepared statement eats up a
cursor!  And one minor point: the eval is not necessary unless you want
to trap DBI errors when executing the statement, and even then, setting
$dbh->{RaiseError} = 0 might be a better option.

So, in summary:

1) Use placeholders whenever possible to represent changing data
2) Don't use prepare_cached unless you're sure you need it
3) Make errors non-fatal with $dbh->{RaiseError} = 0


 -- Jeremy

_______________________________________________
Boston-pm mailing list
[EMAIL PROTECTED]
http://mail.pm.org/mailman/listinfo/boston-pm

Reply via email to