Есть два подхода. Вы можете вставить (?, ?, ?)
несколько раз в зависимости от размера массива. Работа с текстом будет выглядеть примерно так:
my $sql_values = join( ' ', ('(?, ?, ?)') x scalar(@array) );
Затем сгладьте массив для вызова execute()
. Я бы избежал этого из-за сложной обработки строк и массивов.
Другой способ - начать транзакцию, а затем выполнить один оператор вставки несколько раз.
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;
Это немного медленнее, чем в первом методе, но все же избегает повторного анализа оператора. Он также позволяет избежать тонких манипуляций с первым решением, но при этом остается атомарным и позволяет оптимизировать дисковый ввод-вывод.