Perl DBI - 在查询时下载哈希格式字符串

时间:2014-08-05 22:51:54

标签: perl dbi

我有一个使用自定义模块EVTConf的脚本,它只是DBI的包装器。 它具有硬编码的用户名和密码,因此我们不必在每个脚本中都写入用户名和密码。

我希望看到查询提取的数据 - 但它似乎没有从查询中获取任何内容 - 只是bless语句。

什么是bless

#!/sbcimp/dyn/data/scripts/perl/bin/perl

use EVTConf;

EVTConf::makeDBConnection(production);
$dbh = $EVTConf::dbh;

use Data::Dumper;

my %extend_hash = %{@_[0]};

my $query = "select level_id, e_risk_symbol, e_exch_dest, penny, specialist from etds_extend";

if (!$dbh) {
    print "Error connecting to DataBase; $DBI::errstr\n";
}

my $cur_msg = $dbh->prepare($query) or die "\n\nCould not prepare statement: ".$dbh->errstr;
$cur_msg->execute();
$cur_msg->fetchrow_array;

print Dumper($cur_msg) ;

这就是我得到的:

Foohost:~/walt $
Foohost:~/walt $ ./Test_extend_download_parse_the_object
$VAR1 = bless( {}, 'DBI::st' );

1 个答案:

答案 0 :(得分:2)

$cur_msg是一个语句句柄(因此它被保存到类DBI::st中)。你需要这样的东西:

my $cur_msg = $dbh->prepare($query) or die "…";
$cur_msg->execute();

my @row;
while (@row = $cur_msg->fetchrow_array)
{
    print "@row\n";
    # print Dumper(\@row);
}

只有你需要比实际打印数据更加小心。还有许多其他提取方法,例如fetchrow_arrayreffetchrow_hashreffetchall_arrayref。所有详细信息均可通过命令行中的perldoc DBI或CPAN上的DBI页面获取。

您可以使用bless(或转到bless)查看官方文档中有关perldoc -f bless的说明。它是一种将变量与类相关联的方法,本例中的类是DBI::st,即DBI语句句柄类。例如,您$dbh将在班级DBI::db中。


  

打印结果的最佳方法是什么?

打印出来的最佳方式取决于您对结果集的了解。

您可以选择:

printf "%-12s  %6.2f\n", $row[0], $row[3];

如果你知道你只有两个领域感兴趣(虽然你为什么不选择你感兴趣的两个领域 - 如果它们需要花费时间(一点时间)来处理元素1和2 “没用了。”

您可以选择:

foreach my $val (@row) { print "$val\n"; }

您可以选择:

for (my $i = 0; $i < scalar(@row); $i++)
{
    printf "%-12s  = %s\n", $cur_msg->{NAME}[$i], $row[$i];
}

打印出列名和值。还有许多其他的可能性,但那些涵盖了关键的可能性。


正如Borodincomment所述,您应该在Perl代码中自动反复使用use strict;use warnings;。有一个变量在您显示的代码中没有严格处理,即$dbh。 '很容易得到补救;在my之前添加{{1}}。但确保您始终使用它们是个好主意。使用它们可以让您避免意外的行为,而这些行为是您不知道并且不打算利用的。