如何强制selectrow_array返回错误的值?

时间:2012-11-23 14:55:40

标签: perl dbi

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

  

如果在标量上下文中调用具有更多的语句句柄   比一列,未定义驱动程序是否将返回   第一列或最后一列的值。所以不要这样做。另外,在   标量上下文,如果没有更多行或if,则返回“undef”   发生错误。那个“undef”无法与“undef”区别开来   返回,因为第一个字段值为NULL。由于这些原因   如果你在a中使用“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

2 个答案:

答案 0 :(得分:3)

文档的含义是“未定义驱动程序是否返回第一列或最后一列的值”是返回的列是由数据库驱动程序定义的,而不是DBI

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

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

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

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

答案 1 :(得分:3)

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

wantarray ? @row : $row[0]

VS

wantarray ? @row : $row[-1]

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

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

( $dbh->selectrow_array( $query ) )[0]