Det finns två tillvägagångssätt. Du kan infoga (?, ?, ?)
ett antal gånger baserat på storleken på arrayen. Textmanipulationen skulle vara något i stil med:
my $sql_values = join( ' ', ('(?, ?, ?)') x scalar(@array) );
Platta sedan ut arrayen för att anropa execute()
. Jag skulle undvika det här på grund av den taggiga sträng- och arraymanipulation som måste göras.
Det andra sättet är att påbörja en transaktion och sedan köra en enkel infogningssats flera gånger.
my $sql = 'INSERT INTO tbl (col1, col2, col3)';
$dbh->{AutoCommit} = 0;
my $sth = $dbh->prepare_cached( $sql );
$sth->execute( @$_ ) for @array;
$sth->finish;
$dbh->{AutoCommit} = 1;
Detta är lite långsammare än den första metoden, men det undviker ändå att reparera påståendet. Den undviker också de subtila manipulationerna av den första lösningen, samtidigt som den fortfarande är atomär och tillåter disk I/O att optimeras.