2

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

2 回答 2

3

prepare正如您在问题的第二部分中描述的那样,最好的解决方案是使用获取语句句柄。如果使用selectall_hashrefor selectall_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 属性)。

但是,如果表在两个查询之间更改架构,这会引入竞争条件。

于 2012-10-13T12:56:35.400 回答
3

此外,您可以使用selectall_arrayref参数Slice将所有列提取到哈希引用中,它不需要准备好的语句,并且将返回结果集行的数组引用,每行列是哈希的键,值是列价值观。IE:

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...
于 2016-11-21T23:13:29.550 回答