如何在Perl的DBI模块中使用数组中的参数选择多行?

时间:2009-11-20 17:33:32

标签: perl dbi

我需要提取与列name对应的行。被拉出的行对应于数组@values中的地址。以下是我的代码:

use strict;
use DBI;

open (FH, "/user/address") or die $!;
my@values=<FH>;
close(FH);
my @names;

my $query = "Select name from table where address = ?";
my $sth = $dbh->prepare( $query ) or die "could not prepare statement\n", $dbh->errstr;
foreach my $value(@values){ #@values contain list of address
        $sth->execute($value) or die "could not execute statement $query\n", $sth->errstr;
        while ($result = $sth->fetchrow_hashref()){
               my $name_reqd = $result->{name};
               print "Name Req: $name_reqd\n"; #not printing anything 
               push (@names, $name_reqd);
        }
}
print "@names\n"; #not printing anything

但是当我打印@names时,我没有得到任何输出,我不确定出了什么问题。

6 个答案:

答案 0 :(得分:4)

我看到了一些事情:

  • 您在使用它之前没有声明@names,这意味着它在第一次使用的范围内被自动声明:在while循环中。此外,在循环的每次迭代中销毁并创建新副本,然后在调用print时创建新的(空)副本。添加use warnings;会抓住这个。
  • (正如小圈子和其他人所说)你可能无法正确地从$result访问数据。尝试在while循环的第一行添加use Data::Dumper; print Dumper($result);以查看您已阅读的数据。
  • 我不确定您在/usr/address中使用的格式,但如果它有多行,则只能读取该文件的第一行。您可以通过首先本地化$/来一次性阅读整个文件(请参阅perldoc perlvar)。此外(正如Ivan所说),这个字符串最后仍会有一个换行符:使用chomp去除它(也许在分成行之后,如果你多了一个)。请参阅perldoc -f chompperldoc -f split

在这些点之间,您应该打印足够的调试数据,以便轻松查看出错的地方。

答案 1 :(得分:3)

此代码的问题是文件读取。代码my @values=<FH>;在末尾读取所有带有换行符号(\n)的行。在这种情况下应该手动删除它。您可以使用chomp函数

来完成此操作
open (FH, "/user/address") or die $!;
my @values = <FH>;
chomp(@values);
close(FH);

<强>更新 我认为它没有搜索任何东西,因为它找不到。地址通常包含空格。查询Select name from table where address = ?将只找到完全相同的地址(字母大小写是唯一被忽略的内容)。例如,“a”在sql中不等于“a”。

答案 2 :(得分:2)

未经测试,但您不应该像这样访问您的字段。

my $name_reqd = $result[0];

这是因为你正在使用fetchrow_array()。

答案 3 :(得分:2)

您应确保数据库驱动程序为returning column names in lower case。另外,对此类查询使用selectcol_arrayref

use strict;
use warnings;

use DBI;
use File::Slurp;

my @values = read_file '/user/address';
chomp @values;

my $dbh = DBI->connect(
    # appropriate parameters
);

my $sth = $dbh->prepare(
    'SELECT name FROM table WHERE address = ?'
) or die sprintf 'Cannot prepare: %s', $dbh->errstr;

my @names;

for my $value ( @values ) {
    my $names = $dbh->selectcol_arrayref(
        $sth,  {},  $value
    ) or die sprintf 'Cannot select col: %s',  $dbh->errstr;

    push @names,  @$names;
    print "'$_'\n" for @$names;
);

print "@names\n";

答案 4 :(得分:1)

在致电print keys %$result后,您$sth->fetchrow_hashref看到了什么?

答案 5 :(得分:0)

你的桌子真的被称为“桌子”吗?也许它应该是$table$table设置为表的实际名称。

如果可以,例如SQLite或MySQL,请尝试从数据库命令行运行查询。