1

我想使用两次查询的结果。
如何重新定位指针以第二次从头开始读取结果?
下面的示例(为简单起见仅打印到屏幕上):

if ( $dbh = DBI->connect( "DBI:mysql:database=tng;host=ip", "username", "password" ) ) {
    $strSQL = "select * from table";
    if ( $strQuery = $dbh->prepare($strSQL) ) {
        if ( $strQuery->execute() ) {
            while ( @data = $strQuery->fetchrow_array() ) {
                print $data[0];
            }
            --reposition to top and reread the query result and do something else with the data-- $strQuery->finish;
        }
        else {
            $strMsg = "$strDateTime ERROR -- unable to execute statement: " . $strQuery->errstr . "\n";
            print logFile "$strMsg";
        }
    }
    else {
        $strMsg = "$strDateTime ERROR -- unable to prepare statement: " . $dbh->errstr . "\n";
        print logFile "$strMsg";
    }
    $dbh->disconnect();
}
else {
    print logFile "$strDateTime ERROR -- unable to connect to iptables database ... " . DBI->errstr . " \n";
}
4

2 回答 2

5

您不会期望 IO 库将整个文件加载到内存中以逐行读取,那么您为什么期望它来自数据库库呢?

此外,这完全没有必要。加载完整的结果非常容易。

my $sth = $dbh->prepare($sql);
my $data = $dbh->selectall_arrayref($sth);

for my $row (@$data) {
    my ($col1, $col2, ...) = @$row;
    ...
}

for my $row (@$data) {
    my ($col1, $col2, ...) = @$row;
    ...
}

如果您需要 DBI 某事,您可以将数据加载到DBD::Sponge中。

于 2012-04-17T23:04:35.417 回答
1

我正要说你不能这样做,但看起来你可以,你只需要execute再次声明句柄。请注意,此代码使用 PostgreSQL,因为我使用它(并且手边没有安装 MySQL),但它也应该对您有用。

use strict;
use warnings;
use DBI;
my $dbh=DBI->connect("dbi:Pg:dbname=db;host=hosty-host-host","username","password")
  or die DBI->errstr;

my $sth=$dbh->prepare("select generate_series(1,5)") or die $dbh->errstr;
$sth->execute or die $dbh->errstr;

while(my @row=$sth->fetchrow_array)
{
  print "$row[0]\n";
}

print "\nSecond verse, same as the first!\n\n";
$sth->execute or die $dbh->errstr;

while(my @row=$sth->fetchrow_array)
{
  print "$row[0]\n";
}

$sth->finish;
$dbh->disconnect;

输出是:

1
2
3
4
5

Second verse, same as the first!

1
2
3
4
5

顺便说一句,我建议通过查看err和/或errstr而不是使用一堆 if-else 语句来检查错误。

编辑添加: 如果您不想execute再次处理语句(并从数据库中重新读取信息),您可能会遇到 a) 将数据存储在 (Perl) 数据结构中或 b) 将其写入文件然后从文件中读取它(并seek根据需要多次使用文件句柄)。

于 2012-04-17T22:02:34.910 回答