2

我记得 DBI 方法有问题selectrow_array。当我不够整洁时,我从中得到的不是我问的列的值,而是列数(或不需要的东西,我记不清了)。现在我尝试重构一些代码,并且我想确保在每个可能的地方,我只得到预期值。所以我尽量避免意外并找出不良行为是什么。从 DBI 文档中,我读到这可能确实是有问题的情况:

如果在标量上下文中为具有多于一列的语句句柄调用,则未定义驱动程序将返回第一列的值还是最后一列的值。所以不要那样做。此外,在标量上下文中,如果没有更多行或发生错误,则返回“undef”。无法将“undef”与返回的“undef”区分开来,因为第一个字段值为 NULL。由于这些原因,如果您在标量上下文中使用“selectrow_array”,或者干脆不这样做,您应该谨慎行事。

我仍然不能强制selectrow_array返回除了值之外的任何东西col1(这就是我所期望的)

my $query = 'SELECT col1, col2, col3 FROM table WHERE id = 112233';

my ( $c ) = ( $dbh->selectrow_array( $query ) );
my $x = ask_from_db();
my $y = $dbh->selectrow_array( $query );
my $z = ( $dbh->selectrow_array( $query ) );
my @A = $dbh->selectrow_array( $query );

say "C: $c"; # C: col1
say "X: $x"; # X: col1
say "Y: $y"; # Y: col1
say "Z: $z"; # Z: col1
say "A: @A"; # A: col1 col2 col3

sub ask_from_db {
  return $dbh->selectrow_array( $query );
}

我在上面问的每一种方式,都给了我很好的结果。我应该如何运行查询以获得错误的结果?

结果错误!=col1

4

2 回答 2

3

文档中的“未定义驱动程序将返回第一列还是最后一列的值”的意思是返回的列是由数据库驱动程序定义的,而不是DBI.

所以 Postgres 驱动程序可能决定总是返回第一列,而 mysql 驱动程序可能总是返回最后一列,或者返回的列可能取决于查询。

所以不要调用selectrow_array是标量上下文 - 总是在列表上下文中调用它:

my @row = $sth->selectrow_array($query)

并且您将避免文档中提到的所有问题。

于 2012-11-23T15:28:03.697 回答
3

结果的差异将基于驱动程序的实施。

wantarray ? @row : $row[0]

对比

wantarray ? @row : $row[-1]

您会使用不同的驱动程序来获得不同的结果。也就是说,我想你会很难找到一个不返回第一个的司机。

如果您想确保获得第一个,请使用:

( $dbh->selectrow_array( $query ) )[0]
于 2012-11-23T17:08:43.667 回答