在DBI 文档中,这是多次执行查询的推荐代码:
$sth = $dbh->prepare_cached($statement);
$sth->execute(@bind);
$data = $sth->fetchall_arrayref(@attrs);
$sth->finish;
但是,我看到许多*查询方法允许传递准备好的和缓存的语句句柄来代替查询字符串,这使得这成为可能:
$sth = $dbh->prepare_cached($statement);
$data = $dbh->selectall_arrayref($sth, \%attrs, @bind);
这种方法有什么问题吗?我还没有看到它在野外使用过。
FWIW,我已经对这两个实现进行了基准测试。fetchall_arrayref
当在第一个实现中查询两个连续的行时,第二种方法看起来稍微快一些(4%),而不是在selectall_arrayref
第二个实现中。
* 支持此功能的查询方法的完整列表是:
- selectrow_arrayref - 准备好的语句的正常方法是 fetchrow_arrayref
- selectrow_hashref - " " fetchrow_hashref
- selectall_arrayref - " " fetchall_arrayref
- selectall_hashref - " " fetchall_hashref
- selectcol_arrayref (实际上不算数,因为它没有使用上述第一个代码路径的并行方法 - 所以使用这种方法的准备好的语句的唯一方法是使用上面的第二个代码路径)