DBI:selectall_arrayref和columnnames

时间:2012-10-13 08:46:44

标签: perl dbi

当我以这种方式获取数据时,是否可以访问列名和列类型,或者我是否需要显式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;

2 个答案:

答案 0 :(得分:3)

最好的解决方案是使用prepare来获取语句句柄,正如您在问题的第二部分中所描述的那样。如果您使用selectall_hashrefselectall_arrayref,则不会获得语句句柄,并且必须通过$dbh->column_infodocs)自行查询列类型信息:

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_arrayrefSlice参数将所有列提取到散列引用中,它不需要预准备语句并返回结果集行的数组引用,每个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...