0

问题:

我正在使用DBIPerl,并且需要对我的记录集中的记录进行双重嵌套循环。

过去,我使用过 while 语句,例如:

my $someQuery = "SELECT * FROM foo;";
my $sth = $dbh->prepare($someQuery);
$sth->execute();
while (my $ref = $sth->fetchrow_hashref()) {
    my $someVariable = "$ref->{'dbFieldName'}";
    # do stuff
}

我试图实现的目标很容易用 afor loop而不是 a 来实现while loop,但我需要知道如何通过行索引和总行数来引用结果。关于如何做到这一点的任何想法?

奖励积分:

以上将帮助我解决一个问题,但我想获得更好的技术让我自己解决。我在 Eclipse 中使用 Perl EPIC,它没有提供任何类型的上下文前瞻/自动完成(或者如果它提供,我不知道如何启用它)。有没有办法为 Eclipse 启用这个或不同的附加组件,它会显示上下文预测,所以我可以看到哪些选项可用?

4

2 回答 2

1

当前行号

有几种方法可以获得行号:

Perl 变量

my $row_num = 0;

while (my $row = $sth->fetchrow_hashref) {
    $row_num++;

    # Do stuff
}

SQL 变量

这取决于您使用的 DBMS,但您可以在 MySQL 中执行以下操作:

$dbh->do('SET @row_num := 0');

my $statement = <<'SQL';
    SELECT @row_num := @row_num + 1 AS row_num,
           foo,
           bar
    FROM table
SQL

my $sth = $dbh->prepare($statement);
$sth->execute;

while (my $row = $sth->fetchrow_hashref) {
    say $row->{row_num};

    # Do stuff
}

返回的总行数

您可以使用$sth->rows, 并注意以下事项:

通常,您只能在非SELECT execute(对于某些特定操作,如UPDATEand DELETE)之后或在获取SELECT语句的所有行之后依赖行计数。

对于SELECT语句,通常不可能知道将返回多少行,除非全部获取它们。一些驱动程序将返回应用程序到目前为止已获取的行数,但其他驱动程序可能会返回 -1,直到所有行都已获取。所以不推荐使用 rows 方法或$DBI::rowswith语句。SELECT

获取 a 的行数的另一种方法SELECT是使用与查询相同的“...”执行"SELECT COUNT(*) FROM ..."SQL 语句,然后从中获取行数。

但是,如果您在获取数据时已经在计算每一行,则可以简单地使用它。

于 2015-01-16T19:11:40.060 回答
0

下面是我为将结果转换为数组结构所做的hack,这将使我能够轻松地进行嵌套循环。如果他们有更好的方法,希望其他人会发布答案。

my @results;        
my $fieldFirstName = 0;
my $fieldLastName = 1;      
my $fieldAddress = 2;
my $i = 0;

my $someQuery = "SELECT FirstName, LastName, Address FROM foo;";
my $sth = $dbh->prepare($someQuery);
$sth->execute();
while (my $ref = $sth->fetchrow_hashref()) {
    $results[$i][$fieldFirstName] = "$ref->{'FirstName'}";
    $results[$i][$fieldLastName] = "$ref->{'LastName'}";
    $results[$i][$fieldAddress] = "$ref->{'Address'}";
    $i++;
}
$sth->finish();
my $resultsRecordCount = @results;
于 2015-01-16T19:14:59.557 回答