当我以这种方式获取数据时,是否可以访问列名和列类型,或者我是否需要显式prepare
才能达到此目的?
use DBI;
my $dbh = DBI->connect( ... );
my $select = "...";
my @arguments = ( ... );
my $ref = $dbh->selectall_arrayref( $select, {}, @arguments, );
更新
使用prepare
我会这样做:
my $sth = $dbh->prepare( $select );
$sth->execute( @arguments );
my $col_names = $sth->{NAME};
my $col_types = $sth->{TYPE};
my $ref = $sth->fetchall_arrayref;
unshift @$ref, $col_names;
答案 0 :(得分:3)
最好的解决方案是使用prepare
来获取语句句柄,正如您在问题的第二部分中所描述的那样。如果您使用selectall_hashref
或selectall_arrayref
,则不会获得语句句柄,并且必须通过$dbh->column_info
(docs)自行查询列类型信息:
my $sth = $dbh->column_info('','',$table,$column); # or $column='' for all
my $info = $sth->fetchall_arrayref({});
use Data::Dumper; print Dumper($info);
(具体来说,是COLUMN_NAME和TYPE_NAME属性)。
但是,如果表更改了两个查询之间的模式,则会引入竞争条件。
答案 1 :(得分:1)
此外,您可以使用selectall_arrayref
和Slice
参数将所有列提取到散列引用中,它不需要预准备语句并返回结果集行的数组引用,每个rows将键列为哈希值,值为列值。即:
my $result = $dbh->selectall_arrayref( qq{
SELECT * FROM table WHERE condition = value
}, { Slice => {} }) or die "Error: ".$dbh->errstr;
$result = [
[0] = { column1 => 'column1Value', column2 => 'column2Value', etc...},
[1] = { column1 => 'column1Value', column2 => 'column2Value', etc...},
];
轻松迭代结果..即:
for my $row ( @$results ){
print "$row->{column1Value}, $row->{column2Value}\n";
}
您还可以指定要提取的列,但由于在SQL查询语法中执行此操作会更有效,因此它无用。
{ Slice => { column1Name => 1, column2Name => 1 } }
这只会返回column1Name和column2Name的值,就像在SQL中说的那样:
SELECT column1Name, column2Name FROM table...