Có hai cách tiếp cận. Bạn có thể chèn (?, ?, ?)
một số lần dựa trên kích thước của mảng. Thao tác văn bản sẽ giống như:
my $sql_values = join( ' ', ('(?, ?, ?)') x scalar(@array) );
Sau đó làm phẳng mảng để gọi execute()
. Tôi sẽ tránh theo cách này vì cần phải thực hiện thao tác chuỗi và mảng phức tạp.
Cách khác là bắt đầu một giao dịch, sau đó chạy một câu lệnh chèn nhiều lần.
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;
Cách này chậm hơn một chút so với phương pháp đầu tiên, nhưng nó vẫn tránh được việc phát lại câu lệnh. Nó cũng tránh các thao tác tinh vi của giải pháp đầu tiên, trong khi vẫn là nguyên tử và cho phép tối ưu hóa I / O của đĩa.